X

Ethereum – Les premières transactions

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 😉

Retour à l’accueil de la série

balessan: