Livre «Création de contrats intelligents Solidity pour la blockchain Ethereum. Guide pratique


Pendant plus d'un an, j'ai travaillé sur le livre «Création de contrats intelligents Solidity pour la blockchain Ethereum. Un guide pratique », et maintenant ce travail est terminé, et le livre est publié et disponible en Litres .

J'espère que mon livre vous aidera à commencer rapidement à créer des contacts intelligents Solidity et des applications DApp distribuées pour la blockchain Ethereum. Il se compose de 12 leçons avec des exercices pratiques. Après les avoir terminées, le lecteur pourra créer ses propres nœuds Ethereum locaux, publier des contrats intelligents et appeler leurs méthodes, échanger des données entre le monde réel et des contrats intelligents à l'aide d'oracles, travailler avec le réseau de débogage de test Rinkeby.

Le livre s'adresse à tous ceux qui s'intéressent aux technologies avancées dans le domaine des blockchains et souhaitent acquérir rapidement des connaissances qui leur permettent de s'engager dans un travail intéressant et prometteur.

Vous trouverez ci-dessous la table des matières et le premier chapitre du livre (des fragments du livre sont également disponibles sur Litres ). J'espère recevoir des commentaires, des commentaires et des suggestions. J'essaierai de prendre tout cela en compte lors de la préparation de la prochaine édition du livre.

Table des matières
Présentation
Notre livre est destiné à ceux qui veulent non seulement comprendre les principes de la blockchain Ethereum, mais également acquérir des compétences pratiques dans la création d'applications DApp distribuées dans le langage de programmation Solidity pour ce réseau.

Il vaut mieux non seulement lire ce livre, mais aussi travailler avec lui, en accomplissant les tâches pratiques décrites dans les leçons. Pour fonctionner, vous avez besoin d'un ordinateur local, d'un serveur virtuel ou cloud avec le système d'exploitation Debian ou Ubuntu installé. Vous pouvez également utiliser le Raspberry Pi pour effectuer de nombreuses tâches.

Dans la première leçon, nous examinerons les principes de fonctionnement de la blockchain Ethereum et la terminologie de base, ainsi que parler de l'endroit où vous pouvez utiliser cette blockchain.

Le but de la deuxième leçon est de créer un nœud de blockchain privé Ethereum pour un travail ultérieur dans le cadre de ce cours sur le serveur Ubuntu et Debian. Nous considérerons les fonctionnalités d'installation des utilitaires de base, tels que geth, qui assure le fonctionnement de notre nœud blockchain, ainsi que le démon de l'entrepôt de données décentralisé Swarm.

La troisième leçon vous apprendra à expérimenter avec Ethereum sur un micro-ordinateur Raspberry Pi bon marché. Vous installez le système d'exploitation (OS) Rasberian sur le Raspberry Pi, l'utilitaire Geth qui assure le fonctionnement du nœud de la chaîne de blocs, ainsi que le démon d'entrepôt de données décentralisé Swarm.

La quatrième leçon est consacrée aux comptes et aux unités de crypto-monnaie sur le réseau Ethereum, ainsi qu'à la façon de transférer des fonds d'un compte à un autre depuis la console Geth. Vous apprendrez comment créer des comptes, initier des transactions de transfert d'argent, recevoir le statut de transaction et sa réception.

Dans la cinquième leçon, vous vous familiariserez avec les contrats intelligents sur le réseau Ethereum, découvrirez leur implémentation par la machine virtuelle Ethereum.

Vous allez créer et publier votre premier contrat intelligent dans le réseau privé Ethereum et apprendre à appeler ses fonctions. Pour cela, vous utiliserez l'environnement de développement IDE Remix Solidity. De plus, vous apprendrez comment installer et utiliser le compilateur par lots solc.
Nous parlerons également de l'interface binaire dite ABI (Application Binary Interface) et nous apprendrons à l'utiliser.

La sixième leçon est consacrée à la création de scripts JavaScript exécutés sous Node.js et à l'exécution d'opérations avec des contrats intelligents Solidity.

Vous installez Node.js sur les systèmes d'exploitation Ubuntu, Debian et Rasberian, écrivez des scripts pour publier un contrat intelligent sur le réseau local Ethereum et appeler ses fonctions.

De plus, vous apprendrez à transférer des fonds entre des comptes réguliers à l'aide de scripts, ainsi qu'à les transférer vers des comptes de contrat intelligents.

Dans la septième leçon, vous apprendrez à installer et à utiliser l'environnement intégré Truffle, qui est populaire parmi les développeurs de contrats intelligents Solidity. Vous apprendrez à créer des scripts JavaScript qui appellent des fonctions de contrat à l'aide du module de contrat de truffe, et testerez également votre contrat intelligent avec Truffle.

