Tutoriel Solidity: une introduction à la programmation Solidity pour les débutants

Tutoriel Solidity

Solidity est un langage de haut niveau orienté objet pour le développement de dApps (applications décentralisées), sur la blockchain Ethereum.

Une blockchain est un réseau d’ordinateurs peer-to-peer, appelés nœuds, qui partagent toutes les données et le code du réseau.

Donc, si vous êtes un appareil connecté à la blockchain, vous êtes un nœud du réseau et vous parlez à tous les autres nœuds informatiques du réseau (nous parlerons de la configuration du nœud Ethereum sur votre machine locale dans des tutoriels ultérieurs).

Vous avez maintenant une copie de toutes les données et du code sur la blockchain. Il n’y a plus besoin de serveurs centraux.

Qu’est-ce que l’Ethereum?

Dans sa forme la plus simple, Ethereum est une plate-forme logicielle ouverte basée sur la technologie blockchain qui permet aux développeurs de créer et de déployer des applications décentralisées.

Alors que la blockchain Bitcoin est utilisée pour suivre la propriété de la monnaie numérique (bitcoins), la blockchain Ethereum se concentre sur l’exécution du code des applications décentralisées.

Dans la blockchain Ethereum, au lieu de miner pour Bitcoin, les mineurs travaillent pour gagner de l’Ether, un type de jeton cryptographique qui alimente le réseau. Au-delà d’une crypto-monnaie échangeable, Ether est également utilisé par les développeurs d’applications pour payer les frais de transaction et les services sur le réseau Ethereum.

Il existe un deuxième type de jeton utilisé pour payer les frais des mineurs pour inclure des transactions dans leur bloc, il s’appelle le gaz, et chaque exécution de contrat intelligent nécessite l’envoi d’une certaine quantité de gaz pour inciter les mineurs à la mettre en place. la blockchain.

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

Commencer par les bases

Le code de Solidity est encapsulé dans les contrats.

La blockchain Ethereum nous permet d’exécuter du code avec la machine virtuelle Ethereum (EVM) sur la blockchain avec quelque chose appelé un contrat intelligent.

Les contrats intelligents sont le lieu où vit toute la logique métier de notre application – toutes les variables et fonctions appartiennent à un contrat, et ce sera le point de départ de tous vos projets.

Les contacts intelligents sont écrits dans un langage de programmation appelé Solidity, qui ressemble à un mélange de Javascript et de C.

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

Remix IDE

Remix est un outil en ligne qui vous permet d’écrire des contrats intelligents Solidity, puis de les déployer et de les exécuter.

Allez simplement à https://remix.ethereum.org depuis votre navigateur et nous pouvons commencer à coder.

Comme vous pouvez le voir, vous pouvez choisir entre Solidity et Vyper. Les deux sont des langages pour la rédaction de contrats intelligents, Vyper est de type python et Solidity est de type javascript.

Les deux peuvent compiler avec le bytecode EVM, un peu comme Javascript et Typescript. Nous choisissons Solidity.

Sur le côté gauche, il y a l’explorateur de fichiers. Par défaut, il y a deux fichiers .sol, juste pour démontrer la syntaxe de base (ballot.sol est un contrat intelligent, ballot_test.sol est un script pour tester ce contrat intelligent).

Il vous suffit de cliquer sur ce bouton plus et nous pouvons commencer à coder notre premier contrat intelligent.

Tout code source Solidity doit commencer par un «pragma de version» – une déclaration de la version du compilateur Solidity que ce code doit utiliser. Cela permet d’éviter les problèmes avec les futures versions du compilateur, susceptibles d’introduire des modifications susceptibles de casser votre code.

Cela ressemble à ceci:

solidité pragma ^ 0,4,25;

(pour la version Solidity au-dessus de 0.4.25)

ou

solidité pragma >= 0,5,0 < 0,6,0;

(pour la version Solidity entre 0.5.0 et 0.6.0)

Ensuite, vous créez votre contrat en tapant le mot réservé Contrat et le nom de votre fichier .sol (il est important que le nom du contrat corresponde au nom du fichier, nous expliquerons pourquoi plus tard). Dans notre cas,

contrat MyFirstContract {

}

Compilons-le. Il vous suffit de naviguer vers cet onglet de compilation sur la gauche et de cliquer sur le gros bouton de compilation. Si quelque chose ne va pas avec le code, vous verrez des erreurs et des avertissements ici (soyez compatissant avec Solidity, c’est encore un «langage jeune»).

Avec notre contrat actuel, tout va bien car nous n’avons vraiment rien fait.

