Création et déploiement de contrats intelligents avec solidité

Création et déploiement de contrats intelligents avec solidité

1. Vue d'ensemble

La capacité à exécutersmart contracts est ce qui a rendu la blockchain Ethereum si populaire et perturbatrice.

Avant d'expliquer ce qu'est un contrat intelligent, commençons par une définition deblockchain:

Blockchain est une base de données publique qui conserve un enregistrement permanent des transactions numériques. Il fonctionne comme un système transactionnel sans confiance, un cadre dans lequel les individus peuvent effectuer des transactions entre homologues sans avoir besoin de faire confiance à un tiers ou à un autre.

Voyons comment nous pouvons créer des contrats intelligents sur Ethereum avecsolidity:

2. Ethereum

Ethereum est une plate-forme qui permet aux utilisateurs d'écrire des applications décentralisées en utilisant efficacement la technologie de la chaîne de blocs.

Une application décentralisée (Dapp) est un outil permettant aux personnes et aux organisations des différents côtés d'une interaction de se réunir sans intermédiaire centralisé. Les premiers exemples de Dapp incluent BitTorrent (partage de fichiers) et Bitcoin (monnaie).

Nous pouvons décrire Ethereum comme une blockchain avec un langage de programmation intégré.

2.1. Machine virtuelle Ethereum (EVM)

D'un point de vue pratique, l'EVM peut être considéré comme un grand système décentralisé contenant des millions d'objets, appelésaccounts, qui peuvent maintenir une base de données interne, exécuter du code et se parler.

Le premier type de compte est probablement le plus familier pour l'utilisateur moyen qui utilise le réseau. Son nom estEOA (compte externe); il est utilisé pour transmettre des valeurs (telles queEther) et est contrôlé par une clé privée.

D'un autre côté, il existe un autre type de compte qui est lecontract. Allons-y et voyons de quoi il s'agit:

3. Qu'est-ce qu'un contrat intelligent?

Unsmart contract est un script autonome généralementwritten in Solidity and compiled into binary or JSON and deployed to a specific address on the blockchain. De la même manière que nous pouvons appeler un point de terminaison URL spécifique d'une API RESTful pour exécuter une logique via unHttpRequest, nous pouvons de la même manière exécuter lessmart contract déployés à unaddress spécifique en soumettant le corriger les données ainsi que l'Ethereum nécessaire pour appeler les Solidityfunction déployés et compilés.

D'un point de vue commercial,it means that smart contract functions can be inherently monetized (similaire à une fonction AWS Lambda qui permet aux utilisateurs de payerper compute cycle plutôt queper instance). Surtout,smart contract functions n'a pas besoin de coûter Ethereum pour être exécuté.

En termes simples, nous pouvons voir unsmart contract comme une collection de code stocké dans le réseau blockchain qui définit les conditions sur lesquelles toutes les parties utilisant le contrat sont d'accord.

Cela permet aux développeurs de créer des choses qui n'ont pas encore été inventées. Pensez-y une seconde - il n'y a pas besoin d'un intermédiaire, et il n'y a pas non plus de risque de contrepartie. Nous pouvons créer de nouveaux marchés, stocker des registres de dettes ou de promesses et avoir l'assurance que nous avons les consensus du réseau qui valide les transactions.

N'importe qui peut déployer un contrat intelligent dans la base de données décentralisée moyennant des frais proportionnels à la taille de stockage du code contenu. Les nœuds souhaitant utiliser le contrat intelligent doivent en quelque sorte indiquer le résultat de leur participation au reste du réseau.

3.1. Solidité

Le langage principal utilisé dans Ethereum estSolidity - qui est un langage de type Javascript développé spécifiquement pour la rédaction de contrats intelligents. Solidity est typé de manière statique, prend en charge l'héritage, les bibliothèques et les types complexes définis par l'utilisateur, entre autres fonctionnalités.

Le compilateur Solidity convertit le code en bytecode EVM, qui peut ensuite être envoyé au réseau Ethereum en tant que transaction de déploiement. Ces déploiements entraînent des frais de transaction plus importants que les interactions contractuelles intelligentes et doivent être payés par le propriétaire du contrat.