La huitième leçon traite des types de données Solidity. Vous écrirez des contrats intelligents qui fonctionnent avec des types de données tels que des entiers signés et non signés, des nombres signés, des chaînes, des adresses, des variables de type complexes, des tableaux, des énumérations, des structures et des dictionnaires.

Dans la neuvième leçon, vous allez faire un pas de plus vers la création de contrats intelligents pour le réseau central Ethereum. Vous apprendrez comment publier des contrats à l'aide de Truffle sur le réseau privé Geth, ainsi que sur le réseau de test Rinkeby. Déboguer un contrat intelligent sur le réseau Rinkeby est très utile avant de le publier sur le réseau principal - presque tout est réel, mais gratuit.

Dans le cadre de la leçon, vous allez créer un nœud de réseau de test Rinkeby, le reconstituer avec des fonds et publier un contrat intelligent.

La leçon 10 porte sur l'entreposage de données réparties Ethereum Swarm. En utilisant le stockage distribué, vous économisez sur le stockage de grandes quantités de données sur la blockchain Ethereum.

Dans le cadre de cette leçon, vous allez créer un stockage Swarm local, effectuer les opérations d'écriture et de lecture de fichiers, ainsi que des répertoires contenant des fichiers. Ensuite, vous apprendrez à travailler avec la passerelle publique Swarm, à écrire des scripts pour accéder à Swarm à partir de Node.js, ainsi qu'à utiliser le module Perl Net :: Ethereum :: Swarm.

Le but de la leçon 11 est de maîtriser les contrats intelligents Solidity à l'aide du langage de programmation Python et du framework Web3.py. Vous allez installer ce framework, écrire des scripts pour compiler et publier un contrat intelligent, ainsi que pour appeler ses fonctions. Dans le même temps, Web3.py sera utilisé seul et conjointement avec l'environnement de développement intégré Truffle.

Dans la leçon 12, vous apprendrez à transférer des données entre des contrats intelligents et le monde réel à l'aide d'oracles. Cela vous permet de recevoir des données de sites Web, d'appareils IoT Internet of Things, de divers appareils et capteurs et d'envoyer des données de contrats intelligents à ces appareils. Dans la partie pratique de la leçon, vous allez créer un oracle et un contrat intelligent qui reçoit le taux de change actuel de l'USD en roubles sur le site Web de la Banque centrale de la Fédération de Russie.

Leçon 1. En bref sur la blockchain Ethereum et le réseau
Le but de la leçon: se familiariser avec les principes de la blockchain Ethereum, ses domaines d'application et sa terminologie de base.
Exercices pratiques : non fournis dans cette leçon.

Il n'y a pratiquement pas de développeur de logiciel aujourd'hui qui n'entendrait rien de la technologie Blockchain, des crypto-monnaies (Crypto-monnaie ou Crypto Currency), des Bitcoins (Bitcoin), de l'offre initiale de pièces (ICO, offre initiale de pièces), des contrats intelligents (Smart Contract), ainsi que d'autres concepts et termes liés à la blockchain.

La technologie Blockchain ouvre de nouveaux marchés et crée des emplois pour les programmeurs. Si vous comprenez toutes les subtilités des technologies de crypto-monnaie et des technologies de contrat intelligent, vous ne devriez pas avoir de problèmes avec l'application de ces connaissances dans la pratique.

Je dois dire qu'il y a beaucoup de spéculations autour des crypto-monnaies et des blockchains. Nous laisserons de côté les discussions sur les changements dans les taux de crypto-monnaie, sur la création de pyramides, sur les subtilités de la législation sur la crypto-monnaie, etc. Dans notre cours de formation, nous nous concentrerons principalement sur les aspects techniques de l'application des contrats intelligents de la blockchain Ethereum (Ethereum, ether) et le développement de la soi-disant application distribuée (DApp).

Qu'est-ce que la blockchain?


Blockchain (Blockchain, Block Chain) est une chaîne de blocs de données connectés d'une certaine manière. Au début de la chaîne se trouve le premier bloc appelé bloc de genèse ou bloc de genèse. Elle est suivie d'une seconde, puis d'une troisième, etc.

Tous ces blocs de données sont automatiquement dupliqués sur de nombreux nœuds du réseau blockchain. Cela garantit un stockage décentralisé des données de la chaîne de blocs.
Vous pouvez imaginer le système de blockchain comme un grand nombre de nœuds (serveurs physiques ou virtuels), en réseau et reproduisant tous les changements dans la chaîne de blocs de données. C'est comme un ordinateur multiserveur géant, et les nœuds d'un tel ordinateur (serveurs) peuvent être dispersés à travers le monde. Et vous aussi, vous pouvez ajouter votre ordinateur au réseau blockchain.

Base de données distribuée


La blockchain peut être imaginée comme une base de données distribuée répliquée sur tous les nœuds du réseau blockchain. En théorie, la blockchain sera opérationnelle tant qu'au moins un nœud qui stocke tous les blocs de la blockchain fonctionne.

Registre de données distribuées


La blockchain peut être imaginée comme un registre distribué de données et d'opérations (transactions). Un autre nom pour un tel registre est le grand livre.

Vous pouvez ajouter des données à un registre distribué, mais vous ne pouvez pas les modifier ou les supprimer. Une telle impossibilité est obtenue, en particulier, en utilisant des algorithmes cryptographiques, des algorithmes spéciaux pour ajouter des blocs à la chaîne et un stockage décentralisé des données.

Lors de l'ajout de blocs et de l'exécution d'opérations (transactions), des clés privées et publiques sont utilisées. Ils restreignent les utilisateurs de la chaîne de blocs en leur donnant uniquement accès à leurs blocs de données.

Les transactions


La blockchain stocke des informations sur les opérations (transactions) dans des blocs. Dans le même temps, les anciennes transactions déjà terminées ne peuvent pas être annulées ou modifiées. Les nouvelles transactions sont stockées dans de nouveaux blocs ajoutés.

Ainsi, l'historique complet des transactions peut être enregistré inchangé dans la blockchain. Par conséquent, la blockchain peut être utilisée, par exemple, pour stocker en toute sécurité des opérations bancaires, des informations sur le droit d'auteur, un historique des changements de propriété d'un bien immobilier, etc.

La blockchain Ethereum contient les soi-disant états du système. Une fois les transactions terminées, l'état passe de l'initiale à l'actuelle. Les transactions sont écrites en blocs.

Blockchains publiques et privées


Il convient de noter ici que tout ce qui précède n'est vrai que pour les soi-disant réseaux publics de blockchain, qui ne peuvent pas être contrôlés par des individus ou des entités juridiques, des organismes d'État ou des gouvernements.
Les soi-disant réseaux privés de blockchain sont sous le contrôle total de leurs créateurs, et tout y est possible, par exemple, le remplacement complet de tous les blocs de la chaîne.

Applications pratiques Blockchain


Pour quoi la blockchain peut-elle entrer?

En bref, la blockchain vous permet d'effectuer en toute sécurité des transactions (transactions) entre des personnes qui ne se font pas confiance ou des entreprises. Les données enregistrées dans la blockchain (transactions, données personnelles, documents, certificats, contrats, factures, etc.) ne peuvent pas être falsifiées ou remplacées après enregistrement. Par conséquent, sur la base de la blockchain, vous pouvez créer, par exemple, des registres distribués de confiance de divers types de documents.

Bien sûr, vous savez que les systèmes de crypto-monnaie sont créés sur la base de chaînes de blocs, conçues pour remplacer le papier-monnaie ordinaire. Le papier-monnaie est également appelé monnaie fiduciaire (de Fiat Money).
La blockchain fournit le stockage et l'immuabilité des transactions enregistrées dans des blocs, elle peut donc également être utilisée pour créer des systèmes de crypto-monnaie. Il contient l'historique complet du transfert de fonds cryptographiques entre différents utilisateurs (comptes), et toute opération peut être suivie.

Bien que les transactions au sein des systèmes de crypto-monnaie puissent être anonymes, le retrait de la crypto-monnaie et son échange contre de la monnaie fiduciaire conduisent généralement à la divulgation de l'identité du propriétaire de l'actif de crypto-monnaie.

Les contrats dits intelligents, qui sont des logiciels exécutés sur le réseau Ethereum, automatisent le processus de conclusion des accords et contrôlent leur exécution. Cela est particulièrement efficace si le paiement de la transaction est effectué avec la crypto-monnaie Ether.

La blockchain Ethereum et les contrats intelligents Ethereum écrits dans le langage de programmation Solidity peuvent être utilisés, par exemple, dans les domaines suivants:

  • alternative à la légalisation des documents;
  • stockage du registre de l'immobilier et informations sur les transactions immobilières;
  • stockage d'informations sur le droit d'auteur sur la propriété intellectuelle (livres, images, musique, etc.);
  • création de systèmes de vote indépendants;
  • finance et banque;
  • logistique internationale, suivi du mouvement des marchandises;
  • stockage de données personnelles en tant qu'analogue d'un système de carte d'identité;
  • transactions sécurisées dans le domaine commercial;
  • stockage des résultats des examens médicaux, ainsi que l'historique des procédures prescrites

Problèmes de blockchain


Mais, bien sûr, tout n'est pas aussi simple qu'il y paraît!

Il y a des problèmes avec la vérification des données avant de les ajouter à la blockchain (par exemple, n'est-ce pas faux?), Des problèmes de sécurité du système et des logiciels d'application utilisés pour travailler avec la blockchain, des problèmes avec la possibilité d'utiliser des méthodes d'ingénierie sociale pour voler l'accès aux portefeuilles de crypto-monnaie, etc. .p.

Encore une fois, s'il ne s'agit pas d'une blockchain publique, dont les nœuds sont dispersés dans le monde, mais d'une blockchain privée détenue par une personne ou une organisation, le niveau de confiance ici ne sera pas supérieur au niveau de confiance en cette personne ou cette organisation.

Il convient également de garder à l'esprit que les données enregistrées sur la blockchain deviennent accessibles à tous. En ce sens, la blockchain (en particulier la chaîne publique) n'est pas adaptée au stockage d'informations confidentielles. Cependant, le fait que les informations sur la blockchain ne puissent pas être modifiées peut aider à prévenir ou à enquêter sur toutes sortes d'activités frauduleuses.

Les applications Ethereum décentralisées seront pratiques si vous payez pour leur utilisation avec la crypto-monnaie. Plus il y aura de personnes qui possèdent une crypto-monnaie ou sont prêtes à l'acheter, plus les applications DApp et les contrats intelligents seront populaires.

Parmi les problèmes courants de la blockchain qui entravent son application pratique, on peut citer la vitesse limitée d'ajout de nouveaux blocs et le coût relativement élevé des transactions. Mais les technologies dans ce domaine se développent activement et on espère que les problèmes techniques seront résolus avec le temps.

Un autre problème est que les contrats intelligents de la blockchain Ethereum fonctionnent dans un environnement de machine virtuelle isolé et n'ont pas accès aux données du monde réel. En particulier, le programme de contrat intelligent ne peut pas lire les données des sites ou des appareils physiques (capteurs, contacts, etc.) lui-même, ni transmettre des données à des appareils externes. Nous discuterons de ce problème et des méthodes pour le résoudre dans une leçon consacrée aux soi-disant Oracles - intermédiaires d'information des contrats intelligents.

Il existe également des restrictions légales. Dans certains pays, par exemple, il est interdit d'utiliser la crypto-monnaie comme moyen de paiement, mais vous pouvez la posséder comme une sorte d'actif numérique, comme des titres. Ces actifs peuvent être achetés et vendus en bourse. Dans tous les cas, lorsque vous créez un projet qui fonctionne avec des crypto-monnaies, vous devez vous familiariser avec la législation du pays sous la juridiction duquel votre projet relève.

Comment est formée la chaîne de blockchain


Comme nous l'avons déjà dit, la blockchain est une simple chaîne de blocs de données. D'abord, le premier bloc de cette chaîne est formé, puis le deuxième bloc lui est ajouté, et ainsi de suite. On suppose que les données de transaction sont stockées dans des blocs et ajoutées au tout dernier bloc.

Dans la fig. 1.1 nous avons montré la version la plus simple d'une séquence de blocs, où le premier bloc fait référence au suivant.


Fig. 1.1. Séquence simple de blocs

Dans ce mode de réalisation, cependant, il est très facile de simuler le contenu de n'importe quel bloc de la chaîne, car les blocs ne contiennent aucune information pour se protéger contre les changements. Étant donné que la blockchain est destinée à l'usage des personnes et des entreprises entre lesquelles il n'y a pas de confiance, nous pouvons conclure que cette méthode de stockage des données pour la blockchain n'est pas appropriée.

Protégeons les blocs contre les faux. Dans un premier temps, nous essaierons de protéger chaque bloc avec une somme de contrôle (Fig. 1.2).


Fig. 1.2. Ajoutez une protection contre les blocs de données avec une somme de contrôle

Désormais, un attaquant ne peut pas simplement modifier un bloc car il contient une somme de contrôle des données du bloc. La vérification de la somme de contrôle montrera que les données ont été modifiées.

Pour calculer la somme de contrôle, vous pouvez utiliser l'une des fonctions de hachage, telles que MD-5, SHA-1, SHA-256, etc. Les fonctions de hachage calculent une certaine valeur (par exemple, sous la forme d'une chaîne de texte de longueur constante) suite à l'exécution d'opérations irréversibles sur un bloc de données. Les opérations dépendent du type de fonction de hachage.

