Maintenant, continuons l’exécution du tutoriel officiel à la page suivante dont le sujet va être la première création et utilisation d’un smart contract.
1ère étape: relancer notre réseau !
Comme toujours, il faut redémarrer le serveur en exécutant la commande:
geth --networkid 12345 --genesis ~/blockchain/genesis_block.json --datadir ~/.ethereum_experiment --dev --lightkdf --nodiscover --maxpeers 0 console
Comme vous pouvez le voir, j’ai ici utilisé quelques arguments supplémentaires. En effet, pour une raison que j’ignore, le paramétrage de la difficulty de résolution des puzzles n’est plus pris en compte lorsque je relance le réseau sur ma machine. Un contournement simple (mais peu documenté) est d’utiliser les arguments –dev et –lightkdf qui simplifient grandement le minage !
2ème étape: création de notre smart-contract !
Ici: le document officiel de référence sur le principe des smart contracts
Première étape, installer le compilateur pour Solidity (langage haut-niveau qui permet l’implémentation et le test de smart contracts):
sudo add-apt-repository ppa:ethereum/ethereum sudo apt-get update sudo apt-get install solc which solc
L’output de cette commande devrait correspondre à ça:
/usr/bin/solc
Maintenant si vous retournez checker la liste de vos compilateurs via Geth (relancez le réseau d’abord, voir étape 1):
eth.getCompilers()
Vous devriez avoir comme retour:
["Solidity"]
Ensuite, on suit la doc, afin d’essayer d’exécuter notre Greeter Smart Contract. Pour cela,
var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }' var greeterCompiled = web3.eth.compile.solidity(greeterSource)
Puis:
var _greeting = "Hello World!"; var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition); var greeter = greeterContract.new(_greeting,{from:web3.eth.accounts[0], data: greeterCompiled.greeter.code, gas: 300000}, function(e, contract){ if(!e) { if(!contract.address) { console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { console.log("Contract mined! Address: " + contract.address); console.log(contract); } } })
Et maintenant, pour valider l’exécution du contrat, un petit
miner.start();
Ce qui nous fournit une confirmation:
> I0214 14:16:50.174101 5584 miner.go:119] Starting mining operation (CPU=4 TOT=5) I0214 14:16:50.174868 5584 worker.go:570] commit new work on block 12 with 1 txs & 0 uncles. Took 739.867µs I0214 14:16:50.990070 5584 worker.go:349] Mined block (#12 / 58455ccc). Wait 5 blocks for confirmation I0214 14:16:50.990425 5584 worker.go:570] commit new work on block 13 with 0 txs & 0 uncles. Took 307.265µs I0214 14:16:50.990456 5584 worker.go:448] ?? Mined 5 blocks back: block #7 I0214 14:16:51.070633 5584 worker.go:570] commit new work on block 13 with 0 txs & 0 uncles. Took 294.004µs Contract mined! Address: 0xbd4cb799aee37567835639dbba7f3eeb2c9141f1 [object Object]
Le contrat a bien été miné, son adresse est la suivante: 0xbd4cb799aee37567835639dbba7, il doit donc être maintenant disponible sur ma blockchain privé. Confirmons ça, en demandant au greeter son adresse:
> eth.getCode(greeter.address) "0x606060405260e060020a600035046341c0e1b58114610026578063cfae321714610068575b005b6100246000543373ffffffffffffffffffffffffffffffffffffffff908116911614156101375760005473ffffffffffffffffffffffffffffffffffffffff16ff5b6100c9600060609081526001805460a06020601f6002600019610100868816150201909416939093049283018190040281016040526080828152929190828280156101645780601f1061013957610100808354040283529160200191610164565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b565b820191906000526020600020905b81548152906001019060200180831161014757829003601f168201915b505050505090509056"
Et si on teste le contrat :
greeter.greet();
Retour :
"Hello World!"
Évidemment, vous pouvez modifier à souhait la valeur du greeting que vous passez à votre objet greeter et ensuite le re-tester pour valider que la modification est bien prise en compte. Cela prouve que ce smart contract est bien smart, car il s’adapte aux informations qu’on lui fournit en entrée. Si vous souhaitez relancer une exécution de votre contrat après modification du greeting en entrée, notez qu’il faut reminer à chaque fois sa validation.
Conclusion
Nous avons vu dans cet article comment implémenter et exécuter notre premier smart contract, qui n’a pas grand-chose de smart pour le moment. Les exemples et les explications de code s’étofferont dans les articles à venir, si jamais vous êtes restés sur votre faim ! En attendant, n’hésitez pas à me faire des remarques/commentaires si certains passages ne sont pas clairs 😉