Maintenant, je vais générer une erreur exprès juste pour vous montrer quelque chose. Vous pouvez sélectionner manuellement le compilateur dans ce menu déroulant.

Choisissons par exemple la version 0.4.26. Maintenant, compilez-le à nouveau. Vous verrez maintenant une erreur “Compilateur pas encore chargé”.

C’est parce que nous avons spécifié avec pragma de travailler avec les versions de compilateur supérieures à 0.5.0. Changez simplement la version du compilateur à nouveau et l’erreur disparaîtra.

D’accord, codons maintenant!

Nous allons commencer par un simple code «Hello world» et obtenir et définir des fonctions, juste pour nous familiariser avec la syntaxe.

Un contrat au sens de Solidity est une collection de code (ses fonctions) et de données (son état) qui réside à une adresse spécifique sur la blockchain Ethereum.

Tout d’abord, définissons la variable d’état appelée message par exemple et son type sera string.

Notre fonction get renverra la valeur de notre message variable et la fonction set affectera une nouvelle valeur à notre message variable.

Comment taper des fonctions?

Premier mot réservé fonction puis le nom de la fonction et des paramètres particuliers et après cela .

function myFunction () renvoie (booléen) {

retourne vrai;

}

Les fonctions peuvent être Publique ou privé. Si une fonction est publique, elle peut être appelée en dehors du contrat. Si une fonction est privée, elle a une portée limitée et ne peut être appelée qu’à partir de son contrat actuel (à partir d’une autre fonction par exemple).

Voici la liste de tous les spécificateurs de visibilité de fonction:

  • Publique: visible en externe et en interne (crée une fonction getter pour les variables de stockage / d’état)
  • privé: visible uniquement dans le contrat en cours
  • externe: uniquement visible de l’extérieur (uniquement pour les fonctions) – c’est-à-dire ne peut être appelé que par message (via this.func)
  • interne: visible uniquement en interne

Les fonctions peuvent être pur, vue, ou payable. Si une fonction n’écrit aucune donnée sur la blockchain, il est très recommandé d’être view, car les fonctions view ne coûtent pas d’essence.

Voici la liste de tous les modificateurs de fonction (il y a aussi des modificateurs pour les variables d’état, les événements et les arguments d’événements, mais nous en parlerons plus tard):

  • pur: Interdit la modification ou l’accès à l’état.
  • vue: Interdit la modification de l’état.
  • payable: Leur permet de recevoir de l’éther avec un appel.

Si Function renvoie une valeur, vous devez la spécifier avec un mot réservé Retour puis entre crochets réguliers pour spécifier le type de retour de fonction. Dans notre cas, ce sera une chaîne (car nous renvoyons notre message variable qui est une chaîne)

Si la fonction ne renvoie aucune valeur, il n’est pas nécessaire de Retour déclaration.

Pour accéder à une variable d’état, vous n’avez pas besoin du préfixe ce. comme c’est courant dans d’autres langues.

Pour cette raison, une pratique courante consiste à écrire des arguments de fonction avec une syntaxe de soulignement (_un message). Cette convention vient de Javascript, où les méthodes et variables privées commencent par _.

Pour être clair, votre code fonctionnera correctement et sans traits de soulignement, mais il est plus propre avec eux.

Vous remarquerez un mot réservé Mémoire dans notre code. Si vous écrivez notre code sans mémoire et définissez pragma sur une version inférieure à 0,5. * Cela fonctionnera très bien, mais lorsque vous changez votre compilateur au-dessus de 0,5. * EVM génère une erreur de compilation.

Pourquoi cela arrive-t-il?

Eh bien, la machine virtuelle Ethereum a trois zones où elle peut stocker des éléments.

  • Le premier est espace de rangement, où résident toutes les variables d’état du contrat. Chaque contrat a son propre stockage et il est persistant entre les appels de fonction et assez coûteux à utiliser.
  • Le second est Mémoire, ceci est utilisé pour contenir des valeurs temporaires. Il est effacé entre les appels de fonction (externes) et son utilisation est moins chère.
  • Le troisième est le empiler, qui est utilisé pour contenir de petites variables locales. Il est presque gratuit à utiliser, mais ne peut contenir qu’un nombre limité de valeurs.

Pour presque tous les types, vous ne pouvez pas spécifier où ils doivent être stockés, car ils sont copiés à chaque fois qu’ils sont utilisés.

Mais lorsque vous travaillez avec des tableaux ou des structures, et à partir des dernières versions avec des chaînes également, le compilateur vous obligera à spécifier la zone de stockage.

Donc, notre code ressemble maintenant à ceci:

