[WIP] Ethereum Oracle for Duniter blockchain


#1

Coucou,

Je suis en train de créer des Dapp pour Ethereum qui vont chercher des informations sur la Blockchain Duniter(des oracles en somme) dans le but de pouvoir utiliser les smart contrats en même temps que le système d’identité de la Wot ou pour automatiser de façon décentralisé des mécaniques avec la monnaie libre.

L’avantage que j’y vois, c’est que le protocole monétaire est indépendant de la plateforme de smart contrat, cela permet de payer des fee en MNL seulement pour le fonctionnement des institutions décentralisés par exemple et non pour l’utilisation de la monnaie. Il est possible aussi de créer un pot commun de donation en MNL (Ether en l’occurence) pour ces mécaniques là.

C’est du gros WIP car je me sert de ce projet aussi pour améliorer mes competences en nodeJS, smart contrat et bien sûr pour améliorer mes connaissances du protocole Duniter.

Pour l’instant, j’ai implémenté deux oracles, j’ai choisi ces deux là car c’était le meilleur rapport simplicité/utilité :
Un tracker qui tout les deux mois(faut pas que ça coute cher) va vérifier le membership d’une clef publique Duniter
=> Vérifier l’accès à un service décentralisé basé sur l’identité Duniter

Un linker qui en suivant une procédure simple permet de prouver le lien entre une clef publique Ethereum et une clef publique Duniter en utilisant les commentaires des transactions Duniter
=> Permettre d’utiliser l’adresse Ethereum pour utiliser ses protocoles conjointement avec la Blockchain Duniter

Pour l’instant, j’ai utilisé l’api HTTP de Duniter comme source d’information, je vais chercher ça sur https://g1.duniter.fr/ sans instancier en local de noeud Duniter, Oraclize me permet ensuite de faire les vérifications cryptographiques. C’est le premier niveau, par la suite je compte faire une procédure pour faire écrire des transactions dans la blockain Duniter voir gérer des cotisations de façon décentralisé etc. J’aurais sans doutes besoin à un moment de faire du calcul off-chain et de faire tourner un noeud Duniter en local… j’aurais sans doutes besoin d’aide en nodeJS (je débute) à ce moment là

Je viens vous en parler, pour savoir si vous avez d’autres idées/critiques ou si des gens veulent participer au dev ! :slight_smile:

J’écris actuellement les tests unitaires en nodeJS, histoire de valider le fonctionnement puis si ça intéresse des gens je mettrais le smart contrat du Linker sur le mainnet et mettrais la Dapp en ligne, j’aurais besoin d’un peu d’aide pour la partie web à ce moment là.

Le tracker : https://github.com/YoanSallami/duniter_ethereum_oracle/blob/master/contracts/oracles/MembershipTracker.sol
Le linker : https://github.com/YoanSallami/duniter_ethereum_oracle/blob/master/contracts/oracles/AccountLinker.sol

Prochaine étape ? Utiliser ces deux oracles pour créer un autre linker qui suit en même temps les identités Duniter.
Et ensuite ? Vérifier la réception d’une cotisation, permettre d’envoyer une transaction Duniter depuis un smart contrat, vérifier la balance d’un compte Duniter, faire un système de vote par délégation pour les membres de la WoT etc. on verra en fonction de ce qui est utile/faisable

Je ferais un tuto détaillé de la procédure pour lier les comptes lorsque j’aurais passé les tests unitaires :slight_smile:


#2

C’est assez intéressant.

Vu que je n’ai jamais dev de smart contracts sur Ethereum, comment est géré l’oracle ? Qui participe à “l’insertion de donnée exterieure” dans la blockchain Ethereum ? Quels sont les poids de leurs votes ?


#3

Pour l’oracle, j’utilise Oraclize http://docs.oraclize.it/#home pour garantir que les données viennent bien de l’adresse URL passé en paramètres dans la requête, c’est un service payant, transparent et audité. J’avais commencé à créer l’oracle de toutes pièce avec le système de vote etc… mais refaire la roue c’est pas très bon pour garantir une sécurité optimale et oraclize est moins cher à utiliser qu’un systeme de vote car c’est juste une vérification de preuve. Tu peux t’amuser à tester des requêtes ici : http://app.oraclize.it/home/test_query il ya moyen de parser du json en faisant json(ton url).ta.structure (la recette est ici https://github.com/duniter/duniter/blob/master/doc/HTTP_API.md). par exemple : https://g1.duniter.fr/blockchain/parameters/ ou json(https://g1.duniter.fr/blockchain/parameters/).c


#4

