Les contrats intelligents sont des morceaux de code programmables qui s'exécutent uniquement lorsque un ensemble de conditions sont remplies. Ils sont synonymes de contrats du monde réel légalement contraignants ; seulement dans ce cas, le code fait loi. Comme les contrats intelligents résident sur la chaîne de blocs, ils sont immuables — ils ne peuvent pas être altérés. C'est cette caractéristique d'immuabilité qui rend les contrats intelligents spéciaux, entre autres choses.
Contrats intelligentssont destinés à automatiser les transactions spécifiques à la blockchain. Comme ce sont des contrats conditionnels, ils ne nécessitent pas d'intermédiaires. Ce qui rend les smart contracts utiles, c'est leur compatibilité dans un large éventail de cas d'utilisation, y compris les services financiers, la gestion de la chaîne d'approvisionnement, et plus encore. Et contrairement aux blocs de code traditionnels qui sont programmés d'un seul coup, les smart contracts nécessitent des stratégies hautement sécurisées et chronophages.
Comment les contrats intelligents s'alignent-ils avec la technologie blockchain : BeInCrypto
Le mot à la mode “web3” suggère les habitudes de programmation laxistes et peu sécurisées du web. Lorsque la crypto ou les contrats intelligents sont programmés comme une page web, ils sont voués à l'échec. Les blockchains et leurs applications durablement réussies reposent sur des méthodes de programmation bien plus sécurisées, soigneuses et lentes.
Nick Szabo, cryptographe et informaticien : Twitter
Les contrats intelligents peuvent fonctionner avec des jetons spécifiques à la blockchain, tels que les ERC-20 pour la blockchain Ethereum, en incitant les efforts et en déplaçant les transactions. Comme le code, les conditions et les coûts sont impliqués, vous devriez faire attention à les lire, les écrire et les auditer.
La véritable importance des contrats intelligents concerne leur nature et leur positionnement. Pour un scénario donné — disons une personne A transférant des fonds à une personne B lorsque B termine un service — une copie du contrat intelligent est enregistrée et exécutée par les nœuds de la blockchain. Les contrats intelligents sont enregistrés sous forme de codes de contrat au sein de la chaîne. Cette validation multi-chemin est une caractéristique propre à la blockchain et maintient la sécurité des données.
De plus, il existe des contrats intelligents séquentiels ou synchrones et contrats intelligents asynchronesoù les tâches sont exécutées en parallèle. Par conséquent, le type et le but d'un contrat intelligent déterminent comment il est écrit, lu ou même audité.
Les contrats traditionnels, les actes de propriété, les testaments, etc. relèvent du droit privé, «rédigés par des particuliers plutôt que par des politiciens ou des fonctionnaires gouvernementaux». Les contrats intelligents sont une nouvelle forme de création de règles décentralisée.https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4)15 mars 2018
Considérons un pool de liquidité standard gouverné par un smart contract.
Imaginez que le pool de jetons peut être utilisé pour le trading, et à chaque fois qu'un échange réussi se produit, 0,3% de la valeur totale de l'échange est envoyée au fournisseur de liquidités qui a rendu cet échange possible ou a ajouté de la liquidité pour cet actif échangeable donné. Toutes les conditions mettant en lumière les scénarios d'échange, les frais de trading et les conditions de non-conformité et d'échec de l'échange sont codées comme un Smart Contract, qui est stocké dans la chaîne sous forme de code de contrat.
Nous ne pouvons pas plonger profondément dans la lecture, l'écriture et l'audit des contrats si nous ne sommes pas conscients de leurs caractéristiques. Voici les traits standard des contrats intelligents dont il faut être conscient :
Quelques caractéristiques d'un contrat intelligent standard : BeInCrypto
Les contrats intelligents ne sont que des morceaux de code. Vous pouvez écrire des contrats intelligents pour exécuter des commandes et des scénarios en fonction de conditions spécifiques. C'est pourquoi les développeurs de contrats intelligents et les programmeurs sont actuellement très demandés, car la plupart des DeFil'espace repose déjà sur des contrats intelligents pour traiter des cas complexes comme la gestion des frais de transaction à travers les pools de liquidité, le maintien APYratios, et plus encore.
Les contrats intelligents résidant sur la blockchain éliminent l'intervention humaine. Cela les rend entièrement sans confiance. Par exemple, si un spécifique DeFiprotocole, régi par des contrat(s) intelligents, accepte de liquider vos actifs une fois que la valeur tombe en dessous d'un seuil, aucune intervention humaine ne peut ou ne doit l'arrêter. Le code gère le paiement, la performance, la gestion et l'application des règles, rendant tout l'espace complètement sans confiance.
Comme mentionné précédemment, les contrats intelligents sont chargés d'ensembles d'instructions auto-exécutantes. En termes de codage, cela signifie avoir des itérations et des boucles intégrées dans le canevas de base. Cela garantit que des tâches telles que les paiements, les retraits, les dépôts, la pénalisation des validateurs via le slashing, et plusieurs autres tâches sont gérées de manière autonome.
Et enfin, comme les contrats intelligents sont sécurisés à l’aide de la cryptographie, il est incroyablement difficile de les violer. Sans vulnérabilité intégrée, contourner un contrat intelligent signifierait essayer de le violer au grand jour, devant l’ensemble de la blockchain.
Les transactions traitées via les contrats intelligents sont auto-vérifiables. Cela signifie que l'exécution est une preuve suffisante que la transaction a eu lieu en premier lieu, car aucun élément humain n'est impliqué. Le mécanisme d'auto-vérification donne aux contrats intelligents un avantage sur les contrats traditionnels régissant les configurations bancaires héritées.
Donc la prochaine fois que vous prévoyez de lire un smart contract, assurez-vous que le gabarit ou la documentation comporte toutes les caractéristiques mentionnées.
Une version simplifiée des contrats intelligents: Reddit
Voici un contrat intelligent simple représentant un compte de consignation. Les utilisateurs déposent leurs fonds dans la consignation, qui les transfère ensuite au destinataire après un certain laps de temps.
/ SPDX-License-Identifier : MITpragma solidity ^0.8.0 ;// Basic Smart Contract Boilerplatecontract SimpleTrustlessEscrow {// Variables d’étatadresse déposant public ; // Compte déposant etheraddress payable bénéficiaire public ; // Compte recevant etheruint256 public releaseTime ; // Horodatage pour libérer ether// Evénements de vérification de l’activité du contratevent Deposited(adresse indexée _from, uint256 _value) ; event Released(adresse indexée _to, uint256 _value) ;// Le constructeur du contrat initialise le constructeur du contrat intelligent(adresse payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, « L’heure de publication doit être dans le futur ») ; Sécurisé et sans confiance : le contrat lie le déposant et le déposant bénéficiaire = msg.sender ; bénéficiaire = _beneficiary ; releaseTime = _releaseTime ;}Fonction de dépôt – exécution autonome (fonction de secours)receive() external payable { emit Deposited(msg.sender, msg.value) ;}Libérer l’ether dans la fonction bénéficiaire release() public { // Programmable : Ne peut être exécuté qu’après releaseTime require(block.timestamp >= releaseTime, « Trop tôt pour libérer ») ; Autonome : S’exécute automatiquement en fonction de la condition uint256 amount = address(this).balance ; bénéficiaire.transfert(montant) ; emit Libéré(bénéficiaire, montant) ;}}
Alors que nous allons décrypter et lire ce smart contract en détail, vérifions d'abord s'il respecte les caractéristiques de contrat mentionnées.
Regardez de près le contrat pour ce morceau de code :
require(block.timestamp >= releaseTime, "Trop tôt pour libérer");
uint256 montant = address(this).balance;
bénéficiaire.transfert(montant);
Les fonds ne doivent être débloqués que lorsqu’une condition spécifique de releaseTime est remplie, ce qui rend ces contrats programmables.
Voici un petit extrait de code rapide ci-dessus :
déposant = msg.sender ;
bénéficiaire = _bénéficiaire;
releaseTime = _releaseTime;
Dans le contrat, tout le monde est lié par le code, du déposant à la personne recevant les fonds. Personne n'a besoin d'interagir ou de faire confiance à l'autre car la fonction de transfert de fonds est liée par releaseTime - un paramètre basé sur le code.
Voici la partie "libération de fonds" du code :
function release() public {require(block.timestamp >= releaseTime, “Trop tôt pour libérer”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}
L'ensemble du processus est autonome, car les fonds ne sont libérés que lorsque le releaseTime répond à un certain critère. Remarquez que le code n'est pas partiellement programmable mais entièrement autonome.
D’autres éléments du code du contrat intelligent, notamment la fonction de dépôt, peuvent également être rendus complètement autonomes en fonction des fonctionnalités que vous souhaitez inclure. Par exemple, vous pouvez lancer un plan de dépôt récurrent chaque fois que l’utilisateur portefeuillecroise les 100 $, avec le montant excédentaire transféré au bénéficiaire.
Se préoccuper de l’élément qui se prête sécuritéau contrat ? Consultez cette partie du code :
constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, « L’heure de libération doit être dans le futur ») ; déposant = msg.sender ; bénéficiaire = _beneficiary ; releaseTime = _releaseTime ;}
Remarquez comment il y a une préséance définie de la fonction releaseTime par rapport au timestamp. Rien n'est aléatoire, et les conditions doivent être remplies.
Chaque transaction associée au contrat intelligent est enregistrée au sein de la chaîne, grâce à des éléments d’activité de journal distincts.
Événement Déposé(address indexé _from, uint256 _valeur);
event Released(adresse indexée _to, uint256 _value) ;
emit Deposited(msg.sender, msg.value) ;
emit Released(bénéficiaire, montant);
Maintenant que nous avons identifié les éléments qui définissent les caractéristiques d'un contrat intelligent, voici les autres éléments du contrat pour vous aider à mieux comprendre le sujet.
Pragma solidité ^0.8.0; – La version du langage de programmation Solidity nécessaire pour écrire ce contrat intelligent.
// SPDX-License-Identifier: MIT - Termed Software Package Data Exchange, this identifier states the license of the code release. It is advisable to include this to let people know if it’s open source and can be worked around or not.
Contrat TimeLock { - Attribue un nom au contrat intelligent, comme une étiquette.
Adresse du déposant public; - Comme le contrat implique un déposant et un bénéficiaire, c'est à ce moment que l'adresse publique du déposant est mentionnée. Cette variable est le Portefeuille Ethereumadresse et est visible publiquement.
Adresse payable publique du bénéficiaire; – Il s'agit de l'adresse publique du bénéficiaire où l'entiercement transfère des fonds. Elle est également lisible et confère une impression de transparence aux contrats intelligents alimentés par la blockchain.
Uint256 public releaseTime; – Comme il s'agit d'un contrat à durée déterminée, le uint256 attribue la variable basée sur le temps au contrat. Ce sera le délai selon lequel les fonds seront libérés.
En Solidity, uint (entier non signé) est la manière d'attribuer des valeurs basées sur des entiers. Le suffixe 256 représente un grand espace de stockage de nombres.
après 5 ans à écrire des smart contracts, je réalise seulement aujourd'hui que le logo de Solidity est le logo d'Ethereum déplié 🨯pic.twitter.com/wlM369Eff9
— kaden.eth ( @0xKaden) 8 juillet 2023
Vous pouvez envisager de lire Documentation de Soliditypour se familiariser avec la syntaxe, les expressions et les autres éléments de code.
constructeur(adresse payable _bénéficiaire, uint256 _releaseTime) { - Le "Constructeur" est une fonction spéciale unique qui est appelée lors du déploiement du contrat intelligent. Il met le contrat en mouvement. Remarquez comment, à ce stade, toutes les variables d'adresse que nous avons précédemment déclarées sont appelées et initialisées.
Receive() external payable { – Il s'agit d'une fonction spéciale appelée lorsque des fonds sont transférés à l'adresse du contrat depuis l'extérieur. External suggère de l'extérieur, et "Payable" définit la nature du transfert, c'est-à-dire recevoir des jetons ERC-20.
function release() public { - Il s'agit d'une fonction publique qui indique le mouvement des jetons ERC-20 de l'adresse du contrat au bénéficiaire. Cette fonction dépend de releaseTime.
Tous ces éléments font partie du contrat d'entiercement hypothétique que nous avons discuté. Assurez-vous de parcourir l'ensemble de la documentation sur la Solidité pour mieux comprendre le langage.
Connaître les éléments avant de planifier l'écriture de contrats intelligents: BeInCrypto
À ce stade, vous devriez avoir une longueur d'avance dans la lecture et la compréhension d'un contrat intelligent déjà écrit. Et de nombreux contrats intelligents comme ceux que nous avons discutés font l'arrière-plan d'une application décentralisée — un blockchainversion d'une application mobile standard.
Toutes les caractéristiques d’un contrat intelligent, y compris la sécurité des contrats, l’exécution autonome et programmable, l’absence de confiance des transactions, etc., sont facilement mises en œuvre lors du développement d’une application décentralisée. Ainsi, la prochaine fois que vous tomberez sur une DApp, notez qu’il s’agit d’un backend alimenté par un contrat intelligent hébergé sur la blockchain, ce qui vous permet d’initier plusieurs tâches sans intervention humaine. Les contrats intelligents forment la logique des DApps.
Nous savons qu'Ethereum vous permet de développer des smart contracts, comme une solution logicielle massive. Cependant, ce n'est pas le seul protocole blockchain disponible. Si vous souhaitez plonger profondément dans le monde du développement de smart contracts, vous voudrez peut-être regarder d'autres blockchains. Les différents blockchains ont des terminologies différentes lorsqu'il s'agit d'établir des contrats.
Mais d'abord, parlons Ethereum— la plateforme de prédilection pour la plupart des développeurs de smart contracts.
Les contrats intelligents sur Ethereum sont écrits dans le langage de programmation Solidity. Et l'interface de jeton pour cette plateforme de développement de contrats intelligents est ERC-20.
Vous pouvez revenir au contrat intelligent basé sur l'entiercement que nous avons discuté plus tôt pour voir comment un contrat intelligent standard basé sur Etheruem est écrit.
Même le lancement d'un jeton ERC-20 sur la blockchain Ethereum est une fonctionnalité intensive en contrat intelligent, quelque chose que nous discuterons en profondeur lors de l'écriture d'un contrat intelligent.
Voici à quoi ressemble une structure de code de base, à condition que nous prévoyions de lancer une nouvelle crypto-monnaie BIC.
Considérez ceci comme un scénario hypothétique. Pas exactement le lancement d'une cryptomonnaie BIC.
pragma solidité ^0.8.0;importer "@openzeppelin/contrats/jeton/ERC20/ERC20.sol";contrat BICToken est ERC20 { constructeur(uint256 offreInitiale) ERC20("Jeton BIC", "BIC") { _mint(msg.sender, offreInitiale); }}
Nous discuterons de chaque élément de ce code plus tard lors de la rédaction de notre contrat intelligent.
Comme Ethereum, vous pouvez même créer des contrats intelligents sur des plateformes comme Solana, en utilisant Rust et Cardano, en utilisant Plutus, un sous-ensemble de Haskell, un langage de programmation fonctionnel.
"Est-ce que Cordona a même des contrats intelligents ?"
Tu te moques de moi, mon ami. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 juillet 2023
Voici ce qu’est une structure de code en Rust (Solana) ressemble à :
Note : Il s'agit d'un contrat simple où un compteur est incrémenté.
use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
Saviez-vous ? Alors que Rust est le langage de programmation pour la création de contrats intelligents basés sur Solana, Ancreest le cadre de développement de contrat intelligent qui est utilisé. Pour créer des contrats intelligents en utilisant Rust, les développeurs doivent extraire des modules du cadre Anchor - quelque chose la première ligne de notre code d'exemple (utiliser anchor_lang::*;) représente.
Documentation de Solanavous aidera à comprendre le langage de contrat intelligent spécifique à Rust.
De même, Cardano suit Plutus comme choix de langage, suivi du langage Ink!Polkadot, TEAL pour Algorand, C# pour NEO, et plus encore. Il est conseillé de bien comprendre la documentation propre à chaque chaîne avant de commencer à rédiger des contrats intelligents compatibles.
La capacité d'écrire des contrats intelligents est très reconnue, mais même savoir lire comporte ses propres avantages :
Maintenant que la lecture des contrats intelligents est terminée, concentrons-nous sur l'écriture de contrats intelligents. Avant de plonger plus en profondeur, il est nécessaire de réitérer que différentes blockchains peuvent avoir des normes et des langages différents liés au développement de contrats intelligents. Il est nécessaire de se concentrer sur les normes définies par une blockchain donnée pour commencer à écrire et déployer des contrats.
Pour la majorité de notre discussion, nous nous concentrerons sur Ethereum en tant que chaîne et Solidity en tant que langage.
La programmation d'un smart contract est facilement la partie la plus importante du cycle de développement. Et pour se lancer dans le développement de smart contracts sur Ethereum ou tout autre blockchain, vous devriez avoir une certaine expérience avec des langages de programmation non-blockchain comme Javascript.
Différentes blockchains et le langage pour écrire des contrats intelligents: BeInCrypto
La capacité de programmer un contrat intelligent vous permet d'implémenter la logique, de gérer les éléments de sécurité de celui-ci, d'optimiser le code pour Frais de gaz, personnalisez la même, voire rendez-la interopérable si nécessaire.
Toute personne qui prévoit d'écrire des smart contracts sur Ethereum doit comprendre ce qu'est la Machine Virtuelle Ethereum (EVM) et comment elle fonctionne avec les smart contracts. Pour commencer, l'EVM est un composant d'Ethereum qui offre aux programmes un environnement isolé et contrôlé pour fonctionner. Considérez ceci comme un ordinateur mondial qui héberge chaque morceau de code de contrat présent sur Ethereum. Chaquenœudsur le réseau Ethereum fonctionne l'EVM.
Si vous aspirez à devenir un développeur de contrats intelligents, voici ce que vous devez savoir concernant les contrats intelligents et l'EVM.
Une fois que vous avez écrit le programme en Solidity, qui est un langage de haut niveau, vous devez le compiler en bytecode - un format de bas niveau compréhensible par la machine. Ce bytecode est intégré dans la blockchain Ethereum et y réside. Toute personne interagissant avec le smart contract doit envoyer une transaction à l'adresse du contrat.
Chaque nœud avec l'EVM installé peut voir cette transaction, et une fois que les validateurs l'approuvent, le code du contrat intelligent est exécuté. Comme chaque nœud a une visibilité sur la transaction, rien ne peut être falsifié, et le code s'exécute tel qu'il a été écrit. Et une fois que le code est exécuté, l'état de la blockchain change, rendant le processus de bout en bout et complètement transparent.
Écrire des contrats intelligents nécessite des compétences techniques. Mais ce n'est pas tout. Vous devez également comprendre parfaitement le fonctionnement de la technologie blockchain, ainsi que les besoins spécifiques en matière de langage pertinents pour la blockchain que vous ciblez.interopérabilité, et plus encore. En plus de cela, vous devez également connaître assez bien les vulnérabilités des contrats intelligents - les choses à éviter lors de l'écriture de code. Enfin, la connaissance des tests de contrat et du déploiement de contrat est également indispensable.
Tout cela peut devenir accablant. Voici donc une feuille de triche rapide pour commencer :
Voici un fil rapide avec quelques astuces pour écrire de meilleurs contrats intelligents :
🥧 FREI-PI
‼️ Pourquoi les développeurs de smart contract DOIVENT savoir cela !
Fonction :
- Exigences
– Effets
– Interactions
Protocole
- Invariants
C'est le modèle auquel vous devriez tous penser lors de la construction de contrats intelligents.
Voici pourquoi 👇
— Patrick Collins ( @PatrickAlphaC) 6 juillet 2023
Il est temps d'entrer dans les aspects techniques du développement de contrats intelligents. Même si des chaînes telles que Solana et Cardano vous permettent de développer des contrats intelligents, Ethereum reste la plateforme de développement de contrats intelligents la plus populaire.
Le saviez-vous ? Rien qu'en 2022, plus de 100 000 applications décentralisées ont été ajoutées au réseau Ethereum.
Ethereum a une énorme communauté de développeurs. Tout ce que vous développez attirera immédiatement l'attention. De plus, son langage natif, Solidity, est relativement facile pour les personnes qui maîtrisent Python ou JavaScript. Enfin, le logiciel global d'Ethereum, EVM, facilite l'exécution transparente des contrats.
Si vous faites partie de la majorité et préférez utiliser Ethereum et Solidity, voici une liste rapide des choses à suivre avant de commencer le développement de contrats intelligents :
Maintenant que nous savons comment les choses se passent sur la chaîne, plongeons-nous dans l’écriture et le déploiement du premier contrat intelligent. Même si « Hello World » reste la première étape, nous allons commencer par créer un contrat intelligent pour lancer un jeton BIC hypothétique avec une offre débloquée à 100 % de 1 million.
La première étape consiste à installer la dernière version de Node.js et le NPM ou Node Package Manager. Cela prend en charge les outils de développement et l'environnement local de développement. De plus, Node.js et NPM vous permettent de configurer le front-end web pour votre smart contract.
Maintenant, vous devez configurer un IDE pour écrire le code du contrat. Pour cela, vous pouvez rapidement installer Visual Studio Code. Ou vous pouvez couper le désordre et hopsur Alchemy - une plateforme de développement blockchain. Avec Alchemy, vous pouvez obtenir de l'ETH de testnet. Cela couvrira les frais de gaz lorsque vous déployez le smart contract sur le testnet Goerli ou même le testnet Sepolia.
Notez que Sepolia est un testnet plus récent et prend donc moins d'espace disque en ce qui concerne le déploiement du nœud.
Pour l'instant, nous persisterons avec le testnet Goerli car il a un plus grand nombre d'applications déployées.
Avec le testnet et l'ETH factice prêt, passons à l'écriture spécifique du contrat intelligent. Voici un extrait de code pour créer un jeton BIC avec un approvisionnement fixe de 1 million.
Note : Nous déploierons notre contrat intelligent localement sur MacOS et non sur le testnet. Pour le déploiement des contrats intelligents sur testnet et mainnet, nous aurons une pièce séparée, qui est en dehors du cadre de cette discussion.
Voici l’extrait de code simple pour le jeton hypothétique :
pragma solidité ^0.8.0;importer "@openzeppelin/contrats/token/ERC20/ERC20.sol";contrat BICToken est ERC20 { constructeur() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** décimales()); }}
Si vous connaissez la syntaxe, vous sauriez ce que signifie chaque composant de code. En ce qui concerne le OpenzepplinEn partie, c'est la bibliothèque de référence pour l'importation de contrats intelligents ERC-20. Cette bibliothèque offre les normes opérationnelles de base pour les jetons ERC-20.
La fonction mint parle de l'approvisionnement initial, qui est déployé à l'adresse du contrat intelligent ou du msg.sender.
Pour configurer ce code localement et le tester, nous aurons besoin de trois composants:
Si vous avez suivi le processus détaillé d'écriture d'un contrat intelligent, il est impératif de connaître un peu le processus d'exécution du contrat. Il s'agit d'un processus par lequel le code du contrat intelligent est exécuté sur une chaîne par les nœuds.
C'est l'uniformité associée à l'exécution du contrat qui rend les smart contracts transparents et immuables. Commençons maintenant à comprendre le processus en plusieurs étapes associé à l'exécution du contrat :
Les extraits de code que nous avons écrits doivent être exécutés quelque part. Dans le cas des contrats intelligents, cet endroit d'exécution est la blockchain. Les nœuds ou les membres participants de la chaîne aident à exécuter le contrat.
Les nœuds acceptent la responsabilité d'exécuter des blocs de code de contrat en retour d'incitations liées à la chaîne. Chaque commande ou action qui se produit au sein de la chaîne est dirigée par des contrats intelligents.
Chaque smart contract a une adresse spécifique. Pour exécuter le contrat, des transactions sont envoyées à cette adresse de contrat. Notez que chaque nœud exécute l'EVM, qui possède alors une copie du code du smart contract, ce qui rend plus facile la vérification de l'authenticité des transactions.
Les transactions ciblant le contrat intelligent sont sélectionnées par les validateurs, qui les incluent ensuite dans des blocs spécifiques.
Une fois que la transaction est poussée et validée avec succès, elle devient une partie de la blockchain. La fonction de contrat intelligent associée à la transaction est alors appelée et exécutée à travers les nœuds de la blockchain.
Chaque nœud exécutant le contrat intelligent doit parvenir à une conclusion déterministe — la même sortie pour le même ensemble d'entrées — rendant la nature des contrats totalement sans confiance et transparente.
Remarque : Toute erreur concernant l'exécution du code ou des problèmes liés aux frais de gaz annule les transactions. Cela signifie que la transaction basée sur un code de contrat intelligent spécifique cessera d'exister. C'est exactement ce qui se passe avec prêts flashlorsque l'incapacité de respecter des normes spécifiques inverse complètement la transaction, donnant ainsi l'impression que les fonds n'ont même pas bougé en premier lieu.
Chaque changement d'état associé aux contrats intelligents est enregistré dans la blockchain et devient une partie immuable de celle-ci.
Maintenant que vous en savez un peu sur les smart contracts, voici quelques points pour commencer le développement de contrats :
Chacune des pratiques mentionnées ci-dessus contribue à l'optimisation du code et à la mise en œuvre de mesures de sécurité spécifiques. Cependant, il existe quelques pratiques spécifiques aux contrats que vous devez suivre et mettre en œuvre pour assurer la durabilité du code. L'objectif est de maintenir le code du contrat léger et utilisable afin que chaque nœud exécutant la même opération n'ait pas à consacrer une grande puissance de calcul à la même tâche.
Malgré le respect des meilleures pratiques lors de l'écriture et du développement de contrats intelligents, il est nécessaire de se concentrer sur les vulnérabilités de sécurité du contrat lors de leur déploiement sur le mainnet.
Chaque smart contract ayant une présence sur le mainnet doit être évalué en termes de performances du code, de sécurité et d'autres caractéristiques. C'est là que l'audit - un processus rigoureux de test de contrat - prend tout son sens, vous permettant de découvrir les vulnérabilités potentielles et les faiblesses du contrat.
Voici une liste de contrôle d'audit rapide pour commencer:
Liste de contrôle incroyable pour l'audit des contrats intelligents😈
Assurez-vous de les vérifier lors de votre prochain audit✅
Je vous serais reconnaissant de retweeter, de diffuser les connaissances🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 juillet 2023
Lors de la lecture et de l'écriture des contrats intelligents, il est nécessaire de bien comprendre que l'audit occupe une place spéciale, car il implique de vérifier en premier lieu la logique. En ce qui concerne l'exécution du code basé sur la blockchain, tout est immuable, et tout événement catastrophique peut avoir des conséquences irréversibles lors de l'exécution du contrat. C'est précisément pour cette raison qu'une vérification minutieuse du code du contrat et d'autres aspects via un audit est nécessaire.
Il peut y avoir toute une gamme devulnérabilités contractuellesqu'un audit détaillé du contrat intelligent peut identifier. Cela inclut la vérification des attaques de réentrance, des débordements ou des sous-débordements, des problèmes liés au contrôle d'accès, et plus encore. Une fois que la nature exacte du problème est déterminée, l'auditeur peut même suggérer les meilleures pratiques pour le corriger.
Vous vous demandez toujours en quoi l'audit des contrats intelligents peut aider ? Eh bien, revenons à l'infâmeDAO hack en 2016, qui a exploité un problème de réentrée et a causé une perte de près de 3,6 millions d’ETH. De même, il y a eu le piratage du contrat de portefeuille Parity en 2017, entraînant une perte de près de 500 000 ETH. Ces problèmes auraient pu être évités avec la bonne série d’audits.
Schéma de piratage de DAO : BeInCrypto
Il existe de nombreuses stratégies pour auditer les contrats intelligents. Certains des plus populaires incluent :
Ces outils agissent comme le premier ensemble de défenses et sont mieux utilisés pour localiser les vulnérabilités courantes. Certains des outils les plus populaires incluent Securify, Mythril, et plus encore - capables d'effectuer une analyse statique du code, de détecter des schémas de violation, et d'aider à obtenir une avance spécifique en matière de sécurité.
Outils d'audit de contrats intelligents : BeInCrypto
C'est là que les examinateurs de code manuels entrent en scène, scrutant la base de code et identifiant les vulnérabilités complexes, le cas échéant. Une révision manuelle peut aider à prendre soin de la logique métier, du contexte et des schémas d'utilisation.
Voici comment les révisions de code manuelles vous aident à localiser les menaces :
Un petit jeu de questions pour nos jeunes auditeurs !
Allons-y et retweetez si vous avez trouvé le bug !pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles) 8 juillet 2023
Des outils tels que Snyk et GuardRails aident à la numérisation automatique des contrats - une implémentation de sécurité qui est invoquée à chaque fois que le code est mis à jour. Cette forme d'audit garantit que les nouvelles modifications apportées à un code sont sûres et non invasives.
Il s’agit d’un processus complexe qui repose uniquement sur la vérification de la logique métier du code. Notez que la vérification formelle n’est pas réellement destinée à vérifier la syntaxe, mais uniquement la logique pour voir si le code s’exécute comme souhaité.
En plus des stratégies mentionnées, l’audit des contrats intelligents peut également être initié à l’aide d’examens par les pairs, de programmes de bug bounty et de couvertures de test via des outils tels que la couverture Solidity pour maximiser l’efficacité.
Un moyen simple d'auditer les contrats intelligents : BeInCrypto
Si vous êtes nouveau dans l'audit des contrats intelligents, il est important de noter qu'il existe deux façons d'analyser largement le code et d'identifier les problèmes. Celles-ci incluent :
Ce type d'analyse de code aide à identifier les vulnérabilités de sécurité de base, les erreurs de codage et d'autres problèmes selon les normes de codage données et les conventions. Les menaces telles que les appels non vérifiés aux sources externes, les débordements d'entiers, et plus encore peuvent être mis en évidence à l'aide de l'analyse statique. La meilleure chose à propos de l'analyse statique est que le code n'a pas besoin d'être exécuté pour être vérifié.
Cette approche de l’audit teste l’alignement du code avec l’EVM. Au lieu de se contenter de vérifier le code, l’analyse dynamique recoupe la réponse des contrats intelligents à un large éventail d’entrées. L’analyse dynamique permet d’identifier des problèmes tels qu’une consommation de gaz incohérente et même une logique contractuelle erronée. Les environnements de blockchain personnels comme Ganache peuvent fonctionner comme des plateformes d’analyse dynamiques, permettant aux développeurs d’effectuer des transactions, d’exécuter des commandes et de faire bien plus avec leurs contrats.
Voici un extrait de contrat intelligent qui fonctionne comme un stockage de fonds, avec une fonction de retrait:
pragma solidité ^0.6.1;contrat ContratVulnérable { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Solde insuffisant."); (bool succès, ) = msg.sender.call{value: _amount}(""); require(succès, "Échec du transfert."); balances[msg.sender] -= _amount; }}
Si vous regardez de près le code, il y a une vulnérabilité clé :
Dans le cas précédent, la fonction "retirer" peut être appelée à nouveau si l'utilisateur recevant les fonds est également un smart contract, bien que malveillant. Par conséquent, avant que la dernière fonction ou la mise à jour du solde ne se produise, une attaque de réentrance peut être lancée pour transférer des fonds supplémentaires. Les auditeurs expérimentés identifient ce type de vulnérabilité.
Voici le code corrigé pour la même chose :
fonction retirer(uint256 _montant) public { require(soldes[msg.sender] >= _montant, "Solde insuffisant."); soldes[msg.sender] -= _montant; (bool succes, ) = msg.sender.call{value: _montant}("");
require(success, “Transfer failed.”);}
Vérifiez comment la fonction de mise à jour du solde est appelée d'abord, puis le premier mouvement vers l'utilisateur. Ce changement dans l'ordre des opérations est ce qui corrige le contrat.
Le monde des applications décentralisées et des contrats intelligents a dépassé Ethereum. Même si la majeure partie de l'action se déroule encore dans l'écosystème Ethereum, il existe d'autres chaînes comme Cardano, Solana, et d'autres encore qui prennent en charge les contrats intelligents et nécessitent des normes d'audit différentes.
Les différentes blockchains utilisent des langages de programmation différents. Les sémantiques, la syntaxe et les propriétés du code sont différentes, ce qui rend les contrats intelligents réactifs à différentes pratiques d'écriture et d'audit. Par exemple, Ethereum utilise Solidity, tandis que Polkadotutilise de l'encre et de la rouille, ce qui le rend réactif à des normes d'audit spécifiques.
Maintenant, si vous voulez aller au-delà d'Ethereum, il existe quelques outils d'audit spécialisés pour vous aider à démarrer. Par exemple, avec Cardano, il y a la suite Marlowe pour la vérification formelle et l'audit. En ce qui concerne Solana, les libfuzzer spécifiques à Rust et cargo-fuzz sont destinés à l'audit et aux tests de contrat. Un auditeur multi-chaîne doit être familier avec ces concepts pour éviter les vulnérabilités du contrat.
Pour réitérer, vous pouvez séparer l'audit des contrats intelligents en trois types : manuel, automatique et hybride. Notez que les gens préfèrent les stratégies d'audit hybrides pour les contrats complexes avec une logique commerciale approfondie car elles sont les plus complètes.
Les organisations et les personnes ayant des connaissances minimales en codage sous-traitent souvent leurs exigences en matière de rédaction et d’audit à des entreprises réputées. Lorsqu’il s’agit d’audit, le choix de la bonne entreprise devient d’autant plus important que même si outils d'IAcommeChatGPTpeut aider à écrire du code de contrat intelligent, la vérification nécessite des insights manuels.
De plus, voici les facteurs à prendre en note lors de l'externalisation des tâches d'audit :
Avant de vous concentrer sur la bonne société d'externalisation, il est crucial de vérifier les audits passés, d'évaluer l'expérience et même de se concentrer sur les principaux membres de l'équipe.
Avant de procéder à une embauche, prenez note des coûts et des services associés aux audits. Il est impératif de comprendre d'abord la nature des services offerts, tels que l'identification des problèmes, la résolution des problèmes, et plus encore. Vous devez également vérifier si des ré-audits sont également fournis après la mise en œuvre de la première série de correctifs. Le coût d'un audit de contrat intelligent peut varier en fonction des services, il est donc nécessaire de suivre chaque exigence et offre avant de procéder.
Au cas où vous voudriez abandonner une entreprise et auditer vous-même les contrats intelligents, voici les meilleures stratégies et pratiques à garder à l'esprit :
L’intelligence artificielle facilite en effet l’écriture de contrats intelligents. Cependant, indépendamment de l’innovation en matière d’IA, la capacité d’auditer les contrats intelligents de la meilleure façon possible nécessite toujours une intervention humaine. Par conséquent, si vous envisagez de créer votre prochain produit web3 en mettant l’accent sur les contrats intelligents et les applications décentralisées, il est crucial de vous concentrer religieusement sur les meilleures ressources d’audit pour vos contrats intelligents. Avec les piratages et les violations de crypto-monnaie qui font surface chaque jour qui passe et les pirates qui planifient de nouvelles stratégies pour percer, l’audit d’un contrat à la perfection est certainement l’un des ensembles de compétences modernes les plus importants.
Partager
Les contrats intelligents sont des morceaux de code programmables qui s'exécutent uniquement lorsque un ensemble de conditions sont remplies. Ils sont synonymes de contrats du monde réel légalement contraignants ; seulement dans ce cas, le code fait loi. Comme les contrats intelligents résident sur la chaîne de blocs, ils sont immuables — ils ne peuvent pas être altérés. C'est cette caractéristique d'immuabilité qui rend les contrats intelligents spéciaux, entre autres choses.
Contrats intelligentssont destinés à automatiser les transactions spécifiques à la blockchain. Comme ce sont des contrats conditionnels, ils ne nécessitent pas d'intermédiaires. Ce qui rend les smart contracts utiles, c'est leur compatibilité dans un large éventail de cas d'utilisation, y compris les services financiers, la gestion de la chaîne d'approvisionnement, et plus encore. Et contrairement aux blocs de code traditionnels qui sont programmés d'un seul coup, les smart contracts nécessitent des stratégies hautement sécurisées et chronophages.
Comment les contrats intelligents s'alignent-ils avec la technologie blockchain : BeInCrypto
Le mot à la mode “web3” suggère les habitudes de programmation laxistes et peu sécurisées du web. Lorsque la crypto ou les contrats intelligents sont programmés comme une page web, ils sont voués à l'échec. Les blockchains et leurs applications durablement réussies reposent sur des méthodes de programmation bien plus sécurisées, soigneuses et lentes.
Nick Szabo, cryptographe et informaticien : Twitter
Les contrats intelligents peuvent fonctionner avec des jetons spécifiques à la blockchain, tels que les ERC-20 pour la blockchain Ethereum, en incitant les efforts et en déplaçant les transactions. Comme le code, les conditions et les coûts sont impliqués, vous devriez faire attention à les lire, les écrire et les auditer.
La véritable importance des contrats intelligents concerne leur nature et leur positionnement. Pour un scénario donné — disons une personne A transférant des fonds à une personne B lorsque B termine un service — une copie du contrat intelligent est enregistrée et exécutée par les nœuds de la blockchain. Les contrats intelligents sont enregistrés sous forme de codes de contrat au sein de la chaîne. Cette validation multi-chemin est une caractéristique propre à la blockchain et maintient la sécurité des données.
De plus, il existe des contrats intelligents séquentiels ou synchrones et contrats intelligents asynchronesoù les tâches sont exécutées en parallèle. Par conséquent, le type et le but d'un contrat intelligent déterminent comment il est écrit, lu ou même audité.
Les contrats traditionnels, les actes de propriété, les testaments, etc. relèvent du droit privé, «rédigés par des particuliers plutôt que par des politiciens ou des fonctionnaires gouvernementaux». Les contrats intelligents sont une nouvelle forme de création de règles décentralisée.https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4)15 mars 2018
Considérons un pool de liquidité standard gouverné par un smart contract.
Imaginez que le pool de jetons peut être utilisé pour le trading, et à chaque fois qu'un échange réussi se produit, 0,3% de la valeur totale de l'échange est envoyée au fournisseur de liquidités qui a rendu cet échange possible ou a ajouté de la liquidité pour cet actif échangeable donné. Toutes les conditions mettant en lumière les scénarios d'échange, les frais de trading et les conditions de non-conformité et d'échec de l'échange sont codées comme un Smart Contract, qui est stocké dans la chaîne sous forme de code de contrat.
Nous ne pouvons pas plonger profondément dans la lecture, l'écriture et l'audit des contrats si nous ne sommes pas conscients de leurs caractéristiques. Voici les traits standard des contrats intelligents dont il faut être conscient :
Quelques caractéristiques d'un contrat intelligent standard : BeInCrypto
Les contrats intelligents ne sont que des morceaux de code. Vous pouvez écrire des contrats intelligents pour exécuter des commandes et des scénarios en fonction de conditions spécifiques. C'est pourquoi les développeurs de contrats intelligents et les programmeurs sont actuellement très demandés, car la plupart des DeFil'espace repose déjà sur des contrats intelligents pour traiter des cas complexes comme la gestion des frais de transaction à travers les pools de liquidité, le maintien APYratios, et plus encore.
Les contrats intelligents résidant sur la blockchain éliminent l'intervention humaine. Cela les rend entièrement sans confiance. Par exemple, si un spécifique DeFiprotocole, régi par des contrat(s) intelligents, accepte de liquider vos actifs une fois que la valeur tombe en dessous d'un seuil, aucune intervention humaine ne peut ou ne doit l'arrêter. Le code gère le paiement, la performance, la gestion et l'application des règles, rendant tout l'espace complètement sans confiance.
Comme mentionné précédemment, les contrats intelligents sont chargés d'ensembles d'instructions auto-exécutantes. En termes de codage, cela signifie avoir des itérations et des boucles intégrées dans le canevas de base. Cela garantit que des tâches telles que les paiements, les retraits, les dépôts, la pénalisation des validateurs via le slashing, et plusieurs autres tâches sont gérées de manière autonome.
Et enfin, comme les contrats intelligents sont sécurisés à l’aide de la cryptographie, il est incroyablement difficile de les violer. Sans vulnérabilité intégrée, contourner un contrat intelligent signifierait essayer de le violer au grand jour, devant l’ensemble de la blockchain.
Les transactions traitées via les contrats intelligents sont auto-vérifiables. Cela signifie que l'exécution est une preuve suffisante que la transaction a eu lieu en premier lieu, car aucun élément humain n'est impliqué. Le mécanisme d'auto-vérification donne aux contrats intelligents un avantage sur les contrats traditionnels régissant les configurations bancaires héritées.
Donc la prochaine fois que vous prévoyez de lire un smart contract, assurez-vous que le gabarit ou la documentation comporte toutes les caractéristiques mentionnées.
Une version simplifiée des contrats intelligents: Reddit
Voici un contrat intelligent simple représentant un compte de consignation. Les utilisateurs déposent leurs fonds dans la consignation, qui les transfère ensuite au destinataire après un certain laps de temps.
/ SPDX-License-Identifier : MITpragma solidity ^0.8.0 ;// Basic Smart Contract Boilerplatecontract SimpleTrustlessEscrow {// Variables d’étatadresse déposant public ; // Compte déposant etheraddress payable bénéficiaire public ; // Compte recevant etheruint256 public releaseTime ; // Horodatage pour libérer ether// Evénements de vérification de l’activité du contratevent Deposited(adresse indexée _from, uint256 _value) ; event Released(adresse indexée _to, uint256 _value) ;// Le constructeur du contrat initialise le constructeur du contrat intelligent(adresse payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, « L’heure de publication doit être dans le futur ») ; Sécurisé et sans confiance : le contrat lie le déposant et le déposant bénéficiaire = msg.sender ; bénéficiaire = _beneficiary ; releaseTime = _releaseTime ;}Fonction de dépôt – exécution autonome (fonction de secours)receive() external payable { emit Deposited(msg.sender, msg.value) ;}Libérer l’ether dans la fonction bénéficiaire release() public { // Programmable : Ne peut être exécuté qu’après releaseTime require(block.timestamp >= releaseTime, « Trop tôt pour libérer ») ; Autonome : S’exécute automatiquement en fonction de la condition uint256 amount = address(this).balance ; bénéficiaire.transfert(montant) ; emit Libéré(bénéficiaire, montant) ;}}
Alors que nous allons décrypter et lire ce smart contract en détail, vérifions d'abord s'il respecte les caractéristiques de contrat mentionnées.
Regardez de près le contrat pour ce morceau de code :
require(block.timestamp >= releaseTime, "Trop tôt pour libérer");
uint256 montant = address(this).balance;
bénéficiaire.transfert(montant);
Les fonds ne doivent être débloqués que lorsqu’une condition spécifique de releaseTime est remplie, ce qui rend ces contrats programmables.
Voici un petit extrait de code rapide ci-dessus :
déposant = msg.sender ;
bénéficiaire = _bénéficiaire;
releaseTime = _releaseTime;
Dans le contrat, tout le monde est lié par le code, du déposant à la personne recevant les fonds. Personne n'a besoin d'interagir ou de faire confiance à l'autre car la fonction de transfert de fonds est liée par releaseTime - un paramètre basé sur le code.
Voici la partie "libération de fonds" du code :
function release() public {require(block.timestamp >= releaseTime, “Trop tôt pour libérer”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}
L'ensemble du processus est autonome, car les fonds ne sont libérés que lorsque le releaseTime répond à un certain critère. Remarquez que le code n'est pas partiellement programmable mais entièrement autonome.
D’autres éléments du code du contrat intelligent, notamment la fonction de dépôt, peuvent également être rendus complètement autonomes en fonction des fonctionnalités que vous souhaitez inclure. Par exemple, vous pouvez lancer un plan de dépôt récurrent chaque fois que l’utilisateur portefeuillecroise les 100 $, avec le montant excédentaire transféré au bénéficiaire.
Se préoccuper de l’élément qui se prête sécuritéau contrat ? Consultez cette partie du code :
constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, « L’heure de libération doit être dans le futur ») ; déposant = msg.sender ; bénéficiaire = _beneficiary ; releaseTime = _releaseTime ;}
Remarquez comment il y a une préséance définie de la fonction releaseTime par rapport au timestamp. Rien n'est aléatoire, et les conditions doivent être remplies.
Chaque transaction associée au contrat intelligent est enregistrée au sein de la chaîne, grâce à des éléments d’activité de journal distincts.
Événement Déposé(address indexé _from, uint256 _valeur);
event Released(adresse indexée _to, uint256 _value) ;
emit Deposited(msg.sender, msg.value) ;
emit Released(bénéficiaire, montant);
Maintenant que nous avons identifié les éléments qui définissent les caractéristiques d'un contrat intelligent, voici les autres éléments du contrat pour vous aider à mieux comprendre le sujet.
Pragma solidité ^0.8.0; – La version du langage de programmation Solidity nécessaire pour écrire ce contrat intelligent.
// SPDX-License-Identifier: MIT - Termed Software Package Data Exchange, this identifier states the license of the code release. It is advisable to include this to let people know if it’s open source and can be worked around or not.
Contrat TimeLock { - Attribue un nom au contrat intelligent, comme une étiquette.
Adresse du déposant public; - Comme le contrat implique un déposant et un bénéficiaire, c'est à ce moment que l'adresse publique du déposant est mentionnée. Cette variable est le Portefeuille Ethereumadresse et est visible publiquement.
Adresse payable publique du bénéficiaire; – Il s'agit de l'adresse publique du bénéficiaire où l'entiercement transfère des fonds. Elle est également lisible et confère une impression de transparence aux contrats intelligents alimentés par la blockchain.
Uint256 public releaseTime; – Comme il s'agit d'un contrat à durée déterminée, le uint256 attribue la variable basée sur le temps au contrat. Ce sera le délai selon lequel les fonds seront libérés.
En Solidity, uint (entier non signé) est la manière d'attribuer des valeurs basées sur des entiers. Le suffixe 256 représente un grand espace de stockage de nombres.
après 5 ans à écrire des smart contracts, je réalise seulement aujourd'hui que le logo de Solidity est le logo d'Ethereum déplié 🨯pic.twitter.com/wlM369Eff9
— kaden.eth ( @0xKaden) 8 juillet 2023
Vous pouvez envisager de lire Documentation de Soliditypour se familiariser avec la syntaxe, les expressions et les autres éléments de code.
constructeur(adresse payable _bénéficiaire, uint256 _releaseTime) { - Le "Constructeur" est une fonction spéciale unique qui est appelée lors du déploiement du contrat intelligent. Il met le contrat en mouvement. Remarquez comment, à ce stade, toutes les variables d'adresse que nous avons précédemment déclarées sont appelées et initialisées.
Receive() external payable { – Il s'agit d'une fonction spéciale appelée lorsque des fonds sont transférés à l'adresse du contrat depuis l'extérieur. External suggère de l'extérieur, et "Payable" définit la nature du transfert, c'est-à-dire recevoir des jetons ERC-20.
function release() public { - Il s'agit d'une fonction publique qui indique le mouvement des jetons ERC-20 de l'adresse du contrat au bénéficiaire. Cette fonction dépend de releaseTime.
Tous ces éléments font partie du contrat d'entiercement hypothétique que nous avons discuté. Assurez-vous de parcourir l'ensemble de la documentation sur la Solidité pour mieux comprendre le langage.
Connaître les éléments avant de planifier l'écriture de contrats intelligents: BeInCrypto
À ce stade, vous devriez avoir une longueur d'avance dans la lecture et la compréhension d'un contrat intelligent déjà écrit. Et de nombreux contrats intelligents comme ceux que nous avons discutés font l'arrière-plan d'une application décentralisée — un blockchainversion d'une application mobile standard.
Toutes les caractéristiques d’un contrat intelligent, y compris la sécurité des contrats, l’exécution autonome et programmable, l’absence de confiance des transactions, etc., sont facilement mises en œuvre lors du développement d’une application décentralisée. Ainsi, la prochaine fois que vous tomberez sur une DApp, notez qu’il s’agit d’un backend alimenté par un contrat intelligent hébergé sur la blockchain, ce qui vous permet d’initier plusieurs tâches sans intervention humaine. Les contrats intelligents forment la logique des DApps.
Nous savons qu'Ethereum vous permet de développer des smart contracts, comme une solution logicielle massive. Cependant, ce n'est pas le seul protocole blockchain disponible. Si vous souhaitez plonger profondément dans le monde du développement de smart contracts, vous voudrez peut-être regarder d'autres blockchains. Les différents blockchains ont des terminologies différentes lorsqu'il s'agit d'établir des contrats.
Mais d'abord, parlons Ethereum— la plateforme de prédilection pour la plupart des développeurs de smart contracts.
Les contrats intelligents sur Ethereum sont écrits dans le langage de programmation Solidity. Et l'interface de jeton pour cette plateforme de développement de contrats intelligents est ERC-20.
Vous pouvez revenir au contrat intelligent basé sur l'entiercement que nous avons discuté plus tôt pour voir comment un contrat intelligent standard basé sur Etheruem est écrit.
Même le lancement d'un jeton ERC-20 sur la blockchain Ethereum est une fonctionnalité intensive en contrat intelligent, quelque chose que nous discuterons en profondeur lors de l'écriture d'un contrat intelligent.
Voici à quoi ressemble une structure de code de base, à condition que nous prévoyions de lancer une nouvelle crypto-monnaie BIC.
Considérez ceci comme un scénario hypothétique. Pas exactement le lancement d'une cryptomonnaie BIC.
pragma solidité ^0.8.0;importer "@openzeppelin/contrats/jeton/ERC20/ERC20.sol";contrat BICToken est ERC20 { constructeur(uint256 offreInitiale) ERC20("Jeton BIC", "BIC") { _mint(msg.sender, offreInitiale); }}
Nous discuterons de chaque élément de ce code plus tard lors de la rédaction de notre contrat intelligent.
Comme Ethereum, vous pouvez même créer des contrats intelligents sur des plateformes comme Solana, en utilisant Rust et Cardano, en utilisant Plutus, un sous-ensemble de Haskell, un langage de programmation fonctionnel.
"Est-ce que Cordona a même des contrats intelligents ?"
Tu te moques de moi, mon ami. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 juillet 2023
Voici ce qu’est une structure de code en Rust (Solana) ressemble à :
Note : Il s'agit d'un contrat simple où un compteur est incrémenté.
use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
Saviez-vous ? Alors que Rust est le langage de programmation pour la création de contrats intelligents basés sur Solana, Ancreest le cadre de développement de contrat intelligent qui est utilisé. Pour créer des contrats intelligents en utilisant Rust, les développeurs doivent extraire des modules du cadre Anchor - quelque chose la première ligne de notre code d'exemple (utiliser anchor_lang::*;) représente.
Documentation de Solanavous aidera à comprendre le langage de contrat intelligent spécifique à Rust.
De même, Cardano suit Plutus comme choix de langage, suivi du langage Ink!Polkadot, TEAL pour Algorand, C# pour NEO, et plus encore. Il est conseillé de bien comprendre la documentation propre à chaque chaîne avant de commencer à rédiger des contrats intelligents compatibles.
La capacité d'écrire des contrats intelligents est très reconnue, mais même savoir lire comporte ses propres avantages :
Maintenant que la lecture des contrats intelligents est terminée, concentrons-nous sur l'écriture de contrats intelligents. Avant de plonger plus en profondeur, il est nécessaire de réitérer que différentes blockchains peuvent avoir des normes et des langages différents liés au développement de contrats intelligents. Il est nécessaire de se concentrer sur les normes définies par une blockchain donnée pour commencer à écrire et déployer des contrats.
Pour la majorité de notre discussion, nous nous concentrerons sur Ethereum en tant que chaîne et Solidity en tant que langage.
La programmation d'un smart contract est facilement la partie la plus importante du cycle de développement. Et pour se lancer dans le développement de smart contracts sur Ethereum ou tout autre blockchain, vous devriez avoir une certaine expérience avec des langages de programmation non-blockchain comme Javascript.
Différentes blockchains et le langage pour écrire des contrats intelligents: BeInCrypto
La capacité de programmer un contrat intelligent vous permet d'implémenter la logique, de gérer les éléments de sécurité de celui-ci, d'optimiser le code pour Frais de gaz, personnalisez la même, voire rendez-la interopérable si nécessaire.
Toute personne qui prévoit d'écrire des smart contracts sur Ethereum doit comprendre ce qu'est la Machine Virtuelle Ethereum (EVM) et comment elle fonctionne avec les smart contracts. Pour commencer, l'EVM est un composant d'Ethereum qui offre aux programmes un environnement isolé et contrôlé pour fonctionner. Considérez ceci comme un ordinateur mondial qui héberge chaque morceau de code de contrat présent sur Ethereum. Chaquenœudsur le réseau Ethereum fonctionne l'EVM.
Si vous aspirez à devenir un développeur de contrats intelligents, voici ce que vous devez savoir concernant les contrats intelligents et l'EVM.
Une fois que vous avez écrit le programme en Solidity, qui est un langage de haut niveau, vous devez le compiler en bytecode - un format de bas niveau compréhensible par la machine. Ce bytecode est intégré dans la blockchain Ethereum et y réside. Toute personne interagissant avec le smart contract doit envoyer une transaction à l'adresse du contrat.
Chaque nœud avec l'EVM installé peut voir cette transaction, et une fois que les validateurs l'approuvent, le code du contrat intelligent est exécuté. Comme chaque nœud a une visibilité sur la transaction, rien ne peut être falsifié, et le code s'exécute tel qu'il a été écrit. Et une fois que le code est exécuté, l'état de la blockchain change, rendant le processus de bout en bout et complètement transparent.
Écrire des contrats intelligents nécessite des compétences techniques. Mais ce n'est pas tout. Vous devez également comprendre parfaitement le fonctionnement de la technologie blockchain, ainsi que les besoins spécifiques en matière de langage pertinents pour la blockchain que vous ciblez.interopérabilité, et plus encore. En plus de cela, vous devez également connaître assez bien les vulnérabilités des contrats intelligents - les choses à éviter lors de l'écriture de code. Enfin, la connaissance des tests de contrat et du déploiement de contrat est également indispensable.
Tout cela peut devenir accablant. Voici donc une feuille de triche rapide pour commencer :
Voici un fil rapide avec quelques astuces pour écrire de meilleurs contrats intelligents :
🥧 FREI-PI
‼️ Pourquoi les développeurs de smart contract DOIVENT savoir cela !
Fonction :
- Exigences
– Effets
– Interactions
Protocole
- Invariants
C'est le modèle auquel vous devriez tous penser lors de la construction de contrats intelligents.
Voici pourquoi 👇
— Patrick Collins ( @PatrickAlphaC) 6 juillet 2023
Il est temps d'entrer dans les aspects techniques du développement de contrats intelligents. Même si des chaînes telles que Solana et Cardano vous permettent de développer des contrats intelligents, Ethereum reste la plateforme de développement de contrats intelligents la plus populaire.
Le saviez-vous ? Rien qu'en 2022, plus de 100 000 applications décentralisées ont été ajoutées au réseau Ethereum.
Ethereum a une énorme communauté de développeurs. Tout ce que vous développez attirera immédiatement l'attention. De plus, son langage natif, Solidity, est relativement facile pour les personnes qui maîtrisent Python ou JavaScript. Enfin, le logiciel global d'Ethereum, EVM, facilite l'exécution transparente des contrats.
Si vous faites partie de la majorité et préférez utiliser Ethereum et Solidity, voici une liste rapide des choses à suivre avant de commencer le développement de contrats intelligents :
Maintenant que nous savons comment les choses se passent sur la chaîne, plongeons-nous dans l’écriture et le déploiement du premier contrat intelligent. Même si « Hello World » reste la première étape, nous allons commencer par créer un contrat intelligent pour lancer un jeton BIC hypothétique avec une offre débloquée à 100 % de 1 million.
La première étape consiste à installer la dernière version de Node.js et le NPM ou Node Package Manager. Cela prend en charge les outils de développement et l'environnement local de développement. De plus, Node.js et NPM vous permettent de configurer le front-end web pour votre smart contract.
Maintenant, vous devez configurer un IDE pour écrire le code du contrat. Pour cela, vous pouvez rapidement installer Visual Studio Code. Ou vous pouvez couper le désordre et hopsur Alchemy - une plateforme de développement blockchain. Avec Alchemy, vous pouvez obtenir de l'ETH de testnet. Cela couvrira les frais de gaz lorsque vous déployez le smart contract sur le testnet Goerli ou même le testnet Sepolia.
Notez que Sepolia est un testnet plus récent et prend donc moins d'espace disque en ce qui concerne le déploiement du nœud.
Pour l'instant, nous persisterons avec le testnet Goerli car il a un plus grand nombre d'applications déployées.
Avec le testnet et l'ETH factice prêt, passons à l'écriture spécifique du contrat intelligent. Voici un extrait de code pour créer un jeton BIC avec un approvisionnement fixe de 1 million.
Note : Nous déploierons notre contrat intelligent localement sur MacOS et non sur le testnet. Pour le déploiement des contrats intelligents sur testnet et mainnet, nous aurons une pièce séparée, qui est en dehors du cadre de cette discussion.
Voici l’extrait de code simple pour le jeton hypothétique :
pragma solidité ^0.8.0;importer "@openzeppelin/contrats/token/ERC20/ERC20.sol";contrat BICToken est ERC20 { constructeur() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** décimales()); }}
Si vous connaissez la syntaxe, vous sauriez ce que signifie chaque composant de code. En ce qui concerne le OpenzepplinEn partie, c'est la bibliothèque de référence pour l'importation de contrats intelligents ERC-20. Cette bibliothèque offre les normes opérationnelles de base pour les jetons ERC-20.
La fonction mint parle de l'approvisionnement initial, qui est déployé à l'adresse du contrat intelligent ou du msg.sender.
Pour configurer ce code localement et le tester, nous aurons besoin de trois composants:
Si vous avez suivi le processus détaillé d'écriture d'un contrat intelligent, il est impératif de connaître un peu le processus d'exécution du contrat. Il s'agit d'un processus par lequel le code du contrat intelligent est exécuté sur une chaîne par les nœuds.
C'est l'uniformité associée à l'exécution du contrat qui rend les smart contracts transparents et immuables. Commençons maintenant à comprendre le processus en plusieurs étapes associé à l'exécution du contrat :
Les extraits de code que nous avons écrits doivent être exécutés quelque part. Dans le cas des contrats intelligents, cet endroit d'exécution est la blockchain. Les nœuds ou les membres participants de la chaîne aident à exécuter le contrat.
Les nœuds acceptent la responsabilité d'exécuter des blocs de code de contrat en retour d'incitations liées à la chaîne. Chaque commande ou action qui se produit au sein de la chaîne est dirigée par des contrats intelligents.
Chaque smart contract a une adresse spécifique. Pour exécuter le contrat, des transactions sont envoyées à cette adresse de contrat. Notez que chaque nœud exécute l'EVM, qui possède alors une copie du code du smart contract, ce qui rend plus facile la vérification de l'authenticité des transactions.
Les transactions ciblant le contrat intelligent sont sélectionnées par les validateurs, qui les incluent ensuite dans des blocs spécifiques.
Une fois que la transaction est poussée et validée avec succès, elle devient une partie de la blockchain. La fonction de contrat intelligent associée à la transaction est alors appelée et exécutée à travers les nœuds de la blockchain.
Chaque nœud exécutant le contrat intelligent doit parvenir à une conclusion déterministe — la même sortie pour le même ensemble d'entrées — rendant la nature des contrats totalement sans confiance et transparente.
Remarque : Toute erreur concernant l'exécution du code ou des problèmes liés aux frais de gaz annule les transactions. Cela signifie que la transaction basée sur un code de contrat intelligent spécifique cessera d'exister. C'est exactement ce qui se passe avec prêts flashlorsque l'incapacité de respecter des normes spécifiques inverse complètement la transaction, donnant ainsi l'impression que les fonds n'ont même pas bougé en premier lieu.
Chaque changement d'état associé aux contrats intelligents est enregistré dans la blockchain et devient une partie immuable de celle-ci.
Maintenant que vous en savez un peu sur les smart contracts, voici quelques points pour commencer le développement de contrats :
Chacune des pratiques mentionnées ci-dessus contribue à l'optimisation du code et à la mise en œuvre de mesures de sécurité spécifiques. Cependant, il existe quelques pratiques spécifiques aux contrats que vous devez suivre et mettre en œuvre pour assurer la durabilité du code. L'objectif est de maintenir le code du contrat léger et utilisable afin que chaque nœud exécutant la même opération n'ait pas à consacrer une grande puissance de calcul à la même tâche.
Malgré le respect des meilleures pratiques lors de l'écriture et du développement de contrats intelligents, il est nécessaire de se concentrer sur les vulnérabilités de sécurité du contrat lors de leur déploiement sur le mainnet.
Chaque smart contract ayant une présence sur le mainnet doit être évalué en termes de performances du code, de sécurité et d'autres caractéristiques. C'est là que l'audit - un processus rigoureux de test de contrat - prend tout son sens, vous permettant de découvrir les vulnérabilités potentielles et les faiblesses du contrat.
Voici une liste de contrôle d'audit rapide pour commencer:
Liste de contrôle incroyable pour l'audit des contrats intelligents😈
Assurez-vous de les vérifier lors de votre prochain audit✅
Je vous serais reconnaissant de retweeter, de diffuser les connaissances🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 juillet 2023
Lors de la lecture et de l'écriture des contrats intelligents, il est nécessaire de bien comprendre que l'audit occupe une place spéciale, car il implique de vérifier en premier lieu la logique. En ce qui concerne l'exécution du code basé sur la blockchain, tout est immuable, et tout événement catastrophique peut avoir des conséquences irréversibles lors de l'exécution du contrat. C'est précisément pour cette raison qu'une vérification minutieuse du code du contrat et d'autres aspects via un audit est nécessaire.
Il peut y avoir toute une gamme devulnérabilités contractuellesqu'un audit détaillé du contrat intelligent peut identifier. Cela inclut la vérification des attaques de réentrance, des débordements ou des sous-débordements, des problèmes liés au contrôle d'accès, et plus encore. Une fois que la nature exacte du problème est déterminée, l'auditeur peut même suggérer les meilleures pratiques pour le corriger.
Vous vous demandez toujours en quoi l'audit des contrats intelligents peut aider ? Eh bien, revenons à l'infâmeDAO hack en 2016, qui a exploité un problème de réentrée et a causé une perte de près de 3,6 millions d’ETH. De même, il y a eu le piratage du contrat de portefeuille Parity en 2017, entraînant une perte de près de 500 000 ETH. Ces problèmes auraient pu être évités avec la bonne série d’audits.
Schéma de piratage de DAO : BeInCrypto
Il existe de nombreuses stratégies pour auditer les contrats intelligents. Certains des plus populaires incluent :
Ces outils agissent comme le premier ensemble de défenses et sont mieux utilisés pour localiser les vulnérabilités courantes. Certains des outils les plus populaires incluent Securify, Mythril, et plus encore - capables d'effectuer une analyse statique du code, de détecter des schémas de violation, et d'aider à obtenir une avance spécifique en matière de sécurité.
Outils d'audit de contrats intelligents : BeInCrypto
C'est là que les examinateurs de code manuels entrent en scène, scrutant la base de code et identifiant les vulnérabilités complexes, le cas échéant. Une révision manuelle peut aider à prendre soin de la logique métier, du contexte et des schémas d'utilisation.
Voici comment les révisions de code manuelles vous aident à localiser les menaces :
Un petit jeu de questions pour nos jeunes auditeurs !
Allons-y et retweetez si vous avez trouvé le bug !pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles) 8 juillet 2023
Des outils tels que Snyk et GuardRails aident à la numérisation automatique des contrats - une implémentation de sécurité qui est invoquée à chaque fois que le code est mis à jour. Cette forme d'audit garantit que les nouvelles modifications apportées à un code sont sûres et non invasives.
Il s’agit d’un processus complexe qui repose uniquement sur la vérification de la logique métier du code. Notez que la vérification formelle n’est pas réellement destinée à vérifier la syntaxe, mais uniquement la logique pour voir si le code s’exécute comme souhaité.
En plus des stratégies mentionnées, l’audit des contrats intelligents peut également être initié à l’aide d’examens par les pairs, de programmes de bug bounty et de couvertures de test via des outils tels que la couverture Solidity pour maximiser l’efficacité.
Un moyen simple d'auditer les contrats intelligents : BeInCrypto
Si vous êtes nouveau dans l'audit des contrats intelligents, il est important de noter qu'il existe deux façons d'analyser largement le code et d'identifier les problèmes. Celles-ci incluent :
Ce type d'analyse de code aide à identifier les vulnérabilités de sécurité de base, les erreurs de codage et d'autres problèmes selon les normes de codage données et les conventions. Les menaces telles que les appels non vérifiés aux sources externes, les débordements d'entiers, et plus encore peuvent être mis en évidence à l'aide de l'analyse statique. La meilleure chose à propos de l'analyse statique est que le code n'a pas besoin d'être exécuté pour être vérifié.
Cette approche de l’audit teste l’alignement du code avec l’EVM. Au lieu de se contenter de vérifier le code, l’analyse dynamique recoupe la réponse des contrats intelligents à un large éventail d’entrées. L’analyse dynamique permet d’identifier des problèmes tels qu’une consommation de gaz incohérente et même une logique contractuelle erronée. Les environnements de blockchain personnels comme Ganache peuvent fonctionner comme des plateformes d’analyse dynamiques, permettant aux développeurs d’effectuer des transactions, d’exécuter des commandes et de faire bien plus avec leurs contrats.
Voici un extrait de contrat intelligent qui fonctionne comme un stockage de fonds, avec une fonction de retrait:
pragma solidité ^0.6.1;contrat ContratVulnérable { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Solde insuffisant."); (bool succès, ) = msg.sender.call{value: _amount}(""); require(succès, "Échec du transfert."); balances[msg.sender] -= _amount; }}
Si vous regardez de près le code, il y a une vulnérabilité clé :
Dans le cas précédent, la fonction "retirer" peut être appelée à nouveau si l'utilisateur recevant les fonds est également un smart contract, bien que malveillant. Par conséquent, avant que la dernière fonction ou la mise à jour du solde ne se produise, une attaque de réentrance peut être lancée pour transférer des fonds supplémentaires. Les auditeurs expérimentés identifient ce type de vulnérabilité.
Voici le code corrigé pour la même chose :
fonction retirer(uint256 _montant) public { require(soldes[msg.sender] >= _montant, "Solde insuffisant."); soldes[msg.sender] -= _montant; (bool succes, ) = msg.sender.call{value: _montant}("");
require(success, “Transfer failed.”);}
Vérifiez comment la fonction de mise à jour du solde est appelée d'abord, puis le premier mouvement vers l'utilisateur. Ce changement dans l'ordre des opérations est ce qui corrige le contrat.
Le monde des applications décentralisées et des contrats intelligents a dépassé Ethereum. Même si la majeure partie de l'action se déroule encore dans l'écosystème Ethereum, il existe d'autres chaînes comme Cardano, Solana, et d'autres encore qui prennent en charge les contrats intelligents et nécessitent des normes d'audit différentes.
Les différentes blockchains utilisent des langages de programmation différents. Les sémantiques, la syntaxe et les propriétés du code sont différentes, ce qui rend les contrats intelligents réactifs à différentes pratiques d'écriture et d'audit. Par exemple, Ethereum utilise Solidity, tandis que Polkadotutilise de l'encre et de la rouille, ce qui le rend réactif à des normes d'audit spécifiques.
Maintenant, si vous voulez aller au-delà d'Ethereum, il existe quelques outils d'audit spécialisés pour vous aider à démarrer. Par exemple, avec Cardano, il y a la suite Marlowe pour la vérification formelle et l'audit. En ce qui concerne Solana, les libfuzzer spécifiques à Rust et cargo-fuzz sont destinés à l'audit et aux tests de contrat. Un auditeur multi-chaîne doit être familier avec ces concepts pour éviter les vulnérabilités du contrat.
Pour réitérer, vous pouvez séparer l'audit des contrats intelligents en trois types : manuel, automatique et hybride. Notez que les gens préfèrent les stratégies d'audit hybrides pour les contrats complexes avec une logique commerciale approfondie car elles sont les plus complètes.
Les organisations et les personnes ayant des connaissances minimales en codage sous-traitent souvent leurs exigences en matière de rédaction et d’audit à des entreprises réputées. Lorsqu’il s’agit d’audit, le choix de la bonne entreprise devient d’autant plus important que même si outils d'IAcommeChatGPTpeut aider à écrire du code de contrat intelligent, la vérification nécessite des insights manuels.
De plus, voici les facteurs à prendre en note lors de l'externalisation des tâches d'audit :
Avant de vous concentrer sur la bonne société d'externalisation, il est crucial de vérifier les audits passés, d'évaluer l'expérience et même de se concentrer sur les principaux membres de l'équipe.
Avant de procéder à une embauche, prenez note des coûts et des services associés aux audits. Il est impératif de comprendre d'abord la nature des services offerts, tels que l'identification des problèmes, la résolution des problèmes, et plus encore. Vous devez également vérifier si des ré-audits sont également fournis après la mise en œuvre de la première série de correctifs. Le coût d'un audit de contrat intelligent peut varier en fonction des services, il est donc nécessaire de suivre chaque exigence et offre avant de procéder.
Au cas où vous voudriez abandonner une entreprise et auditer vous-même les contrats intelligents, voici les meilleures stratégies et pratiques à garder à l'esprit :
L’intelligence artificielle facilite en effet l’écriture de contrats intelligents. Cependant, indépendamment de l’innovation en matière d’IA, la capacité d’auditer les contrats intelligents de la meilleure façon possible nécessite toujours une intervention humaine. Par conséquent, si vous envisagez de créer votre prochain produit web3 en mettant l’accent sur les contrats intelligents et les applications décentralisées, il est crucial de vous concentrer religieusement sur les meilleures ressources d’audit pour vos contrats intelligents. Avec les piratages et les violations de crypto-monnaie qui font surface chaque jour qui passe et les pirates qui planifient de nouvelles stratégies pour percer, l’audit d’un contrat à la perfection est certainement l’un des ensembles de compétences modernes les plus importants.