solidité pragma ^ 0,5,0;

contrat MyFirstContract {

message de chaîne;

function get () public view renvoie (string memory) {

message de retour;

}

jeu de fonctions (chaîne mémoire _message) public {

message = _message;

}

}

Veuillez noter que certains développeurs Solidity divisent ces spécificateurs de visibilité en lignes séparées afin de rendre le code plus propre. Donc, notre fonction get peut être écrite comme ceci:

fonction get ()

Publique

vue

renvoie (chaîne)

{

message de retour;

}

C’est vraiment à vous de décider comment vous choisissez d’écrire vos fonctions.

Compilons notre contrat maintenant et testons-le.

Pour le compiler, répétez simplement les étapes ci-dessous (Compilez .sol bouton ou cmd / ctrl + S du clavier et il le recompilera automatiquement)

Pour voir comment cela fonctionne (si la compilation ne génère pas d’erreurs), vous devez déployer votre contrat.

Pour ce faire, accédez à cet onglet Déploiement à gauche, pour l’environnement, sélectionnez JavaScriptVM et appuyez sur le bouton Déployer.

Après le déploiement, nous pouvons maintenant voir les méthodes de notre contrat. Concentrons-nous uniquement sur cette partie de l’écran maintenant.

Vous pouvez voir qu’il y a deux boutons (obtenir & set) pour nos deux fonctions publiques. Si l’un d’entre eux était privé, nous ne le verrions pas ici.

Si nous cliquons sur le bouton get, EVM exécutera notre fonction get.

Voyons comment cela a fonctionné.

Nous avons une chaîne vide. Pas génial, pas terrible. Mais pourquoi? Eh bien, parce que nous n’avons pas initialisé notre variable de message à la première place.

Juste une courte pause. Je veux que vous vous présentiez au Remix Terminal. C’est sous l’éditeur de code et ici vous pouvez suivre toutes vos transactions, voir si elles sont exécutées avec succès ou non, les déboguer, voir les détails (hachage de transaction, etc.) et plus.

Pour l’instant, nous avons deux transactions réussies. L’un est le déploiement de contrat et cela nous coûte de l’éther (mais ne vous inquiétez pas, nous sommes dans l’éditeur maintenant tout est virtuel) et le second est Call of our vue fonction.

Ok, revenons maintenant. Que se passera-t-il si nous appelons la fonction set maintenant?

Nous devons passer un argument _message («Hello World» par exemple) et appuyer sur le bouton Transact pour exécuter la fonction. Vous pouvez suivre le succès de la transaction dans le terminal.

Maintenant, appelons à nouveau get function. Maintenant, il renvoie notre message.

Apportons quelques améliorations à notre code. Nous n’avons pas initialisé notre message variable. Faisons cela.

contrat MyFirstContract {

message de chaîne = "Bonjour le monde!";

function get () public view renvoie (string memory) {

message de retour;

}

jeu de fonctions (chaîne mémoire _message) public {

message = _message;

}

}

Notez que le message est maintenant “Hello world!”, Et que lorsque nous appelons la fonction get pour la première fois, il ne renvoie pas de chaîne vide.

Pour tester cela, nous devons compiler notre contrat (cmd / ctrl + S).

Puis pour le déployer à nouveau. Nous devons créer une nouvelle instance de contrat (en raison des modifications que nous avons apportées) et la publier sur la blockchain.

Supprimez simplement la version précédente de l’éditeur (pas de notre blockchain virtuelle bien sûr) et appuyez à nouveau sur le bouton Déployer. Appelons notre fonction get maintenant.

Agréable! Appelons maintenant la fonction set.

Et recommence.

Frais.

Faisons maintenant de notre message un constant.

Notre code maintenant:

solidité pragma ^ 0,5,0;

contrat MyFirstContract {

message constant de chaîne = "Bonjour le monde!";

function get () public view renvoie (string memory) {

message de retour;

}

jeu de fonctions (chaîne mémoire _message) public {

message = _message;

}

}

Lorsque nous essayons de le compiler, nous obtenons une erreur dans notre fonction set. C’est parce qu’il est impossible de modifier la valeur d’une constante.

Nous allons simplement nous débarrasser de cette constante maintenant.

Initialiser des variables comme celle-ci n’est pas une erreur, mais c’est bien mieux si nous le faisons dans le constructeur. Vous pouvez écrire un constructeur dans Solidity avec:

constructor () public {

// faire quelque chose…

}

Le constructeur n’est qu’une autre fonction appelée lors du déploiement du contrat intelligent. Notre code est un peu différent, mais il fonctionne de la même manière.

solidité pragma ^ 0,5,0;

contrat MyFirstContract {

message de chaîne;

constructor () public {

message = "Bonjour le monde!";

}

function get () public view renvoie (string memory) {

message de retour;

}

jeu de fonctions (chaîne mémoire _message) public {

message = _message;

}

}

Vous pouvez le recompiler et le tester si vous le souhaitez.

Enfin, on peut changer la visibilité des variables d’état. Si vous faites vos variables d’état Publique cela signifie que l’on peut réclamer leurs valeurs à l’extérieur du contrat.

Solidity fera pour chaque variable d’état public une méthode avec le même nom qui peut être appelée comme une fonction régulière (un peu comme une fonction getter).

Cela signifie que nous pouvons nous débarrasser de notre fonction get, déclarez simplement le message variable comme Publique, et notre code fonctionnera de la même manière, il sera beaucoup plus propre et il nous en coûtera moins cher de le déployer un jour sur le réseau principal.

Plus le code est gros, plus il faut de gaz pour l’exécuter et le coût de fonctionnement de notre dApp augmente.

Lorsque nous développons des contrats intelligents, nous devons être:

  • efficace – le débit de gaz consommé doit être faible
  • précis – une fois que vous déployez un contrat intelligent, il ne peut pas être changé et il est public 24 / 7h, chaque ligne de code (imaginez un hacker qui trouve un bug et peut exploiter votre dApp)

Notre code final pour aujourd’hui ressemble à ceci:

solidité pragma ^ 0,5,0;

contrat MyFirstContract {

message public string;

constructor () public {

message = "Bonjour le monde!";

}

jeu de fonctions (chaîne mémoire _message) public {

message = _message;

}

}

Déployons-le et testons-le.

Vous pouvez voir ce bouton de message. Il est créé car notre message de variable d’état est public.

Si nous appelons cela, cela devrait nous renvoyer une valeur qui est en cours d’initialisation via le constructeur (c’est «Hello world!»).

Joli. Testons la fonction maintenant.

Comment apprendre Solidity?

Solidity lui-même est un langage assez simple, mais pour être un bon développeur Solidity, il faut comprendre comment tout fonctionne sur Ethereum.

  • Solidity est un langage de programmation de haut niveau avec une syntaxe similaire à ECMAScript (javascript).
  • Il se compile en bytecode EVM, ce que seul l’EVM peut comprendre.
  • Le compilateur s’appelle Solc.

Prenons ce contrat simple comme exemple:

solidité pragma ^ 0,5,0;

exemple de contrat {

uint a = 10 + 5;

}

Aussi simple que cela. Maintenant, compilons-le. Si nous allons aux détails du contrat dans le terminal, nous pouvons voir beaucoup d’informations.

Dans ce cas, le code compilé est:

0x6080604052600f600055348015601457600080fd5b5060358060226000396000f3fe6080604052600080fdfea165627a7a72305820bf75c57b7d8745a79baee513ead21a9eb8b075896f8e574c591c168b075896f8e4c574c591c16591c16591c16591c16

Ces valeurs longues sont une représentation hexadécimale du contrat final, également appelé bytecode. EVM ne comprend que le bytecode.

Mais, si quelque chose ne va pas, nous nous retrouvons coincés avec une erreur par exemple, on ne peut pas déboguer le bytecode.

Opcodes

La langue au-dessus du bytecode est l’opcode. Opcode est un langage de programmation de bas niveau. Solidity et Opcode sont comme C et Assembly Language par exemple.

Ainsi, lorsque nous devons déboguer une transaction qui a échoué, nous débogageons l’opcode.

Une chose que vous devez savoir sur Solidity et le débogage – c’est très difficile. Mais pas impossible, alors plongons-y.

Voici l’opcode de notre exemple de contrat:

0 PUSH1 60

02 PUSH1 40

04 MSTORE

05 PUSH1 0f

07 PUSH1 00

09 SSTORE

10 VALEUR D’APPEL

11 DUP1

12 ISZERO

13 PUSH1 14

15 JUMPI

16 PUSH1 00

18 DUP1

19 REVERT

20 JUMPDEST

21 POP

22 PUSH1 35

24 DUP1

25 PUSH1 22

27 PUSH1 00

29 CODÉCOPIE

30 PUSH1 00

32 RETOUR

33 INVALIDE

34 PUSH1 80

36 PUSH1 40

38 MSTORE

39 PUSH1 00

41 DUP1

42 REVERT

43 INVALIDE

44 LOG1

45 PUSH6 627a7a723058

52 SHA3

