X

Ethereum – Implémentation d’un smart contract basique

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 😉

Retour à l’accueil de la série

balessan: