Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

Exposé technique « Développer un contrat/programme sur Ethereum »

Première rédaction de cet article le 4 juillet 2016
Dernière mise à jour le 6 juillet 2016


Le 2 juillet, au festival Pas Sage en Seine / Hacker Space Festival, j'ai eu le plaisir de faire un exposé sur la chaîne de blocs Ethereum, plus précisement sur l'écriture de programmes (on dit parfois contrats) Ethereum. Cet exposé s'adresse donc surtout aux programmeurs.

Voici les supports de l'exposé :

Il y aussi la vidéo en ligne.

Les deux contrats présentés à Pas Sage En Seine, Soleau et FindByHash, ont été installés sur la chaîne de blocs. Sur la chaîne de tests « Morden », Soleau est installé en 0x165180498e843c5119d7d57b866da1392b8e8185 et FindByHash en 0x78db9a1dfe1b46c4361ac91cda111f5366ddc0e5.

Sur la « vraie » chaîne, Soleau est en 0x39aa4006ee5941c0c0e41b924fdafcb2c4c918e8 et FindByHash en 0x9b6e416ea0d89a09b4ae036a774b1d31825252f8. Si vous voulez interagir avec ces contrats, voici l'ABI de Soleau :

[{"constant":true,"inputs":[{"name":"hash","type":"string"}],"name":"get","outputs":[{"name":"success","type":"bool"},{"name":"theBlock","type":"uint256"},{"name":"theTime","type":"uint256"},{"name":"holder","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"hash","type":"string"}],"name":"record","outputs":[{"name":"success","type":"bool"},{"name":"already","type":"bool"},{"name":"theBlock","type":"uint256"}],"type":"function"}]  

Et celle de FindByHash :

[{"constant":true,"inputs":[{"name":"key","type":"string"},{"name":"index","type":"uint256"}],"name":"get","outputs":[{"name":"","type":"bool"},{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[{"name":"key","type":"string"}],"name":"num_of","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"key","type":"string"},{"name":"value","type":"string"}],"name":"set","outputs":[{"name":"","type":"bool"}],"type":"function"},{"inputs":[],"type":"constructor"}]

Ça s'utilise comment ? Prenons l'exemple de Soleau sur la chaîne de test. Si on utilise le logiciel geth, avec sa console JavaScript, on déclare le contrat et on indique l'adresse :

soleauC = eth.contract([{"constant":true,"inputs":[{"name":"hash","type":"string"}],"name":"get","outputs":[{"name":"success","type":"bool"},{"name":"theBlock","type":"uint256"},{"name":"theTime","type":"uint256"},{"name":"holder","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"hash","type":"string"}],"name":"record","outputs":[{"name":"success","type":"bool"},{"name":"already","type":"bool"},{"name":"theBlock","type":"uint256"}],"type":"function"}])

soleau = soleauC.at("0x165180498e843c5119d7d57b866da1392b8e8185")  

Une fois que c'est fait, on peut appeler l'ABI du contrat. Ici, on demande si un condensat est bien stocké dans la chaîne :

> soleau.get("98461ec184a39f0b8d89401a2756ffc84c2473a772655b425d794db6e7b68a8a")
[true, 1211232, 1467041583, "0xaf8e19438e05c68cbdafe33ff15a439ce6742972"]
> soleau.get("666")
[false, 0, 0, "0x0000000000000000000000000000000000000000"]

Sur la chaîne principale, le même contrat a une valeur 5e1e7a61931acb3f0e2bb80fc1d88e242d8556e6 stockée :

> soleau.get("5e1e7a61931acb3f0e2bb80fc1d88e242d8556e6")
[true, 1830809, 1467745954, "0xc90cd1fa9940a4d4a07a37c53bb4f423fd286945"]

On peut aussi ajouter des valeurs (ici, sur la chaîne de test). Comme cela change l'état de la chaîne, il faut faire une transaction, et payer, à la fois l'essence (ici, 400000 unités mais moins de 100000 seront effectivement utilisées) et le prix prévu dans le contrat :

> soleau.record.sendTransaction("d479b91d7a2cdd21f605c5632344228dd5f75d66", {from: eth.accounts[0], gas: 400000, value: web3.toWei(0.001)})
"0xfb6bc725e303c79c2c5426c3a0d4fce90b635521826e5bd3e94ddfa3d80c48da"

Le résultat est l'identificateur de la transaction, que vous pouvez regarder en ligne (avec le bouton Convert to ASCII, vous verrez le condensat enregistré, dans les données de la transaction). Sur la chaîne principale, un exemple de transaction de ce contrat est disponible ici. Pour le contrat FindByHash, si vous voulez regarder des valeurs enregistrées, il y a cf4163b8f4c13b915e246ea7d2792156 sur la chaîne de tests et 3d10dcb5e503d3b8abc2fa5a72adb0a503930e0b6b8a893f17dda63b9b717dba sur la chaîne principale :

> findhash.num_of("cf4163b8f4c13b915e246ea7d2792156")
2
> findhash.get("cf4163b8f4c13b915e246ea7d2792156", 0)
[true, "https://localhost/"]
> findhash.get("cf4163b8f4c13b915e246ea7d2792156", 1)
[true, "https://www.bortzmeyer.org/toto"]

Pour enregistrer des URL dans ce contrat, le plus simple est ce petit script shell, qui s'utilise ainsi :

% findbyhash-register-url.sh http://www.bortzmeyer.org/pas-sage-en-seine-ethereum.html
...
"0x82a808828a115547b242f335783bf75a0c96d2d746ab9dff160898a8f28a5411"
3d10dcb5e503d3b8abc2fa5a72adb0a503930e0b6b8a893f17dda63b9b717dba registered for http://www.bortzmeyer.org/pas-sage-en-seine-ethereum.html

(Et vous pouvez voir la transaction en ligne.)

Si le sujet vous intéresse, j'en parlais plus longuement à la Journée du Conseil Scientifique de l'AFNIC le 11 juillet (avec d'autres exemples de code, rassurez-vous).

Il y avait plein d'autres trucs géniaux à PSESHSF, n'hésitez pas à regarder le programme. Mes préférés (c'est complètement subjectif), faire son pain soi-même (et avec du levain), les explications (avec démo de diffuseur d'odeurs et bonbons qui sentent bon) sur le marketing sensoriel, le projet pour un camp de hackers en été en France, la conférence sur l'éducation au numérique (qui ne sortira sans doute pas en vidéo, l'auteur étant mineur), même si sa seconde partie, sur l'éducation au business a suscité (à juste titre), des réactions houleuses, la reprise de contrôle de l'alimentation, le système d'exploitation Qubes (j'avais parlé de ce système sur ce blog mais sans le tester), la bière libre (j'ai goûté ; un peu forte), l'appel aux citoyens à participer à la science, la synthèse du récent virage de la Quadrature du Net, le bilan de la loi Renseignement, etc.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)