53 INVALIDE

54 PUSH22 c57b7d8745a79baee513ead21a9eb8b075896f8e4c59

77 INVALIDE

78 DUP10

79 ET

80 JUMPI

81 INVALIDE

82 SOLDE

83 PUSH29 750029

Les opcodes sont les instructions lisibles par l’homme de bas niveau du programme. Tous les opcodes ont leurs équivalents hexadécimaux, par exemple MSTORE est 0x52.

L’EVM est Stack Machine. Il est basé sur la structure LIFO (Last In First Out). Pour simplifier, imaginez empiler des tranches de pain dans un micro-ondes, la DERNIÈRE tranche que vous mettez est la PREMIÈRE que vous sortez.

En arithmétique normale, nous écrivons notre équation de cette façon:

10 + 2 * 2

et la réponse est 14, car nous faisons la multiplication avant l’addition.

Dans une machine à empiler, il fonctionne selon le principe LIFO:

2 2 * 10 +

Cela signifie, mettez d’abord 2 dans la pile, suivi d’un autre 2, puis suivi d’une action de multiplication. Le résultat est 4 assis sur le dessus de la pile. Maintenant, ajoutez un nombre 10 au dessus de 4 et finalement additionnez les 2 nombres ensemble. La valeur finale de la pile devient 14.

L’action de mettre des données dans la pile est appelée l’instruction PUSH et l’action de supprimer des données de la pile est appelée l’instruction POP. Il est évident que l’opcode le plus courant que nous voyons dans notre exemple ci-dessus est PUSH1, ce qui signifie mettre 1 octet de données dans la pile.

Donc, cette instruction:

PUSH1 0x60

signifie mettre une valeur de 1 octet de «0x60» dans la pile. Par coïncidence, la valeur hexadécimale de PUSH1 se trouve être également «0x60». En supprimant le “0x” non obligatoire, nous pourrions écrire cette logique en bytecode comme “6060”.

Allons un peu plus loin.

PUSH1 0x60 PUSH1 0x40 MSTORE

Le MSTORE (0x52) prend 2 entrées et ne produit aucune sortie. Les opcodes ci-dessus signifient:

PUSH1 (0x60): mettez 0x60 dans la pile.

PUSH1 (0x40): mettez 0x40 dans la pile.

MSTORE (0x52): allouez 0x60 d’espace mémoire et passez à la position 0x40.

Le bytecode résultant est:

6060604052

En fait, nous voyons toujours ce nombre magique «6060604052» au début de tout bytecode de solidité parce que c’est comme ça que le contrat intelligent bootstrap.

Pour compliquer davantage les choses, 0x40 ou 0x60 ne peuvent pas être interprétés comme le nombre réel 40 ou 60. Comme ils sont hexadécimaux, 40 équivaut en fait à 64 (16¹ x 4) et 60 équivaut à 96 (16¹ x 6) en décimal.

En bref, ce que fait «PUSH1 0x60 PUSH1 0x40 MSTORE» est d’allouer 96 octets de mémoire et de déplacer le pointeur au début du 64e octet. Nous avons maintenant 64 octets pour l’espace de travail et 32 ​​octets pour le stockage en mémoire temporaire.

Dans l’EVM, il existe 3 emplacements pour stocker les données. Premièrement, dans la pile. Nous venons d’utiliser l’opcode PUSH pour y stocker des données comme dans l’exemple ci-dessus.

Deuxièmement dans la mémoire (RAM) où nous utilisons l’opcode MSTORE et enfin, dans le stockage sur disque où nous utilisons SSTORE pour stocker les données. Le gaz nécessaire pour stocker les données dans le stockage est le plus cher et le stockage des données à empiler est le moins cher.

Il est maintenant temps de revenir à notre code Solidity de ce tutoriel et de récapituler ce que nous avons appris sur le mot réservé Mémoire et comment le compilateur nous oblige à spécifier comment nous stockons les chaînes, par exemple.

Nous n’avons couvert que les bases du bytecode et de quelques opcodes.

Nous n’avons pas besoin de connaître les opcodes pour commencer à écrire un contrat intelligent!

D’autre part, la gestion des erreurs EVM est toujours très primitive et il est pratique de regarder les opcodes lorsque les choses tournent mal.

Conclusion

Cette première leçon a un peu plus de théorie que de codage réel, mais il est très important pour les débutants de savoir comment les choses fonctionnent sur Ethereum. Dans les prochains tutoriels, nous écrirons du code plus intéressant et apprendrons à déployer notre propre jeton sur la blockchain Ethereum.

Jusque là &# 128075;

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map