4. Créer un contrat intelligent avec solidité

La première ligne d'un contrat de solidité définit la version du code source. Cela permet de garantir que le contrat ne se comporte pas soudainement différemment avec une nouvelle version de compilateur.

pragma solidity ^0.4.0;

Pour notre exemple, le nom du contrat estGreeting et comme nous pouvons le voir, sa création est similaire à une classe en Java ou dans un autre langage de programmation orienté objet:

contract Greeting {
    address creator;
    string message;

    // functions that interact with state variables
}

Dans cet exemple, nous avons déclaré deux variables d'état:creator etmessage. Dans Solidity, nous utilisons le type de données nomméaddress pour stocker les adresses des comptes.

Ensuite, nous devons initialiser les deux variables dans le constructeur.

4.1. Constructeur

Nous déclarons un constructeur en utilisant le mot-cléfunction suivi du nom du contrat (comme en Java).

Le constructeur est une fonction spéciale qui n'est appelée qu'une fois lorsqu'un contrat est déployé pour la première fois dans la chaîne de blocs Ethereum. Nous ne pouvons déclarer qu'un seul constructeur pour un contrat:

function Greeting(string _message) {
    message = _message;
    creator = msg.sender;
}

Nous injectons également la chaîne initiale_message en tant que paramètre dans le constructeur et la définissons sur la variable d'étatmessage.

Dans la deuxième ligne du constructeur, nous initialisons la variablecreator à une valeur appeléemsg.sender. La raison pour laquelle il n’est pas nécessaire d’injectermsg dans le constructeur est quemsg est une variable globale qui fournit des informations spécifiques sur le message, telles que l’adresse du compte qui l’envoie.

Nous pourrions potentiellement utiliser ces informations pour implémenter le contrôle d'accès pour certaines fonctions.

4.2. Méthodes Setter et Getter

Enfin, nous implémentons les méthodes setter et getter pour lesmessage:

function greet() constant returns (string) {
    return message;
}

function setGreeting(string _message) {
    message = _message;
}

L'appel de la fonctiongreet renverra simplement lemessage. actuellement enregistré Nous utilisons le mot cléconstant pour spécifier que cette fonction ne modifie pas l'état du contrat et ne déclenche aucune écriture dans la blockchain .

Nous pouvons maintenant changer la valeur de l'état dans le contrat en appelant la fonctionsetGreeting. N'importe qui peut modifier la valeur simplement en appelant cette fonction. Cette méthode n'a pas de type de retour, mais prend un typeString comme paramètre.

Maintenant que nous avons créé notre premier contrat intelligent, l'étape suivante consistera à le déployer dans la blockchain Ethereum afin que tout le monde puisse l'utiliser. Nous pouvons utiliserRemix, qui est actuellement le meilleur IDE en ligne et il est facile à utiliser.

5. Interagir avec un contrat intelligent

Pour interagir avec un contrat intelligent dans le réseau décentralisé (blockchain), nous devons avoir accès à l'un des clients.

Il existe deux façons de procéder:

Infura est l'option la plus simple, nous allons donc demander unfree access token. Une fois que nous nous sommes inscrits, nous devons choisir l'URL du réseau de test Rinkeby:“https://rinkeby.infura.io/<token>”.

Pour pouvoir effectuer des transactions avec le contrat intelligent de Java, nous devons utiliser une bibliothèque appeléeWeb3j. Voici la dépendance Maven:


    org.web3j
    core
    3.3.1

Et à Gradle:

compile ('org.web3j:core:3.3.1')

Avant de commencer à écrire du code, nous devons d’abord faire certaines choses.

5.1. Créer un portefeuille

Web3j nous permet d’utiliser certaines de ses fonctionnalités à partir de la ligne de commande:

  • Création de portefeuille

  • Portefeuille gestion de mot de passe

  • Transfert de fonds d'un portefeuille à un autre

  • Générer des wrappers de fonctions de contrat smart Solidity

Les outils de ligne de commande peuvent être obtenus sous forme de fichier zip / tarball à partir de la pagereleases du référentiel du projet, sous la section des téléchargements, ou pour les utilisateurs d'OS X via homebrew:

