|
|
Page Wiki sur le blockchain |
|
|
\ No newline at end of file |
|
|
Page Wiki sur le blockchain
|
|
|
|
|
|
**Préparation de la machine Linux**
|
|
|
|
|
|
Informations
|
|
|
Login Ubuntu : romain
|
|
|
mdp Ubuntu : romain
|
|
|
|
|
|
**Installation des paquets**
|
|
|
|
|
|
Ajout des dépôts d’ethereum
|
|
|
|
|
|
`sudo apt-get update`
|
|
|
|
|
|
`sudo apt-get install -y software-properties-common`
|
|
|
|
|
|
`sudo add-apt-repository -y ppa:ethereum/ethereum`
|
|
|
|
|
|
`sudo add-apt-repository -y ppa:ethereum/ethereum-dev`
|
|
|
|
|
|
`sudo apt-get update`
|
|
|
|
|
|
Mot de passe : romain
|
|
|
|
|
|
Installation de « geth » ainsi que le compilateur « solidity » (solc)
|
|
|
|
|
|
`sudo apt-get install –y ethereum solc`
|
|
|
|
|
|
Mot de passe : romain
|
|
|
|
|
|
**Création du fichier de configuration**
|
|
|
|
|
|
Il faut créer un fichier sous l’extention « .json », dans notre cas ce sera « genesis.json »
|
|
|
|
|
|
Nous entrons les configurations suivantes :
|
|
|
|
|
|
`{
|
|
|
"nonce": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
"difficulty": "0x1000",
|
|
|
"alloc": {},
|
|
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
"timestamp": "0x00",
|
|
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
"extraData": "0x00",
|
|
|
"gasLimit": "0x1000000000",
|
|
|
"config": {
|
|
|
"chainId": 100,
|
|
|
"homesteadBlock": 0,
|
|
|
"eip155Block": 0,
|
|
|
"eip158Block": 0
|
|
|
}
|
|
|
}
|
|
|
`
|
|
|
|
|
|
Plusieurs paramètres sont à renseigner :
|
|
|
|
|
|
• Le **nonce** est le hash que le mineur va devoir faire varier et trouver pour résoudre la preuve de travail. Il est complémentaire au mixhash et sert à vérifier que le bloc est valide.
|
|
|
|
|
|
• **Mixhash** est le hash de l’entête du bloc, sur lequel va se baser le mineur pour trouver le nonce.
|
|
|
|
|
|
• Le **timestamp** permet au client de réguler le temps entre la validation de 2 blocs successifs et de vérifier le bon enchainement des blocs. Il est initialisé à 0 pour indiquer qu’il s’agit du premier bloc.
|
|
|
|
|
|
• Le **parentHash** est le hash du bloc précédent. Etant donné qu’il s’agit du premier bloc, ce hash vaut 0.
|
|
|
|
|
|
• **ExtraDat** est facultatif et permet de stocker des données (32 octets max), sur la blockchain.
|
|
|
|
|
|
• **GasLimit** est le montant maximum de gas que les contrats peuvent consommer. Au-dessus de la limite, le contrat ne pourra pas être ajouté au bloc. Nous reverrons la notion de gas lors de la création de notre premier contrat.
|
|
|
|
|
|
• **Difficulty** correspond à la difficulté de la preuve de travail de ce bloc. Elle a un impact sur la rapidité de validation des blocs et donc la création d’ether. Nous mettons une valeur faible pour ne pas perdre de temps sur la validation de nos blocs et générer rapidement de l’ether. Cette valeur, couplée au timestamp, va permettre au client de fixer la difficulté de la prochaine preuve de travail, pour conserver un temps de validation linéaire.
|
|
|
|
|
|
|
|
|
**Génération du block Genesis pour le NodeA**
|
|
|
|
|
|
Nous entrons la commande suivante :
|
|
|
|
|
|
`geth --datadir BlockChain/NodeA/ init BlockChain/NodeA/genesis.json`
|
|
|
|
|
|
`geth --datadir ./NodeA --networkid "100" init genesis.json`
|
|
|
|
|
|
**Génération du block Genesis pour le NodeB**
|
|
|
|
|
|
Nous entrons la commande suivante :
|
|
|
|
|
|
`geth --datadir Private/NodeB/ init Private/NodeB/genesis.json`
|
|
|
|
|
|
`geth --datadir ./NodeB --networkid "100" init genesis.json`
|
|
|
|
|
|
**Création du compte pour le NodeA**
|
|
|
|
|
|
On tape la commande :
|
|
|
|
|
|
`geth --datadir ./NodeA --networkid "100" account new`
|
|
|
|
|
|
Mot de passe : romain
|
|
|
|
|
|
Address: {237649abd0d7fe8b13e1fef8fa10d08f7cf8fbc6}
|
|
|
|
|
|
**Création du compte pour le NodeB**
|
|
|
|
|
|
On tape la commande :
|
|
|
|
|
|
`geth --datadir ./NodeB --networkid "100" account new`
|
|
|
|
|
|
Mot de passe : romain
|
|
|
|
|
|
Address: {969c4919e04c2768e8ac15adcffc1f0fc2814a26}
|
|
|
|
|
|
**Lancement du NodeA**
|
|
|
|
|
|
On entre la commande suivante :
|
|
|
|
|
|
`geth --datadir ./NodeA --networkid "100" --port "3031" console`
|
|
|
|
|
|
Ensuite nous récupérons l’enode avec la commande suivante :
|
|
|
|
|
|
`admin.nodeInfo`
|
|
|
|
|
|
enode: "enode://7610246c4fbae8382eb965f14f77cb2a4482b513fbb42117bb4423713f34572f48b53e08945370ba39b64997cb475ef14dfc2ff1fef17d5d65ed570bf9a447c7@[::]:3031",
|
|
|
|
|
|
**Lancement du NodeB**
|
|
|
|
|
|
On entre la commande suivante :
|
|
|
|
|
|
`geth --datadir ./NodeB --networkid "100" --port "3032" console`
|
|
|
|
|
|
Ensuite nous récupérons l’enode avec la commande suivante :
|
|
|
|
|
|
`admin.nodeInfo`
|
|
|
|
|
|
enode: "enode://e1a69372693d684bd63f380b419f098687ae69c0d35d56f0db375a3898bb0b297f48a38ce1334a94e43eec405aa629f35c5d5d4f0a6ca527fb80dc18ad6d0cc0@[::]:3032",
|
|
|
|
|
|
**Activation du minage sur le NodeA**
|
|
|
|
|
|
Entrer la commande suivante :
|
|
|
|
|
|
`miner.start()`
|
|
|
|
|
|
** Visualiser le compte du NodeA**
|
|
|
|
|
|
Entrer la commande suivante :
|
|
|
|
|
|
`web3.fromWei(eth.getBalance(eth.coinbase),"ether")`
|
|
|
|
|
|
**Connecter les noeuds**
|
|
|
|
|
|
Sur le NodeB on entre la commande suivante :
|
|
|
|
|
|
`admin.addPeer({enode du nœud sur lequel se connecter})`
|
|
|
|
|
|
`admin.peers`
|
|
|
|
|
|
**Transaction de A vers B**
|
|
|
|
|
|
Sur le NodeA on entre les commandes suivantes :
|
|
|
|
|
|
`personal.unlockAccount(eth.accounts[0],"romain",60)`
|
|
|
|
|
|
`eth.sendTransaction({from:eth.accounts[0],to:"88e9ee3093089e23ac4fac6924bf87ee82c3c8e1",value: web3.toWei(1,"ether")})` |