Même avec un petit changement dans le contenu du bloc de données, la valeur de la fonction de hachage changera également. En analysant la valeur de la fonction de hachage, il est impossible de restaurer le bloc de données pour lequel il a été calculé.

Une telle protection serait-elle suffisante? Malheureusement non.

Dans ce schéma, la somme de contrôle (fonction de hachage) protège uniquement les blocs individuels, mais pas la chaîne de blocs entière. Connaissant l'algorithme de calcul de la fonction de hachage, un attaquant peut facilement remplacer le contenu d'un bloc. De plus, rien ne l'empêchera de retirer des blocs de la chaîne ou d'en ajouter de nouveaux.

Afin de protéger l'ensemble de la chaîne dans son ensemble, il est possible de stocker un hachage de données du bloc précédent dans chaque bloc avec des données (Fig. 1.3).


Fig. 1.3. Ajoutez le hachage du bloc précédent au bloc de données

Dans ce schéma, pour modifier un bloc, vous devez recalculer les fonctions de hachage de tous les blocs suivants. Il semblerait, quel est le problème?

Dans les chaînes de blocs réelles, des difficultés artificielles sont en outre créées pour ajouter de nouveaux blocs - des algorithmes sont utilisés qui nécessitent beaucoup de ressources informatiques. Étant donné que pour apporter des modifications à un bloc, ce n'est pas seulement un bloc qui doit être compté, mais tous les suivants, il sera extrêmement difficile de le faire.

Rappelons également que les données de la blockchain sont stockées (dupliquées) sur de nombreux nœuds de réseau, c'est-à-dire . , .. .

, .

Ethereum


Ethereum , DApp. , Ethereum (-, smart contracts), Solidity.

2013 , Bitcoin Magazine, 2015 . , , Ethereum - Solidity.


(mining) , « ». , .. Ethereum.

, , (miner).
(), , Nonce, -, . Ethash, Ethereum, Nonce .

Nonce, (PoW, Proof-of-work). , Ethereum, — Ether. 5 Ether, .

, Ethereum , , . , Solidity DApp Ethereum.


, . , , .

. — ( ), . , Ethereum - Solidity. , , ..

, . , , , , - , , .

. . , , .

2. Ubuntu Debian


Geth Swarm Ubuntu
Geth Swarm Debian

Go

Go
Geth Swarm

genesis.json






Geth


3. Raspberry Pi 3
Raspberry Pi 3
Rasberian

SSH
IP

Go
Go

Go
Geth Swarm




4.



geth account

Ethereum
Ethereum


eth.sendTransaction




5.
- Ethereum
-
Ethereum
Remix Solidity IDE



ABI



solc
solc Ubuntu
solc Debian
HelloSol

solc Rasberian


6. - Node.js
Node.js
Ubuntu
Debian
Ganache-cli
Web3
solc
Node.js Rasberian

-




ABI



-
-
Web3 1.0.x





- HelloSol

getBalance call_contract_get_promise.js
-


7. Truffle
Truffle
HelloSol

contracts
migrations
test
truffle-config.js
HelloSol

HelloSol Truffle
HelloSol JavaScript Node.js
truffle-contract
getValue getString
setValue setString

Web3 1.0.x
- HelloSol

Truffle
Solidity
JavaScript


8. Solidity




L'adresse





mapping


9. Rinkeby
Truffle Geth


Truffle
geth
Truffle
Truffle Rinkeby
Geth Rinkeby


Rinkeby
Rinkeby
Rinkeby
Truffle Rinkeby

Node.js
Truffle Rinkby


10. Ethereum Swarm
Ethereum Swarm
Swarm

Ethereum Swarm
Ethereum Swarm



Swarm
Swarm Node.js
Perl Net::Ethereum::Swarm
Net::Ethereum::Swarm



11. Web3.py Ethereum Python
Web3.py

easysolc
Web3.py



abi


abi JSON



Truffle Web3.py


12.
-




USDRateOracle
-
Web Socket
RateUpdate
RateUpdate
-






, , Ethereum, . .

Fatal: Failed to write genesis block: unsupported fork ordering: eip150Block not enabled, but eip155Block enabled at 0
Ajoutez le paramètre eip150Block au fichier genesis.json:
{
"config": {
"chainId": 1999,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "10",
"gasLimit": "5100000",
"alloc": {}
}

Source: https://habr.com/ru/post/fr467347/


All Articles