brew tap web3j/web3j
brew install web3j

Pour générer un nouveau portefeuille Ethereum, nous tapons simplement le texte suivant sur la ligne de commande:

$ web3j wallet create

Il nous demandera un mot de passe et un emplacement où nous pourrons économiser notre portefeuille. Le fichier est au format Json, et l’essentiel à garder à l’esprit est l’adresse Ethereum.

Nous l'utiliserons à l'étape suivante pour demander un Ether.

5.2. Demande d'éther dans le Rinkeby Testnet

Nous pouvons demander gratuitement Etherhere. Pour empêcher les acteurs malveillants d’épuiser tous les fonds disponibles, ils nous demandent de fournir un lien public à un message de média social avec notre adresse Ethereum.

C'est une étape très simple, ils fournissent presque instantanément l'éther pour que nous puissions exécuter les tests.

5.3. Générer le Smart Contract Wrapper

Web3j peut générer automatiquement du code wrapper de contrat intelligent pour déployer et interagir avec des contrats intelligents sans quitter la JVM.

Pour générer le code wrapper, nous devons compiler notre contrat intelligent. Nous pouvons trouver l'instruction pour installer le compilateurhere. De là, nous tapons ce qui suit sur la ligne de commande:

$ solc Greeting.sol --bin --abi --optimize -o /

Ce dernier créera deux fichiers:Greeting.bin etGreeting.abi. Maintenant, nous pouvons générer le code wrapper en utilisant les outils de ligne de commande de web3j:

$ web3j solidity generate /path/to/Greeting.bin
  /path/to/Greeting.abi -o /path/to/src/main/java -p com.your.organisation.name

Avec cela, nous allons maintenant avoir la classe Java pour interagir avec le contrat dans notre code principal.

6. Interagir avec le contrat intelligent

Dans notre classe principale, nous commençons par créer une nouvelle instance web3j pour se connecter aux nœuds distants du réseau:

Web3j web3j = Web3j.build(
  new HttpService("https://rinkeby.infura.io/"));

Nous devons ensuite charger notre fichier de portefeuille Ethereum:

Credentials credentials = WalletUtils.loadCredentials(
  "",
 "/path/to/");

Maintenant, déployons notre contrat intelligent:

Greeting contract = Greeting.deploy(
  web3j, credentials,
  ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT,
  "Hello blockchain world!").send();

Le déploiement du contrat peut prendre un certain temps en fonction du travail effectué sur le réseau. Une fois déployé, nous voudrons peut-être stocker l'adresse à laquelle le contrat a été déployé. Nous pouvons obtenir l'adresse de cette façon:

String contractAddress = contract.getContractAddress();

Toutes les transactions effectuées avec le contrat sont visibles dans l'url: «https://rinkeby.etherscan.io/address/<contract_address>”.

D'autre part, nous pouvons modifier la valeur du contrat intelligent effectuant une transaction:

TransactionReceipt transactionReceipt = contract.setGreeting("Hello again").send();

Enfin, si nous voulons voir la nouvelle valeur stockée, nous pouvons simplement écrire:

String newValue = contract.greet().send();

7. Conclusion

Dans ce didacticiel, nous avons vu queSolidity est un langage de programmation de type statique conçu pour développer des contrats intelligents qui s'exécutent sur l'EVM.

Nous avons également créé un contrat simple avec ce langage et avons constaté qu’il était très similaire à d’autres langages de programmation.

Lesmart contract n'est qu'une expression utilisée pour décrire un code informatique qui peut faciliter l'échange de valeur. Lorsqu'il est exécuté sur la blockchain, un contrat intelligent devient un programme informatique autonome qui s'exécute automatiquement lorsque des conditions spécifiques sont remplies.

Nous avons vu dans cet article que la possibilité d’exécuter du code dans la chaîne de blocs constitue la principale différenciation d’Ethereum, car elle permet aux développeurs de créer un nouveau type d’applications qui va bien au-delà de tout ce que nous avons vu auparavant.

Comme toujours, des échantillons de code peuvent être trouvésover on GitHub.