{"id":387,"date":"2016-03-11T18:00:49","date_gmt":"2016-03-11T17:00:49","guid":{"rendered":"http:\/\/benoit-alessandroni.fr\/?p=387"},"modified":"2016-03-12T18:02:20","modified_gmt":"2016-03-12T17:02:20","slug":"ethereum-partie-2","status":"publish","type":"post","link":"https:\/\/www.balessan.me\/technique\/blockchain\/ethereum-partie-2\/","title":{"rendered":"Ethereum &#8211; Les premi\u00e8res transactions"},"content":{"rendered":"<p>Dans cet article je vais vous pr\u00e9senter comment r\u00e9aliser des transactions entre deux comptes cr\u00e9\u00e9s sur le m\u00eame r\u00e9seau priv\u00e9 et je vous pr\u00e9senterais comment miner.<!--more--><\/p>\n<h2>1\u00e8re \u00e9tape: relancer notre r\u00e9seau !<\/h2>\n<p>Pour cela, on continue avec la deuxi\u00e8me \u00e9tape de la documentation, qui nous explique comment r\u00e9cup\u00e9rer de l&#8217;Ether !<br \/>\nIl est important de noter qu&#8217;\u00e0 chaque fois que nous souhaitons tester et travailler sur Ethereum, il faut red\u00e9marrer le serveur en ex\u00e9cutant la commande:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">geth --networkid 12345 --genesis ~\/blockchain\/genesis_block.json --datadir ~\/.ethereum_experiment console<\/pre>\n<h2>2\u00e8me \u00e9tape: r\u00e9alisation d&#8217;une transaction<\/h2>\n<p>En suivant la documentation, j&#8217;ai test\u00e9 quelques commandes de ce type l\u00e0, pour envoyer une transaction\u00a0 simple:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">var sender = eth.accounts[0];\r\nvar recipient = eth.accounts[1];\r\nvar amount = web3.toWei(0.01, \"ether\");\r\neth.sendTransaction({from: sender, to: recipient, value: amount})<\/pre>\n<p>Premi\u00e8re erreur sur la transaction:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">Transaction exceed gas limit<\/pre>\n<p>Apr\u00e8s une journ\u00e9e de Workshop lors de laquelle j&#8217;ai essay\u00e9 de faire tourner la version officielle d&#8217;Ethereum sur la blockchain publique (avec des r\u00e9sultats mitig\u00e9s), je tente une bidouille dans le fichier <em>genesis_block.json<\/em>. Je remplace:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\"gasLimit\": \"0x1329\"<\/pre>\n<p>Par<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\"gasLimit\": \"0x132938209238308209320382393820832094794627692836\"<\/pre>\n<p>Je relance le serveur, puis la transaction, et miracle, \u00e7a fonctionne ! L&#8217;output de la console ressemble \u00e0 \u00e7a:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">I0214 11:37:44.819959    3589 xeth.go:1028] Tx(0x2d30c105ae4cfc70d6cf362cc50f18929367973cc0d44c2d878a738580c8dd60) to: 0x191e265ae0814b7e23e666221a8f628250a50027\r\n\"0x2d30c105ae4cfc70d6cf362cc50f18929367973cc0d44c2d878a738580c8dd60\"<\/pre>\n<p>Pour valider, v\u00e9rifions les balances des 2 users concern\u00e9s par la transaction:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">&gt; eth.getBalance(recipient);\r\n&gt;\u00a00\r\n&gt;\u00a0eth.getBalance(sender);\r\n&gt;\u00a05e+71<\/pre>\n<p>Arf, il semble que les montants n&#8217;aient pas \u00e9volu\u00e9s&#8230; Logique, personne ne valide les transactions (pas de mineur&#8230;). Je lance donc le minage :<\/p>\n<h2>3\u00e8me \u00e9tape: le minage<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">miner.start();<\/pre>\n<p>Output :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">I0214 12:13:13.307293    3589 backend.go:584] Automatic pregeneration of ethash DAG ON (ethash dir: \/home\/balessan\/.ethash)\r\nI0214 12:13:13.307338    3589 backend.go:591] checking DAG (ethash dir: \/home\/balessan\/.ethash)\r\ntrue\r\n&gt; I0214 12:13:13.307462    3589 miner.go:119] Starting mining operation (CPU=4 TOT=5)\r\n    I0214 12:13:13.308327    3589 worker.go:570] commit new work on block 1 with 2 txs &amp; 0 uncles. Took 833.249\u00b5s\r\n    I0214 12:13:13.308489    3589 ethash.go:220] Generating DAG for epoch 0 (size 1073739904) (0000000000000000000000000000000000000000000000000000000000000000)\r\n   I0214 12:13:14.406107    3589 ethash.go:237] Done generating DAG for epoch 0, it took 1.097616396s<\/pre>\n<p>Ca semble pas mal, les transactions ont \u00e9t\u00e9 process\u00e9s d&#8217;apr\u00e8s le message. Mais la v\u00e9rification des balances n&#8217;annonce toujours rien de diff\u00e9rent&#8230;<\/p>\n<p>Apr\u00e8s quelques recherches, j&#8217;ai compris. Le message pr\u00e9c\u00e9dent indique que le travail sur la validation du block num\u00e9ro 1 contenant 2 transactions et 0 oncles a \u00e9t\u00e9 enclench\u00e9, mais pas termin\u00e9. Donc le bloc n&#8217;a pas \u00e9t\u00e9 cr\u00e9\u00e9, et les transactions pas valid\u00e9es. Pour cela, j&#8217;ai adapt\u00e9 le fichier genesis_block.json (en le simplifiant) que j&#8217;utilise pour rendre plus facile la g\u00e9n\u00e9ration de blocks. Le fichier ressemble donc maintenant \u00e0 \u00e7a :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">{\r\n        \"nonce\": \"0x0000000000000042\",\r\n        \"difficulty\": \"0xb\",\r\n        \"alloc\": {\r\n            \"af51314e6a721f234e132428745e0cb99a43faa2\": {\r\n                \"balance\": \"500000000000000000000000000000000000000000000000000000000000000000000000\"\r\n            }\r\n        },\r\n        \"mixhash\": \"0x0000000000000000000000000000000000000000000000000000000000000000\",\r\n        \"coinbase\": \"0x0000000000000000000000000000000000000000\",\r\n        \"timestamp\": \"0x00\",\r\n        \"parentHash\": \"0x0000000000000000000000000000000000000000000000000000000000000000\",\r\n        \"extraData\": \"0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa\",\r\n        \"gasLimit\": \"0x132938209238308209320382393820832094794627692836\"\r\n}<\/pre>\n<p>La valeur que j&#8217;ai modifi\u00e9e est la valeur de difficulty, qui \u00e9tait pr\u00e9c\u00e9demment sett\u00e9 \u00e0 :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\"difficulty\": \"0x4000000000000000000\",<\/pre>\n<p>Soit une valeur beaucoup trop haute pour que ma machine soit efficace sur ce traitement. Une fois le r\u00e9seau de test relanc\u00e9 avec cette valeur ajust\u00e9e, si je relance ma demande de transaction:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">var sender    = eth.accounts[0];\r\nvar recipient = eth.accounts[1];\r\nvar amount = web3.toWei(20, \"ether\")\r\neth.sendTransaction({from: sender, to: recipient, value: amount});<\/pre>\n<p>Puis je lance le minage :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">miner.start()<\/pre>\n<p>Et l\u00e0, miracle :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">I0214 12:49:48.420331    4552 worker.go:349]\r\n   Mined block (#68 \/ 15f4c63e). Wait 5 blocks for confirmation\r\nI0214 12:49:48.420750    4552 worker.go:570] commit new work on block 69 with 0 txs &amp; 0 uncles. Took 372.014\u00b5s\r\nI0214 12:49:48.420785    4552 worker.go:448] ??\r\n   Mined 5 blocks back: block #63\r\nI0214 12:49:48.638256    4552 worker.go:570] commit new work on block 69 with 0 txs &amp; 0 uncles. Took 21.168595ms\r\nI0214 12:49:48.867843    4552 worker.go:349]\r\n   Mined block (#69 \/ d0e78681). Wait 5 blocks for confirmation\r\nI0214 12:49:48.868413    4552 worker.go:570] commit new work on block 70 with 0 txs &amp; 0 uncles. Took 419.321\u00b5s\r\nI0214 12:49:48.868518    4552 worker.go:448] ??\r\n   Mined 5 blocks back: block #64\r\nI0214 12:49:48.870588    4552 worker.go:570] commit new work on block 70 with 0 txs &amp; 0 uncles. Took 305.637\u00b5s\r\nI0214 12:49:48.914028    4552 worker.go:349]\r\n   Mined block (#70 \/ 4d655a6e). Wait 5 blocks for confirmation\r\nI0214 12:49:48.915259    4552 worker.go:570] commit new work on block 71 with 0 txs &amp; 0 uncles. Took 400.87\u00b5s\r\nI0214 12:49:48.915304    4552 worker.go:448] ??\r\n   Mined 5 blocks back: block #65<\/pre>\n<p>Les validations de blocks (la plupart vides) commencent \u00e0 pleuvoir. Pour valider, je stoppe le minage <code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">miner.stop()<\/code>, puis je valide que la transaction s&#8217;est bien pass\u00e9e:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">&gt; eth.getBalance(recipient);\r\n&gt; 20000000000000000000\r\n&gt; eth.getBalance(eth.coinbase);\r\n&gt; 5.0000000000000000000000000000000000000000000000000083e+71<\/pre>\n<p>Wouhouuuuuuu, on peut voir que la transaction est bien pass\u00e9e ! C&#8217;est le d\u00e9but d&#8217;un long chemin de d\u00e9couvertes et d&#8217;impr\u00e9gnation de la philosophie de cet outil prometteur !<\/p>\n<h2>Conclusion<\/h2>\n<p>Dans cet article nous avons vu comment r\u00e9aliser les premi\u00e8res transactions, simple transfert d&#8217;ether d&#8217;un compte vers un autre, et comment les valider via le minage. C&#8217;est la base de tout les syst\u00e8mes <em>Blockchain<\/em>, il est donc important de comprendre l&#8217;encha\u00eenement logique de ces \u00e9tapes \ud83d\ude09<\/p>\n<p><a href=\"http:\/\/benoit-alessandroni.fr\/technique\/blockchain\/ethereum\/\">Retour \u00e0 l&#8217;accueil de la s\u00e9rie<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cet article je vais vous pr\u00e9senter comment r\u00e9aliser des transactions entre deux comptes cr\u00e9\u00e9s sur le m\u00eame r\u00e9seau priv\u00e9 et je vous pr\u00e9senterais comment miner.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coopedia_published":false},"categories":[53],"tags":[],"_links":{"self":[{"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/posts\/387"}],"collection":[{"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/comments?post=387"}],"version-history":[{"count":10,"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/posts\/387\/revisions"}],"predecessor-version":[{"id":425,"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/posts\/387\/revisions\/425"}],"wp:attachment":[{"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/media?parent=387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/categories?post=387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.balessan.me\/api\/wp\/v2\/tags?post=387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}