Les langages des contrats intelligents
Dernière modification: @DylanCONIN(opens in a new tab), 17 juin 2024
Un aspect important d'Ethereum est que les contrats intelligents peuvent être programmés en utilisant des langages relativement conviviaux pour les développeurs. Si vous maitrisez Python ou n'importe quel langage d'accolades(opens in a new tab), vous pouvez trouver un langage avec une syntaxe qui vous sera familière.
Les deux langages les plus actifs et les plus suivis sont :
- Solidity
- Vyper
Des développeurs plus expérimentés peuvent choisir d'utiliser Yul, un langage intermédiaire pour la machine virtuelle Ethereum (EVM), ou Yul+, une extension de Yul.
Si vous êtes curieux et que vous aimez aider à tester de nouveaux langages encore en cours de développement, vous pouvez essayer Fe, un nouveau langage pour contrat intelligent qui en est encore à ses balbutiements.
Prérequis
La connaissance de langages de programmation comme JavaScript ou Python peut vous aider à comprendre les différences entre les langages de contrats intelligents. Nous vous conseillons également d'avoir compris le concept des contrats intelligents avant de vous plonger dans les comparaisons entre les différents langages. Lire la page Introduction aux contrats intelligents
Solidity
- Un langage orienté objet et de haut niveau pour la mise en œuvre de contrats intelligents.
- Un langage à accolades principalement influencé par C++.
- Typé statiquement (le type d'une variable est connu au moment de la compilation)
- Prend en charge les éléments suivants :
- Héritage : Vous pouvez prolonger d'autres contrats.
- Bibliothèques : Vous pouvez créer du code réutilisable que vous pouvez appeler à partir de différents contrats, comme les fonctions statiques d'une classe statique dans d'autres langages de programmation orientés objets.
- Types complexes défini par l'utilisateur
Liens importants
- Documentation(opens in a new tab)
- Portail Solidity(opens in a new tab)
- Solidity by Example(opens in a new tab)
- GitHub(opens in a new tab)
- Solidity Gitter Chatroom(opens in a new tab) en jonction avec Solidity Matrix Chatroom(opens in a new tab)
- Cheat Sheet(opens in a new tab)
- Blog Solidity(opens in a new tab)
- Twitter Solidity(opens in a new tab)
Exemple de contrat
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // The keyword "public" makes variables6 // accessible from other contracts7 address public minter;8 mapping (address => uint) public balances;910 // Events allow clients to react to specific11 // contract changes you declare12 event Sent(address from, address to, uint amount);1314 // Constructor code is only run when the contract15 // is created16 constructor() {17 minter = msg.sender;18 }1920 // Sends an amount of newly created coins to an address21 // Can only be called by the contract creator22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Sends an amount of existing coins29 // from any caller to an address30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Insufficient balance.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}Afficher toutCopier
Cet exemple devrait vous donner une idée de la syntaxe d'un contrat Solidity. Pour une description plus détaillée des fonctions et des variables, consultez la documentation(opens in a new tab).
Vyper
- Langage de programmation pythonique
- Typage fort
- Code de compilation concis et compréhensible
- Génération efficace du bytecode
- A intentionnellement moins de fonctionnalités que Solidity dans le but de rendre les contrats plus sécurisés et plus faciles à auditer. Vyper ne prend pas en charge les éléments suivants :
- Modificateurs
- Héritage
- Assemblage en ligne
- Surcharge des fonctions
- Surcharge d’opérateur
- Appels récurrents
- Boucles infinies
- Points fixes binaires
Pour plus d'informations, lisez cette page Vyper(opens in a new tab).
Liens importants
- Documentation(opens in a new tab)
- Vyper par exemple(opens in a new tab)
- Plus de Vyper par exemple(opens in a new tab)
- GitHub(opens in a new tab)
- Discussion Discord pour la Communauté Vyper(opens in a new tab)
- Cheat Sheet(opens in a new tab)
- Cadres et outils de développement des Contrats intelligents pour Vyper
- VyperPunk - apprendre à sécuriser et à pirater les contrats intelligents Vyper(opens in a new tab)
- VyperExamples - exemples de vulnérabilités Vyper(opens in a new tab)
- Hub Vyper pour le développement(opens in a new tab)
- Exemples des meilleurs contrats intelligents pour Vyper(opens in a new tab)
- Des ressources géniales liées à Vyper(opens in a new tab)
Exemple
1# Open Auction23# Auction params4# Beneficiary receives money from the highest bidder5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# Current state of auction10highestBidder: public(address)11highestBid: public(uint256)1213# Set to true at the end, disallows any change14ended: public(bool)1516# Keep track of refunded bids so we can follow the withdraw pattern17pendingReturns: public(HashMap[address, uint256])1819# Create a simple auction with `_bidding_time`20# seconds bidding time on behalf of the21# beneficiary address `_beneficiary`.22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# Bid on the auction with the value sent29# together with this transaction.30# The value will only be refunded if the31# auction is not won.32@external33@payable34def bid():35 # Check if bidding period is over.36 assert block.timestamp < self.auctionEnd37 # Check if bid is high enough38 assert msg.value > self.highestBid39 # Track the refund for the previous high bidder40 self.pendingReturns[self.highestBidder] += self.highestBid41 # Track new high bid42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# Withdraw a previously refunded bid. The withdraw pattern is46# used here to avoid a security issue. If refunds were directly47# sent as part of bid(), a malicious bidding contract could block48# those refunds and thus block new higher bids from coming in.49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# End the auction and send the highest bid56# to the beneficiary.57@external58def endAuction():59 # It is a good guideline to structure functions that interact60 # with other contracts (i.e. they call functions or send ether)61 # into three phases:62 # 1. checking conditions63 # 2. performing actions (potentially changing conditions)64 # 3. interacting with other contracts65 # If these phases are mixed up, the other contract could call66 # back into the current contract and modify the state or cause67 # effects (ether payout) to be performed multiple times.68 # If functions called internally include interaction with external69 # contracts, they also have to be considered interaction with70 # external contracts.7172 # 1. Conditions73 # Check if auction endtime has been reached74 assert block.timestamp >= self.auctionEnd75 # Check if this function has already been called76 assert not self.ended7778 # 2. Effects79 self.ended = True8081 # 3. Interaction82 send(self.beneficiary, self.highestBid)Afficher toutCopier
Cet exemple devrait vous donner une idée de la syntaxe d'un contrat Vyper. Pour une description plus détaillée des fonctions et des variables, consultez la documentation(opens in a new tab).
Yul et Yul+
Si vous débutez avec Ethereum et que vous n'avez pas encore jamais codé avec des langages de contrats intelligents, nous vous recommandons de commencer avec Solidity ou Vyper. Intéressez-vous à Yul ou Yul+ seulement une fois que vous êtes familiarisé avec les bonnes pratiques de sécurité pour les contrats intelligents et les spécificités de l'EVM.
Yul
- Langage intermédiaire pour Ethereum
- Prends en charge l'EVM et l'Ewasm(opens in a new tab), un assemblage Web au petit goût d'Ethereum conçu pour être un dénominateur commun utilisable sur les deux plateformes.
- Excellente cible pour les phases d'optimisation de haut niveau qui peuvent bénéficier à la fois aux plateformes EVM et eWASM.
Yul+
- Extension de Yul de bas niveau très efficace
- Initialement conçue pour un contrat de rollup optimiste.
- Yul+ peut être considéré comme une proposition de mise à niveau expérimentale de Yul, qui y ajoute de nouvelles fonctionnalités
Liens importants
- Documentation Yul(opens in a new tab)
- Documentation Yul+(opens in a new tab)
- Terrain de jeu Yul+(opens in a new tab)
- Article d'introduction à Yul+(opens in a new tab)
Exemple de contrat
Cet exemple simple implémente une fonction puissance. Il peut être compilé en utilisant solc --strict-assembly --bin input.yul
et devrait être stocké dans le fichier input.yul.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {9 result := power(mul(base, base), div(exponent, 2))10 if mod(exponent, 2) { result := mul(base, result) }11 }12 }13 let res := power(calldataload(0), calldataload(32))14 mstore(0, res)15 return(0, 32)16}Afficher tout
Si vous avez déjà une bonne expérience en développement de contrats intelligents, vous trouverez ici une implémentation complète ERC20 dans Yul(opens in a new tab).
Fe
- Langage statique pour la Machine Virtuelle Ethereum (EVM).
- Inspiré par Python et Rust.
- Son objectif est d'être facile à apprendre, même pour les développeurs qui sont nouveaux dans l'écosystème Ethereum.
- Le développement de Fe en est encore à ses débuts, le langage a connu sa version alpha en janvier 2021.
Liens importants
- GitHub(opens in a new tab)
- Annonce de Fe(opens in a new tab)
- Feuille de route 2021 pour Fe(opens in a new tab)
- Chat de discussion Fe(opens in a new tab)
- Twitter Fe(opens in a new tab)
Exemple de contrat
Ceci est un simple contrat implémenté dans Fe.
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16Afficher tout
Comment choisir
Comme pour tout autre langage de programmation, il s'agit surtout de choisir le bon outil en fonction du travail à effectuer et des préférences personnelles.
Voici quelques éléments à considérer si vous n'en avez encore essayé :
Quels sont les avantages de Solidity ?
- Si vous débutez, il existe de nombreux tutoriels et outils d'apprentissage. Pour plus d'infos, consultez la page Apprendre en codant.
- De bons outils de développement sont disponibles.
- Solidity dispose d'une importante communauté de développeurs, ce qui signifie que vous obtiendrez probablement des réponses à vos questions très rapidement.
Quels sont les avantages de Vyper ?
- Excellent moyen de commencer pour les développeurs Python qui veulent rédiger des contrats intelligents.
- Vyper dispose d'un nombre plus restreint de fonctionnalités, ce qui en fait un langage idéal pour un prototypage rapide des idées.
- Il est conçu de façon à être facile à contrôler et extrêmement lisible pour l'être humain.
Quels sont les avantages de Yul et Yul+ ?
- Language simple et fonctionnel de bas niveau.
- Permet de se rapprocher au plus près de l'EVM brute, ce qui peut aider à optimiser l'utilisation du gaz de vos contrats.
Comparaison des langages
Pour des comparaisons de la syntaxe de base, du cycle de vie des contrats, des interfaces, des opérateurs, des structures de données, des fonctions, du flux de contrôle, et plus encore, consultez la page Auditless Solidity & Vyper Cheat Sheet(opens in a new tab)
Complément d'information
- Bibliothèque de contrats Solidity par OpenZeppelin(opens in a new tab)
- Solidity by Example(opens in a new tab)