Du coup c’est une requête sur une page web, et chaque membre d’Oraclize va y accéder et voter l’inclusion de son contenu dans la blockchain ? Vu que c’est une page dynamique, il n’y a pas un risque que les différents membres obtiennent 2 versions différentes si la requête est faite en même temps que la réception d’un bloc par le nœud concerné ?

Aussi, tu effectue la requête sur un nœud précis, ce qui pose un problème de centralisation. Si le nœud g1.duniter.fr est inaccessible ou retourne de fausses informations, que se passe-t-il ?

Dans le modèle que je développe pour fygg (mon projet de machine virtuelle décentralisée, similaire à Ethereum mais différent dans son fonctionnement et son but) se base sur un système de votes d’utilisateurs qui sont inclus dans les ensembles d’utilisateurs des 2 systèmes (ici Ethereum et Duniter). Les utilisateurs d’Ethereum et Duniter votent pour donner leur “vérité” (sans faire confiance à un autre noeud, ils utilisent leurs propre noeud) sur l’état actuel de Duniter dans Ethereum (avec un système de mise en jeu pour inciter à la coopération).


#5

Cela depend de ce que l’on cherche, dans les info que j’ai pris pour les deux oracles il y a pas de soucis car on va chercher une transaction à un indice(qui est vérifié en aval), puis il est très facile pour les données sensibles d’utiliser un système de vote simple, ou de l’inférence bayesienne en faisant plusieurs observations au cours du temps, il est aussi possible de recommencer si ça n’a pas marché

Il est possible là aussi de multiplier les sources, faire un tirage aléatoire pour la choisir etc, mais ça fait augmenter le prix du protocole, sachant qu’a terme, il faudrait faire tourner son propre noeud en local pour garantir le contrôle sur les données si c’est pour le fonctionnement d’une caisse de cotisation par exemple.

Ton projet est intéressant et me fait beaucoup penser à Augur, sauf que là c’est pas juste un smart contrat si j’ai bien compris. J’ai utilisé Oraclize pour le rapport sécurité/facilité d’implementation et openzepellin lorsque j’ai besoin de fonctions basiques de smart contrat, là encore j’utilise que des outils audités et qui font référence dans le domaine pour pas faire de bêtises niveau sécurité, étant donné que c’est pas mon domaine à la base :slight_smile:


#6

Pour le système d’oracle Augur à bien été ma première inspiration :stuck_out_tongue: Ca serait un smart-contract de fygg (qui permet de faire beaucoup plus de choses que ceux d’Ethereum, mais avec des paradigmes différents).

Il faudrait que je regarde plus en détails ton code et le fonctionnement d’Oraclize pour te donner un meilleurs avis de ton projet :slight_smile:


#7

C’est un projet à long terme, et je compte améliorer pas à pas le niveau de sécurité général :slight_smile: Je test tout ça avec un noeud Ethereum de test local grace à truffle, et j’améliorerais le protocole au fur et à mesure ! Mais avant ça… GOGO les test unitaires

Plus d’info sur Oraclize : https://docs.oraclize.it/#data-sources


#8

Très intéressant @yohyoh !

Je bosse justement sur un “smartbridge” Duniter/Ark/IPFS.

C’est encore au stade conceptuel de mon côté.
L’idée étant de faire une petite preuve de concept d’une API JS pour s’authentifier avec le Salt et la clé privé Duniter, en signant le document local et l’envoyer en blockchain ğ1. Dans un premier temps je vais m’entrainer à le faire de manière centralisé sur un noeud, mais à terme j’aimerais chiffrer des données (des musiques mp3 ou tout autre) distribués par réseau IPFS, de manière à dire par exemple: “Tous les membres de la WoT ğ1 peuvent accéder à ces musiques en streaming et en téléchargement”.

C’est un POC, mais si j’arrive à faire ça (et j’ai du boulo pour déjà y arriver ^^), et permettre également une auth sur la blockchain Ark, et bah on peut envisager de de créer à la volé des side-chain Ark interconnectés à la ğ1 et qui encrypt des données distribués en IPFS, pour un service Tiers.

J’en ai déjà touché 2 mots à @elois, mais j’aurais besoin d’aide pour récupérer l’algorithme de clés asymétriques Ed25519 utilisé par Duniter, bien comprendre le workflow ect …

Je vais en tout cas suivre ce que tu fait de prêt @yohyoh car je pense que ya des choses en communs :slight_smile:


#9

J’ai isolé ça dans Gsper pour en facilité la maintenance/évolution.
Lignes 4 à 30 ici : https://git.duniter.org/tools/gsper/blob/master/public/crypto.js#L4
Ou si tu préfère te référé aux test unitaires : https://git.duniter.org/tools/gsper/blob/master/public/crypto.test.js
Et le message qui m’a permi d’y voir plus clair dans le processus est celui-là : Gsper arriver à coder Gsper