-
Notifications
You must be signed in to change notification settings - Fork 0
3. Ethereum
Cette page décrit l'installation du client Geth ainsi que la mise en place d'une bloc chaine privée avec Proof-Of-Work et d'une application décentralisée.
Installation de Go
$ mkdir Ethereum
$ cd Ethereum
$ wget https://storage.googleapis.com/golang/go1.6.2.linux-armv6l.tar.gz
$ sudo tar -C /usr/local -xzf go1.6.2.linux-armv6l.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ sudo apt-get install -y build-essential libgmp3-dev golang
Installation de geth
$ git clone https://github.com/ethereum/go-ethereum
$ cd go-ethereum
$ make geth
$ export PATH=$PATH:/home/debian/Ethereum/go-ethereum/build/bin
Création du fichier genesis.json
{
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x4000",
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "Custom Ethereum Genesis Block",
"gasLimit": "0xffffffff"
}
A noter : il est possible d'initialiser la blockchain avec des comptes pour lesquels un certain nombre d'ethers est attribué
exemple : https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options#init
Initialisation du premier bloc
$ geth init genesis.json
Création du compte qui va récupérer les ethers générés lors du minage
$ geth account new
Lancement du noeud
$ geth --networkid 69 --nodiscover console
Lancement du minage
> miner.start(1)
Dans ce cas, il s'agit du premier noeud de la blockchain privée.
Pour récupérer les informations du noeud, nécessaire pour connecter un second noeud, il faut exécuter la commande suivante :
> admin.nodeInfo.enode
"enode://265f30d9925bc0c704f6dbd776a86437093e941788d710a068cba63b7bff991ad4361fb93fb5fef4dfac79b5a7852395f3ad572977feab9b1f7026eba0f7970d@[::]:30303?discport=0"
En plus des étapes précédentes d'installation du client, il faut également ajouter le fichier static-nodes.json
$ nano static-nodes.json
$ cp static-nodes.json ~/.ethereum/
Contenu du fichier (avec l'IP du premier noeud)
[
"enode://265f30d9925bc0c704f6dbd776a86437093e941788d710a068cba63b7bff991ad4361fb93fb5fef4dfac79b5a7852395f3ad572977feab9b1f7026eba0f7970d@192.168.0.47:30303?discport=0"
]
l'ajout d'un noeud peut également se faire en ligne de commande via la commande admin.peer()
exemple : https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network#static-nodes
> personal.unlockAccount('0x98181b49bf309364fba5d75ff57d30509b2a24fd')
Unlock account 0x98181b49bf309364fba5d75ff57d30509b2a24fd
Passphrase:
true
> eth.sendTransaction({from: '0x98181b49bf309364fba5d75ff57d30509b2a24fd', to: '0x6d6c84bc62883d6444da5ca0f643e2218f0846c8', value: web3.toWei(1, "ether")})
"0x51f915bf140122b8de49a2c8a924917c9b1231c35b19b6df034e68f2e492ab5f"
Un de noeuds doit miner afin que la trasaction soit validée.
Plusieurs méthodes existent pour coder, déployer et tester un smart contract.
Le compilateur en ligne est disponible à l'URL suivante : https://ethereum.github.io/browser-solidity
-
Récupération de Daisee.sol et génération du code (cf. web3 deploy) à partir du compilateur.
-
Copie du code web3 dans la console geth
Le contrat a été déployé surla Blockchain et possède sa propre adresse. -
Test d'un appel à partir du autre noeud. On utilise l'ABI (Application Binary Interface).
Récupération du code Interface à partir du compilateur (cf. capture plus haut) et défintion de l'application
var abi = [{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"usagers","outputs":[{"name":"addr","type":"address"},{"name":"nom","type":"string"},{"name":"credit","type":"uint256"},{"name":"achatEDF","type":"uint256"},{"name":"venteEDF","type":"uint256"},{"name":"temps","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[],"name":"nextTime","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"name","type":"string"}],"name":"sajouterUsager","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"currentTime","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"consoActuelle","type":"uint256"},{"name":"prodActuelle","type":"uint256"}],"name":"publier","outputs":[],"type":"function"},{"inputs":[],"type":"constructor"}]
Définition de l'adresse du contrat
var address = "0xcbf118609b57be92029ee56fa79dc17c38df97cd"
Définition de la variable daisee qui correspond au contrat déployé
var daisee = eth.contract(abi).at(address)
Appel de la fonction getRate
Le développement d'applications décentralisées s'appuie sur l'API JavaScript d’Ethereum web3. Elle est notamment disponible en tant que module pour node.js.
Dans les exemples suivants, les tests seront effectuées directement sur la blockchain privée créée précédemment (d'où la non-utilisation d'outils de développement tel que Truffle).
Création d'un répertoire dédiée à l'application :
[sam@sam-manjaro-pc DzApp]$ mkdir DzApp
[sam@sam-manjaro-pc DzApp]$ cd DzApp
Initialisation du projet :
[sam@sam-manjaro-pc DzApp]$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (DzApp) dzapp
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /mnt/DATA/Devs/DzApp/package.json:
{
"name": "dzapp",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes)
[sam@sam-manjaro-pc DzApp]$ npm install web3
[sam@sam-manjaro-pc DzApp]$ sudo npm install -g browserify
Browserify permet notamment d'utiliser la syntaxe require() de CommonJS dans le navigateur. Ce qui évitera des remontés d'erreurs liées à l'appel de require()
Arborescence attendue (avec l'ensemble des fichiers créés ensuite) :
- Javascript
abi.js
: comprend l'Application Binary Interface (récupérée à partir du compilateur)
init.js
: comprend l'appel des fonctions du smart contract ainsi que les autres éléments affichés dans la page HTML, tel quel le dernier bloc miné.
Il faut ensuite générer le fichier main.js
avec Browserify
[sam@sam-manjaro-pc DzApp]$ browserify init.js -o main.js
Lancer le noeud
[sam@sam-manjaro-pc ~]$ geth --networkid 69 --nodiscover --rpc --rpccorsdomain "*" console
- HTML
L'affichage de la page HTML (
index.html
) donne le résultat suivant :
Affichage de la page sur le laptop.
Affichage d'une transaction effectuée sur le noeud du laptop et visualisable sur la page affichée sur le Raspberry Pi
- Wiki du client Geth
- Tutoriels d'Ethereum
- Création de DApp : ici et ici
- Smart-contracts : ici et ici