Dans cet article je vais vous présenter comment réaliser des transactions entre deux comptes créés sur le même réseau privé et je vous présenterais comment miner.
1ère étape: relancer notre réseau !
Pour cela, on continue avec la deuxième étape de la documentation, qui nous explique comment récupérer de l’Ether !
Il est important de noter qu’à chaque fois que nous souhaitons tester et travailler sur Ethereum, il faut redémarrer le serveur en exécutant la commande:
geth --networkid 12345 --genesis ~/blockchain/genesis_block.json --datadir ~/.ethereum_experiment console
2ème étape: réalisation d’une transaction
En suivant la documentation, j’ai testé quelques commandes de ce type là, pour envoyer une transaction simple:
var sender = eth.accounts[0]; var recipient = eth.accounts[1]; var amount = web3.toWei(0.01, "ether"); eth.sendTransaction({from: sender, to: recipient, value: amount})
Première erreur sur la transaction:
Transaction exceed gas limit
Après une journée de Workshop lors de laquelle j’ai essayé de faire tourner la version officielle d’Ethereum sur la blockchain publique (avec des résultats mitigés), je tente une bidouille dans le fichier genesis_block.json. Je remplace:
"gasLimit": "0x1329"
Par
"gasLimit": "0x132938209238308209320382393820832094794627692836"
Je relance le serveur, puis la transaction, et miracle, ça fonctionne ! L’output de la console ressemble à ça:
I0214 11:37:44.819959 3589 xeth.go:1028] Tx(0x2d30c105ae4cfc70d6cf362cc50f18929367973cc0d44c2d878a738580c8dd60) to: 0x191e265ae0814b7e23e666221a8f628250a50027 "0x2d30c105ae4cfc70d6cf362cc50f18929367973cc0d44c2d878a738580c8dd60"
Pour valider, vérifions les balances des 2 users concernés par la transaction:
> eth.getBalance(recipient); > 0 > eth.getBalance(sender); > 5e+71
Arf, il semble que les montants n’aient pas évolués… Logique, personne ne valide les transactions (pas de mineur…). Je lance donc le minage :
3ème étape: le minage
miner.start();
Output :
I0214 12:13:13.307293 3589 backend.go:584] Automatic pregeneration of ethash DAG ON (ethash dir: /home/balessan/.ethash) I0214 12:13:13.307338 3589 backend.go:591] checking DAG (ethash dir: /home/balessan/.ethash) true > I0214 12:13:13.307462 3589 miner.go:119] Starting mining operation (CPU=4 TOT=5) I0214 12:13:13.308327 3589 worker.go:570] commit new work on block 1 with 2 txs & 0 uncles. Took 833.249µs I0214 12:13:13.308489 3589 ethash.go:220] Generating DAG for epoch 0 (size 1073739904) (0000000000000000000000000000000000000000000000000000000000000000) I0214 12:13:14.406107 3589 ethash.go:237] Done generating DAG for epoch 0, it took 1.097616396s
Ca semble pas mal, les transactions ont été processés d’après le message. Mais la vérification des balances n’annonce toujours rien de différent…
Après quelques recherches, j’ai compris. Le message précédent indique que le travail sur la validation du block numéro 1 contenant 2 transactions et 0 oncles a été enclenché, mais pas terminé. Donc le bloc n’a pas été créé, et les transactions pas validées. Pour cela, j’ai adapté le fichier genesis_block.json (en le simplifiant) que j’utilise pour rendre plus facile la génération de blocks. Le fichier ressemble donc maintenant à ça :
{ "nonce": "0x0000000000000042", "difficulty": "0xb", "alloc": { "af51314e6a721f234e132428745e0cb99a43faa2": { "balance": "500000000000000000000000000000000000000000000000000000000000000000000000" } }, "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x132938209238308209320382393820832094794627692836" }
La valeur que j’ai modifiée est la valeur de difficulty, qui était précédemment setté à :
"difficulty": "0x4000000000000000000",
Soit une valeur beaucoup trop haute pour que ma machine soit efficace sur ce traitement. Une fois le réseau de test relancé avec cette valeur ajustée, si je relance ma demande de transaction:
var sender = eth.accounts[0]; var recipient = eth.accounts[1]; var amount = web3.toWei(20, "ether") eth.sendTransaction({from: sender, to: recipient, value: amount});
Puis je lance le minage :
miner.start()
Et là, miracle :
I0214 12:49:48.420331 4552 worker.go:349] Mined block (#68 / 15f4c63e). Wait 5 blocks for confirmation I0214 12:49:48.420750 4552 worker.go:570] commit new work on block 69 with 0 txs & 0 uncles. Took 372.014µs I0214 12:49:48.420785 4552 worker.go:448] ?? Mined 5 blocks back: block #63 I0214 12:49:48.638256 4552 worker.go:570] commit new work on block 69 with 0 txs & 0 uncles. Took 21.168595ms I0214 12:49:48.867843 4552 worker.go:349] Mined block (#69 / d0e78681). Wait 5 blocks for confirmation I0214 12:49:48.868413 4552 worker.go:570] commit new work on block 70 with 0 txs & 0 uncles. Took 419.321µs I0214 12:49:48.868518 4552 worker.go:448] ?? Mined 5 blocks back: block #64 I0214 12:49:48.870588 4552 worker.go:570] commit new work on block 70 with 0 txs & 0 uncles. Took 305.637µs I0214 12:49:48.914028 4552 worker.go:349] Mined block (#70 / 4d655a6e). Wait 5 blocks for confirmation I0214 12:49:48.915259 4552 worker.go:570] commit new work on block 71 with 0 txs & 0 uncles. Took 400.87µs I0214 12:49:48.915304 4552 worker.go:448] ?? Mined 5 blocks back: block #65
Les validations de blocks (la plupart vides) commencent à pleuvoir. Pour valider, je stoppe le minage miner.stop()
, puis je valide que la transaction s’est bien passée:
> eth.getBalance(recipient); > 20000000000000000000 > eth.getBalance(eth.coinbase); > 5.0000000000000000000000000000000000000000000000000083e+71
Wouhouuuuuuu, on peut voir que la transaction est bien passée ! C’est le début d’un long chemin de découvertes et d’imprégnation de la philosophie de cet outil prometteur !
Conclusion
Dans cet article nous avons vu comment réaliser les premières transactions, simple transfert d’ether d’un compte vers un autre, et comment les valider via le minage. C’est la base de tout les systèmes Blockchain, il est donc important de comprendre l’enchaînement logique de ces étapes 😉