Introduction aux contrats intelligents

Dans cet article, nous examinerons ce que sont les contrats intelligents, ce qu'ils sont, nous nous familiariserons avec les différentes plates-formes de contrats intelligents, leurs fonctionnalités, et discuterons également de leur fonctionnement et des avantages qu'ils peuvent apporter. Ce matériel sera très utile pour les lecteurs qui ne connaissent pas bien le sujet des contrats intelligents, mais qui souhaitent se rapprocher de sa compréhension.

Contrat régulier vs. contrat intelligent

Avant d'entrer dans les détails, prenons un exemple des différences entre un contrat ordinaire, spécifié sur papier, et un contrat intelligent, représenté numériquement.

Introduction aux contrats intelligents

Comment cela fonctionnait-il avant l’avènement des contrats intelligents ? Imaginez un groupe de personnes qui souhaitent établir certaines règles et conditions pour la répartition des valeurs, ainsi qu'un certain mécanisme pour garantir la mise en œuvre de cette répartition selon les règles et conditions données. Ensuite, ils se réunissaient, rédigeaient un papier sur lequel ils notaient leurs données d'identification, les termes, les valeurs impliquées, les dataient et les signaient. Ce contrat a également été certifié par une partie de confiance, comme un notaire. De plus, ces personnes sont allées dans des directions différentes avec leur copie papier d'un tel contrat et ont commencé à effectuer certaines actions qui pourraient ne pas correspondre au contrat lui-même, c'est-à-dire qu'elles ont fait une chose, mais sur papier, il était certifié qu'elles devaient faire quelque chose. complètement différent. Et comment sortir de cette situation ? En fait, l'un des membres du groupe doit prendre ce document, recueillir des preuves, le porter devant le tribunal et assurer la conformité entre le contrat et les actions réelles. Bien souvent, il est difficile de parvenir à une mise en œuvre équitable de ce contrat, ce qui entraîne des conséquences désagréables.

Que peut-on dire des contrats intelligents ? Ils combinent à la fois la possibilité de rédiger les termes du contrat et le mécanisme de leur stricte mise en œuvre. Si les conditions ont été fixées et que la transaction ou la demande correspondante a été signée, alors une fois cette demande ou cette transaction acceptée, il n'est plus possible de modifier les conditions ou d'affecter leur mise en œuvre.

Il existe un validateur ou un réseau entier, ainsi qu'une base de données qui stocke tous les contrats intelligents soumis pour exécution dans un ordre chronologique strict. Il est également important que cette base de données contienne toutes les conditions de déclenchement de l’exécution du contrat intelligent. De plus, il doit prendre en compte la valeur même dont la répartition est décrite dans le contrat. Si cela s'applique à une monnaie numérique, alors cette base de données devrait en tenir compte.

En d’autres termes, les validateurs de contrats intelligents doivent avoir accès à toutes les données sur lesquelles le contrat intelligent fonctionne. Par exemple, une seule base de données doit être utilisée pour comptabiliser simultanément les monnaies numériques, les soldes des utilisateurs, les transactions des utilisateurs et les horodatages. Ensuite, dans un contrat intelligent, la condition peut être le solde de l’utilisateur dans une certaine devise, l’arrivée d’une certaine heure ou le fait qu’une certaine transaction ait été effectuée, mais rien de plus.

Définition d'un contrat intelligent

En général, la terminologie elle-même a été inventée par le chercheur Nick Szabo et utilisée pour la première fois en 1994, et a été documentée en 1997 dans un article décrivant l'idée même des contrats intelligents.

Les contrats intelligents impliquent une certaine automatisation de la distribution de la valeur, qui ne peut dépendre que de conditions prédéterminées à l'avance. Dans sa forme la plus simple, il ressemble à un contrat aux termes strictement définis, signé par certaines parties.

Les contrats intelligents sont conçus pour minimiser la confiance envers les tiers. Parfois, le centre de décision dont tout dépend est totalement exclu. De plus, ces contrats sont plus faciles à auditer. Ceci est une conséquence de certaines caractéristiques de conception d'un tel système, mais le plus souvent on entend par contrat intelligent un environnement décentralisé et la présence de fonctions qui permettent à quiconque d'analyser la base de données et de réaliser un audit complet de l'exécution des contrats. Cela garantit une protection contre les modifications rétroactives des données qui entraîneraient des modifications dans l'exécution du contrat lui-même. La numérisation de la plupart des processus lors de la création et du lancement d'un contrat intelligent simplifie souvent la technologie et le coût de leur mise en œuvre.

Un exemple simple – Service Escrow

Regardons un exemple très simple. Cela vous aidera à mieux comprendre la fonctionnalité des contrats intelligents, ainsi qu'à mieux comprendre dans quels cas ils doivent être utilisés.

Introduction aux contrats intelligents

Il peut également être mis en œuvre à l’aide de Bitcoin, même si, à l’heure actuelle, Bitcoin peut encore difficilement être qualifié de plate-forme à part entière pour les contrats intelligents. Nous avons donc un acheteur et une boutique en ligne. Un client souhaite acheter un moniteur dans ce magasin. Dans le cas le plus simple, l'acheteur effectue et envoie un paiement, et la boutique en ligne l'accepte, le confirme, puis expédie la marchandise. Cependant, dans cette situation, une grande confiance est nécessaire - l'acheteur doit faire confiance à la boutique en ligne pour la totalité du coût du moniteur. Étant donné qu'une boutique en ligne peut avoir une mauvaise réputation aux yeux de l'acheteur, il existe un risque que, pour une raison quelconque, après avoir accepté le paiement, la boutique refuse le service et n'envoie pas les marchandises à l'acheteur. Par conséquent, l'acheteur se pose la question (et, par conséquent, la boutique en ligne pose cette question) de ce qui peut être appliqué dans ce cas afin de minimiser ces risques et de rendre ces transactions plus fiables.

Dans le cas du Bitcoin, il est possible de permettre à l’acheteur et au vendeur de sélectionner indépendamment un médiateur. De nombreuses personnes participent à la résolution de questions controversées. Et nos participants peuvent choisir parmi une liste générale de médiateurs celui en qui ils auront confiance. Ensemble, ils créent une adresse multisignature 2 sur 3 où il y a trois clés et deux signatures avec deux clés quelconques sont nécessaires pour dépenser des pièces à partir de cette adresse. Une clé appartiendra à l'acheteur, la seconde à la boutique en ligne et la troisième au médiateur. Et à une telle adresse multisignature, l'acheteur enverra le montant nécessaire pour payer le moniteur. Désormais, lorsque le vendeur constate que l'argent est bloqué depuis un certain temps à une adresse multisignature qui dépend de lui, il peut envoyer le moniteur par courrier en toute sécurité.

Ensuite, l'acheteur reçoit le colis, inspecte les marchandises et prend une décision sur l'achat final. Il peut être entièrement d'accord avec le service fourni et signer la transaction avec sa clé, où il transfère les pièces de l'adresse multisignature au vendeur, ou il peut être insatisfait de quelque chose. Dans le second cas, il contacte un médiateur pour mettre en place une transaction alternative qui répartira différemment ces pièces.

Disons que le moniteur est arrivé un peu rayé et que le kit ne comprenait pas de câble pour se connecter à l'ordinateur, bien que le site Web de la boutique en ligne indique que le câble devrait être inclus dans le kit. Ensuite, l'acheteur rassemble les preuves nécessaires pour prouver au médiateur qu'il a été trompé dans cette situation : il prend des captures d'écran du site, prend une photo du reçu de courrier, prend une photo des rayures sur le moniteur et montre que le sceau a été cassé et le câble a été retiré. La boutique en ligne, à son tour, collecte ses preuves et les transmet au médiateur.

Le médiateur souhaite satisfaire simultanément à la fois l’indignation de l’acheteur et les intérêts de la boutique en ligne (on comprendra pourquoi plus tard). Il s'agit d'une transaction dans laquelle les pièces d'une adresse multisignature seront dépensées dans une certaine proportion entre l'acheteur, la boutique en ligne et l'intermédiaire, puisqu'il en prend une partie pour lui-même en récompense de son travail. Disons que 90 % du montant total va au vendeur, 5 % au médiateur et 5 % à l'acheteur. Le médiateur signe cette transaction avec sa clé, mais elle ne peut pas encore être appliquée, car elle nécessite deux signatures, mais une seule vaut la peine. Il envoie une telle transaction à la fois à l'acheteur et au vendeur. Si au moins l'un d'entre eux est satisfait de cette option de redistribution des pièces, alors la transaction sera pré-signée et distribuée sur le réseau. Pour le valider, il suffit qu’une des parties à la transaction soit d’accord avec l’option du médiateur.

Il est important de choisir dans un premier temps un médiateur afin que les deux participants lui fassent confiance. Dans ce cas, il agira indépendamment des intérêts de l’un ou de l’autre et évaluera objectivement la situation. Si le médiateur ne propose pas d'option de distribution de pièces qui satisferait au moins un participant, alors, après avoir convenu ensemble, l'acheteur et la boutique en ligne peuvent envoyer les pièces à une nouvelle adresse multisignature en apposant leurs deux signatures. La nouvelle adresse multisignature sera élaborée avec un médiateur différent, qui pourrait être plus compétent en la matière et offrir une meilleure option.

Exemple avec un dortoir et un réfrigérateur

Examinons un exemple plus complexe qui affiche plus explicitement les capacités d'un contrat intelligent.

Introduction aux contrats intelligents

Disons qu'il y a trois gars qui ont récemment emménagé dans le même dortoir. Tous les trois souhaitent acheter un réfrigérateur pour leur chambre qu’ils pourront utiliser ensemble. L’un d’eux s’est porté volontaire pour récolter la somme nécessaire à l’achat d’un réfrigérateur et négocier avec le vendeur. Cependant, ils ne se sont rencontrés que récemment et il n’y a pas suffisamment de confiance entre eux. Visiblement, deux d’entre eux prennent un risque en donnant de l’argent au troisième. De plus, ils doivent parvenir à un accord sur le choix d’un vendeur.

Ils peuvent utiliser le service de dépôt fiduciaire, c'est-à-dire choisir un médiateur qui surveillera l'exécution de la transaction et résoudra les problèmes controversés le cas échéant. Ensuite, après avoir accepté, ils rédigent un contrat intelligent et y prescrivent certaines conditions.

La première condition est qu'avant un certain délai, disons dans un délai d'une semaine, le compte de contrat intelligent correspondant doit recevoir trois paiements de certaines adresses pour un certain montant. Si cela ne se produit pas, le contrat intelligent cesse de s'exécuter et renvoie les pièces à tous les participants. Si la condition est remplie, alors les valeurs des identifiants du vendeur et du médiateur sont fixées, et la condition est vérifiée que tous les participants sont d'accord avec le choix du vendeur et du médiateur. Lorsque toutes les conditions seront remplies, les fonds seront transférés aux adresses spécifiées. Cette approche peut protéger les participants contre la fraude de quelque part que ce soit et élimine généralement le besoin de faire confiance.

Nous voyons dans cet exemple le principe même selon lequel cette capacité à définir étape par étape les paramètres pour remplir chaque condition vous permet de créer des systèmes de n'importe quelle complexité et profondeur de niveaux imbriqués. De plus, vous pouvez d'abord définir la première condition dans le contrat intelligent, et ce n'est qu'après sa réalisation que vous pourrez définir les paramètres de la condition suivante. En d’autres termes, la condition est formellement écrite et ses paramètres peuvent être définis dès son fonctionnement.

Classification des contrats intelligents

Pour la classification, vous pouvez définir différents groupes de critères. Cependant, au moment du développement technologique, quatre d’entre eux sont pertinents.

Les contrats intelligents se distinguent par leur environnement d’exécution, qui peut être soit centralisé, soit décentralisé. Dans le cas de la décentralisation, nous bénéficions d’une indépendance et d’une tolérance aux pannes bien plus grandes lors de l’exécution de contrats intelligents.

Ils se distinguent également par le processus de définition et de réalisation des conditions : ils peuvent être librement programmables, limités ou prédéfinis, c'est-à-dire strictement typés. Lorsqu'il n'y a que 4 contrats intelligents spécifiques sur la plateforme de contrats intelligents, leurs paramètres peuvent être définis de n'importe quelle manière. En conséquence, leur définition est beaucoup plus simple : nous sélectionnons un contrat dans la liste et transmettons les paramètres.

Selon la méthode d'initiation, il existe des contrats intelligents automatisés, c'est-à-dire que lorsque certaines conditions sont remplies, ils sont auto-exécutables, et il existe des contrats dans lesquels les conditions sont spécifiées, mais la plateforme ne vérifie pas automatiquement leur respect ; pour cela, ils doivent être initiés séparément.

De plus, les contrats intelligents varient en termes de niveau de confidentialité. Ils peuvent être totalement ouverts, partiellement ou totalement confidentiels. Ce dernier signifie que les observateurs tiers ne voient pas les termes des contrats intelligents. Cependant, le sujet de la vie privée est très vaste et il est préférable de l’examiner séparément de l’article actuel.

Ci-dessous, nous examinerons de plus près les trois premiers critères pour apporter plus de clarté à la compréhension du sujet actuel.

Contrats intelligents par runtime

Introduction aux contrats intelligents

En fonction de l'environnement d'exécution, une distinction est faite entre les plateformes de contrats intelligents centralisées et décentralisées. Dans le cas de contrats numériques centralisés, un seul service est utilisé, où il n'y a qu'un seul validateur et il peut y avoir un service de sauvegarde et de restauration, également géré de manière centralisée. Il existe une base de données qui stocke toutes les informations nécessaires pour définir les termes du contrat intelligent et distribuer la valeur prise en compte dans cette même base de données de service. Un tel service centralisé a un client qui fixe des conditions avec certaines demandes et utilise de tels contrats. En raison de la nature centralisée de la plateforme, les mécanismes d’authentification peuvent être moins sécurisés que ceux des crypto-monnaies.

A titre d'exemple, nous pouvons prendre les fournisseurs de communications mobiles (différents opérateurs mobiles). Disons qu'un certain opérateur tient un enregistrement centralisé du trafic sur ses serveurs, qui peut être transmis sous différents formats, par exemple : sous forme d'appels vocaux, de transmission SMS, de trafic Internet mobile, et selon différentes normes, et tient également des enregistrements des fonds sur les soldes des utilisateurs. Ainsi, le fournisseur de communications mobiles peut établir des contrats de comptabilisation des services fournis et de leur paiement à des conditions différentes. Dans ce cas, il est facile de poser des conditions comme « envoyer un SMS avec tel ou tel code à tel ou tel numéro et vous recevrez telles ou telles conditions de répartition du trafic ».

Un autre exemple peut être donné : les banques traditionnelles avec des fonctionnalités étendues de banque par Internet et des contrats très simples tels que des paiements réguliers, la conversion automatique des paiements entrants, la déduction automatique des intérêts sur un compte spécifié, etc.

Si nous parlons de contrats intelligents avec un environnement d'exécution décentralisé, nous avons alors un groupe de validateurs. Idéalement, n’importe qui peut devenir validateur. En raison du protocole de synchronisation des bases de données et de l'obtention d'un consensus, nous disposons d'une base de données commune qui stockera désormais toutes les transactions avec des contrats strictement décrits, et non des requêtes conditionnelles dont les formats changent souvent et il n'y a pas de spécification ouverte. Ici, les transactions contiendront des instructions pour exécuter le contrat selon une spécification stricte. Cette spécification est ouverte et, par conséquent, les utilisateurs de la plateforme eux-mêmes peuvent auditer et valider les contrats intelligents. Nous voyons ici que les plateformes décentralisées sont supérieures aux plateformes centralisées en termes d’indépendance et de tolérance aux pannes, mais leur conception et leur maintenance sont beaucoup plus complexes.

Contrats intelligents par la méthode de définition et de respect des conditions

Examinons maintenant de plus près en quoi les contrats intelligents peuvent différer dans la manière dont ils fixent et remplissent les conditions. Nous tournons ici notre attention vers les contrats intelligents programmables de manière aléatoire et complets par Turing. Un contrat intelligent Turing-complete vous permet de définir presque tous les algorithmes comme conditions d'exécution du contrat : cycles d'écriture, certaines fonctions de calcul de probabilités, etc. - jusqu'à vos propres algorithmes de signature électronique. Dans ce cas, nous entendons une écriture logique véritablement arbitraire.

Il existe également des contrats intelligents arbitraires, mais pas des contrats complets de Turing. Cela inclut Bitcoin et Litecoin avec leur propre script. Cela signifie que vous ne pouvez utiliser que certaines opérations dans n'importe quel ordre, mais vous ne pouvez plus écrire de boucles ni vos propres algorithmes.

De plus, il existe des plateformes de contrats intelligents qui mettent en œuvre des contrats intelligents prédéfinis. Ceux-ci incluent Bitshares et Steemit. Bitshares propose une gamme de contrats intelligents pour le trading, la gestion de compte, la gestion de la plateforme elle-même et de ses paramètres. Steemit est une plateforme similaire, mais elle ne se concentre plus sur l'émission de jetons et le commerce, comme Bitshares, mais sur les blogs, c'est-à-dire qu'elle stocke et traite le contenu de manière décentralisée.

Les contrats arbitraires Turing-complete incluent la plate-forme Ethereum et RootStock, qui est toujours en cours de développement. Par conséquent, ci-dessous, nous nous attarderons un peu plus en détail sur la plateforme de contrats intelligents Ethereum.

Contrats intelligents par méthode d'initiation

En fonction de la méthode d'initiation, les contrats intelligents peuvent également être divisés en au moins deux groupes : automatisés et manuels (non automatisés). Les contrats automatisés se caractérisent par le fait que, compte tenu de tous les paramètres et conditions connus, le contrat intelligent est exécuté de manière entièrement automatique, c'est-à-dire qu'il ne nécessite pas l'envoi de transactions supplémentaires ni le paiement d'une commission supplémentaire pour chaque exécution ultérieure. La plateforme elle-même dispose de toutes les données nécessaires pour calculer la manière dont le contrat intelligent se terminera. La logique n’y est pas arbitraire, mais prédéterminée et tout cela est prévisible. Autrement dit, vous pouvez estimer à l'avance la complexité de l'exécution d'un contrat intelligent, utiliser une sorte de commission constante pour celui-ci et tous les processus de mise en œuvre sont plus efficaces.

Pour les contrats intelligents librement programmés, l’exécution n’est pas automatisée. Pour lancer un tel contrat intelligent, vous devez pratiquement à chaque étape créer une nouvelle transaction qui appellera la prochaine étape d'exécution ou la prochaine méthode de contrat intelligent, payer la commission appropriée et attendre que la transaction soit confirmée. L'exécution peut se terminer avec succès ou non, car le code du contrat intelligent est arbitraire et des moments imprévisibles peuvent apparaître, comme une boucle éternelle, un manque de certains paramètres et arguments, des exceptions non gérées, etc.

Comptes Ethereum

Types de comptes Ethereum

Voyons quels types de comptes il peut y avoir sur la plateforme Ethereum. Il n'y a que deux types de comptes ici et il n'y a pas d'autres options. Le premier type est appelé compte utilisateur, le second est un compte contractuel. Voyons en quoi ils diffèrent.

Le compte utilisateur est contrôlé uniquement par la clé personnelle de la signature électronique. Le titulaire du compte génère sa propre paire de clés pour la signature électronique à l'aide de l'algorithme ECDSA (Elliptic Curve Digital Signature Algorithm). Seules les transactions signées avec cette clé peuvent modifier l'état de ce compte.

Une logique distincte est fournie pour le compte de contrat intelligent. Il ne peut être contrôlé que par un code logiciel prédéfini qui détermine entièrement le comportement du contrat intelligent : comment il gérera ses pièces dans certaines circonstances, à l'initiative de quel utilisateur et dans quelles conditions supplémentaires ces pièces seront distribuées. Si certains points ne sont pas prévus par les développeurs dans le code du programme, des problèmes peuvent survenir. Par exemple, un contrat intelligent peut recevoir un certain état dans lequel il n'accepte le lancement d'une exécution ultérieure de la part d'aucun des utilisateurs. Dans ce cas, les pièces seront effectivement gelées, car le contrat intelligent ne prévoit pas la sortie de cet état.

Comment les comptes sont créés sur Ethereum

Dans le cas d'un compte utilisateur, le propriétaire génère indépendamment une bi-clé à l'aide d'ECDSA. Il est important de noter qu’Ethereum utilise exactement le même algorithme et exactement la même courbe elliptique pour les signatures électroniques que Bitcoin, mais l’adresse est calculée de manière légèrement différente. Ici, le résultat du double hachage n'est plus utilisé, comme dans Bitcoin, mais le hachage simple est assuré par la fonction Keccak d'une longueur de 256 bits. Les bits les moins significatifs sont coupés de la valeur résultante, à savoir les 160 bits les moins significatifs de la valeur de hachage de sortie. En conséquence, nous obtenons une adresse dans Ethereum. En fait, cela prend 20 octets.

Veuillez noter que l'identifiant du compte dans Ethereum est codé en hexadécimal sans appliquer de somme de contrôle, contrairement à Bitcoin et à de nombreux autres systèmes, où l'adresse est codée dans un système numérique en base 58 avec l'ajout d'une somme de contrôle. Cela signifie que vous devez être prudent lorsque vous travaillez avec des identifiants de compte dans Ethereum : même une erreur dans l'identifiant entraînera certainement la perte de pièces.

Il y a une fonctionnalité importante et c'est qu'un compte utilisateur au niveau de la base de données générale est créé au moment où il accepte le premier paiement entrant.

La création d'un compte de contrat intelligent adopte une approche complètement différente. Initialement, l'un des utilisateurs écrit le code source du contrat intelligent, après quoi le code passe par un compilateur spécial pour la plate-forme Ethereum, obtenant ainsi le bytecode pour sa propre machine virtuelle Ethereum. Le bytecode résultant est placé dans un champ spécial de la transaction. Il est certifié au nom du compte de l’initiateur. Ensuite, cette transaction se propage sur tout le réseau et place le code du contrat intelligent. La commission pour la transaction et, par conséquent, pour l’exécution du contrat est prélevée sur le solde du compte de l’initiateur.

Chaque contrat intelligent contient nécessairement son propre constructeur (de ce contrat). Il peut être vide ou contenir du contenu. Une fois le constructeur exécuté, un identifiant de compte de contrat intelligent est créé, à l'aide duquel vous pouvez envoyer des pièces, appeler certaines méthodes de contrat intelligent, etc.

Structure des transactions Ethereum

Pour que ce soit plus clair, nous commencerons par examiner la structure d'une transaction Ethereum et un exemple de code de contrat intelligent.

Introduction aux contrats intelligents

Une transaction Ethereum se compose de plusieurs champs. Le premier d'entre eux, occasionnellement, est un certain numéro de série de la transaction relatif au compte lui-même qui la distribue et qui en est l'auteur. Ceci est nécessaire pour distinguer les doubles transactions, c'est-à-dire exclure le cas où la même transaction est acceptée deux fois. En utilisant un identifiant, chaque transaction possède une valeur de hachage unique.

Vient ensuite un champ comme prix du gaz. Cela indique le prix auquel la devise de base Ethereum est convertie en gaz, qui est utilisé pour payer l'exécution du contrat intelligent et l'allocation des ressources de la machine virtuelle. Qu'est-ce que ça veut dire?

Dans Bitcoin, les frais sont payés directement par la devise de base, le Bitcoin lui-même. Ceci est possible grâce à un mécanisme simple de calcul : nous payons strictement pour la quantité de données contenues dans la transaction. Dans Ethereum, la situation est plus compliquée, car il est très difficile de se fier au volume des données de transaction. Ici, la transaction peut également contenir du code de programme qui sera exécuté sur la machine virtuelle, et chaque opération de la machine virtuelle peut avoir une complexité différente. Il existe également des opérations qui allouent de la mémoire aux variables. Ils auront leur propre complexité, dont dépendra le paiement de chaque opération.

Le coût de chaque opération en équivalent gaz sera constant. Il est introduit spécifiquement afin de déterminer le coût constant de chaque opération. En fonction de la charge du réseau, le prix du gaz changera, c'est-à-dire le coefficient selon lequel la devise de base sera convertie en cette unité auxiliaire pour payer la commission.

Il y a une autre caractéristique d'une transaction dans Ethereum : le bytecode qu'il contient pour l'exécution dans une machine virtuelle sera exécuté jusqu'à ce qu'il se termine avec un résultat (succès ou échec) ou jusqu'à ce qu'un certain nombre de pièces allouées soient épuisées pour payer la commission. . C'est afin d'éviter une situation où, en cas d'erreur, toutes les pièces du compte de l'expéditeur ont été dépensées en commission (par exemple, une sorte de cycle éternel démarré dans une machine virtuelle), le champ suivant existe - démarrer le gaz (souvent appelée limite de gaz) - elle détermine le montant maximum de pièces que l'expéditeur est prêt à dépenser pour effectuer une certaine transaction.

Le champ suivant s'appelle adresse de destination. Cela inclut l'adresse du destinataire des pièces ou l'adresse d'un contrat intelligent spécifique dont les méthodes seront appelées. Après vient le terrain Plus-value, où est saisi le montant des pièces envoyées à l’adresse de destination.

Vient ensuite un domaine intéressant appelé données, où s'inscrit toute la structure. Il ne s'agit pas d'un champ séparé, mais d'une structure entière dans laquelle le code de la machine virtuelle est défini. Vous pouvez placer ici des données arbitraires - il existe des règles distinctes pour cela.

Et le dernier champ s'appelle Signature. Il contient simultanément à la fois la signature électronique de l'auteur de cette transaction et la clé publique avec laquelle cette signature sera vérifiée. À partir de la clé publique, vous pouvez obtenir l’identifiant du compte de l’expéditeur de cette transaction, c’est-à-dire identifier de manière unique le compte de l’expéditeur dans le système lui-même. Nous avons découvert l'essentiel de la structure de la transaction.

Exemple de code de contrat intelligent pour Solidity

Examinons maintenant de plus près le contrat intelligent le plus simple à l'aide d'un exemple.

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

Ci-dessus se trouve un code source simplifié qui peut contenir les pièces des utilisateurs et les restituer sur demande.

Ainsi, il existe un contrat intelligent bancaire qui remplit les fonctions suivantes : il accumule des pièces sur son solde, c'est-à-dire que lorsqu'une transaction est confirmée et qu'un tel contrat intelligent est placé, un nouveau compte est créé qui peut contenir des pièces sur son solde ; il mémorise les utilisateurs et la répartition des pièces entre eux ; dispose de plusieurs méthodes de gestion des soldes, c’est-à-dire qu’il est possible de reconstituer, de retirer et de vérifier le solde de l’utilisateur.

Passons en revue chaque ligne du code source. Ce contrat a des champs constants. L'un d'eux, de type adresse, est appelé propriétaire. Ici, le contrat mémorise l'adresse de l'utilisateur qui a créé ce contrat intelligent. De plus, il existe une structure dynamique qui maintient la correspondance entre les adresses des utilisateurs et les soldes.

Vient ensuite la méthode bancaire - elle porte le même nom que le contrat. En conséquence, c'est son constructeur. Ici, la variable propriétaire se voit attribuer l'adresse de la personne qui a placé ce contrat intelligent sur le réseau. C'est la seule chose qui se passe dans ce constructeur. Autrement dit, msg dans ce cas correspond exactement aux données qui ont été transférées à la machine virtuelle avec la transaction contenant l'intégralité du code de ce contrat. En conséquence, msg.sender est l'auteur de cette transaction qui héberge ce code. Il sera le propriétaire du contrat intelligent.

La méthode de dépôt vous permet de transférer un certain nombre de pièces sur le compte contractuel par transaction. Dans ce cas, le contrat intelligent, recevant ces pièces, les laisse dans son bilan, mais enregistre dans la structure des soldes qui était exactement l'expéditeur de ces pièces afin de savoir à qui elles appartiennent.

La méthode suivante s'appelle retirer et elle prend un paramètre : le montant de pièces que quelqu'un souhaite retirer de cette banque. Cela vérifie s'il y a suffisamment de pièces dans le solde de l'utilisateur qui appelle cette méthode pour les envoyer. S'il y en a suffisamment, le contrat intelligent lui-même renvoie ce nombre de pièces à l'appelant.

Vient ensuite la méthode de vérification du solde actuel de l'utilisateur. Celui qui appelle cette méthode sera utilisé pour récupérer ce solde dans le contrat intelligent. Il convient de noter que le modificateur de cette méthode est la vue. Cela signifie que la méthode elle-même ne modifie en aucune façon les variables de sa classe et qu’il s’agit en réalité uniquement d’une méthode de lecture. Aucune transaction distincte n'est créée pour appeler cette méthode, aucun frais n'est payé et tous les calculs sont effectués localement, après quoi l'utilisateur reçoit le résultat.

La méthode kill est nécessaire pour détruire l’état du contrat intelligent. Et ici, il y a une vérification supplémentaire si l'appelant de cette méthode est le propriétaire de ce contrat. Si tel est le cas, alors le contrat s'autodétruit et la fonction de destruction prend un paramètre : l'identifiant du compte auquel le contrat enverra toutes les pièces restantes sur son solde. Dans ce cas, les pièces restantes seront automatiquement envoyées à l'adresse du titulaire du contrat.

Comment fonctionne un nœud complet sur le réseau Ethereum ?

Examinons schématiquement comment ces contrats intelligents sont exécutés sur la plate-forme Ethereum et comment fonctionne un nœud de réseau complet.

Introduction aux contrats intelligents

Un nœud complet sur le réseau Ethereum doit avoir au moins quatre modules.
Le premier, comme pour tout protocole décentralisé, est le module de réseau P2P - un module de connexion réseau et de travail avec d'autres nœuds, où sont échangés des blocs, des transactions et des informations sur d'autres nœuds. Il s’agit d’un composant traditionnel pour toutes les crypto-monnaies décentralisées.

Ensuite, nous avons un module pour stocker les données de la blockchain, les traiter, choisir une branche prioritaire, ajouter des blocs, dissocier des blocs, valider ces blocs, etc.

Le troisième module s'appelle EVM (Ethereum virtual machine) - il s'agit d'une machine virtuelle qui reçoit le bytecode des transactions Ethereum. Ce module prend l'état actuel d'un compte particulier et modifie son état en fonction du bytecode reçu. La version de la machine virtuelle sur chaque nœud de réseau doit être la même. Les calculs qui ont lieu sur chaque nœud Ethereum sont exactement les mêmes, mais ils se produisent de manière asynchrone : quelqu'un vérifie et accepte cette transaction plus tôt, c'est-à-dire exécute tout le code qu'elle contient, et quelqu'un plus tard. En conséquence, lorsqu'une transaction est créée, elle est distribuée sur le réseau, les nœuds l'acceptent et au moment de la vérification, de la même manière que Bitcoin Script est exécuté dans Bitcoin, le bytecode de la machine virtuelle est exécuté ici.

Une transaction est considérée comme vérifiée si tout le code qu'elle contient a été exécuté, un nouvel état d'un certain compte a été généré et enregistré jusqu'à ce qu'il soit clair si cette transaction a été appliquée ou non. Si la transaction est appliquée, cet état est considéré non seulement comme terminé, mais également comme actuel. Il existe une base de données qui stocke l'état de chaque compte pour chaque nœud du réseau. Étant donné que tous les calculs s'effectuent de la même manière et que l'état de la blockchain est le même, la base de données contenant les états de tous les comptes sera également la même pour chaque nœud.

Mythes et limites des contrats intelligents

Quant aux restrictions qui existent pour les plateformes de contrats intelligents similaires à Ethereum, on peut citer les suivantes :

  • exécution de code ;
  • allouer de la mémoire ;
  • données blockchain ;
  • envoyer des paiements ;
  • créer un nouveau contrat ;
  • appeler d'autres contrats.

Examinons les restrictions imposées à une machine virtuelle et, par conséquent, dissipons certains mythes sur les contrats intelligents. Sur une machine virtuelle, qui peut être non seulement dans Ethereum, mais également sur des plates-formes similaires, vous pouvez effectuer des opérations logiques véritablement arbitraires, c'est-à-dire écrire du code et il y sera exécuté, vous pouvez en outre allouer de la mémoire. Cependant, les frais sont payés séparément pour chaque opération et pour chaque unité de mémoire supplémentaire allouée.

Ensuite, la machine virtuelle peut lire les données de la base de données blockchain afin d'utiliser ces données comme déclencheur pour exécuter l'une ou l'autre logique de contrat intelligent. La machine virtuelle peut créer et envoyer des transactions, elle peut créer de nouveaux contrats et appeler des méthodes d'autres contrats intelligents déjà publiés sur le réseau : existants, disponibles, etc.

Le mythe le plus répandu est que les contrats intelligents Ethereum peuvent utiliser les informations de n’importe quelle ressource Internet selon leurs termes. La vérité est qu'une machine virtuelle ne peut pas envoyer de requête réseau à une ressource d'information externe sur Internet, c'est-à-dire qu'il est impossible d'écrire un contrat intelligent qui distribuera la valeur entre les utilisateurs en fonction, par exemple, du temps qu'il fait à l'extérieur. ou qui a remporté un championnat, ou sur la base de quel autre incident s'est produit dans le monde extérieur, car les informations sur ces incidents ne figurent tout simplement pas dans la base de données de la plateforme elle-même. Autrement dit, il n’y a rien sur la blockchain à ce sujet. Si elles n'y apparaissent pas, la machine virtuelle ne peut pas utiliser ces données comme déclencheurs.

Inconvénients de l'Ethereum

Listons les principaux. Le premier inconvénient est qu’il existe certaines difficultés dans la conception, le développement et le test des contrats intelligents dans Ethereum (Ethereum utilise le langage Solidity pour rédiger des contrats intelligents). En effet, la pratique montre qu'un très grand pourcentage de toutes les erreurs appartiennent au facteur humain. Cela est en fait vrai pour les contrats intelligents Ethereum déjà écrits qui ont une complexité moyenne ou supérieure. Si pour les contrats intelligents simples, la probabilité d'erreur est faible, alors dans les contrats intelligents complexes, il y a très souvent des erreurs qui conduisent au vol de fonds, à leur gel, à la destruction inattendue des contrats intelligents, etc. De nombreux cas de ce type sont déjà connu.

Le deuxième inconvénient est que la machine virtuelle elle-même n’est pas parfaite, puisqu’elle est également écrite par des personnes. Il peut exécuter des commandes arbitraires, et c'est là que réside la vulnérabilité : un certain nombre de commandes peuvent être configurées d'une certaine manière, ce qui entraînera des conséquences imprévues à l'avance. Il s’agit d’un domaine très complexe, mais plusieurs études montrent déjà que ces vulnérabilités existent dans la version actuelle du réseau Ethereum et qu’elles peuvent conduire à l’échec de nombreux contrats intelligents.

Autre grosse difficulté, elle peut être considérée comme un inconvénient. Cela réside dans le fait que vous pouvez pratiquement ou techniquement conclure que si vous compilez le bytecode d'un contrat qui sera exécuté sur une machine virtuelle, vous pouvez déterminer un ordre spécifique des opérations. Lorsqu'elles sont effectuées ensemble, ces opérations chargeront considérablement la machine virtuelle et la ralentiront de manière disproportionnée par rapport aux frais payés pour effectuer ces opérations.

Dans le passé, il y a déjà eu une période dans le développement d'Ethereum, où de nombreux gars qui comprenaient en détail le fonctionnement d'une machine virtuelle ont découvert de telles vulnérabilités. En fait, les transactions payaient des frais très minimes, mais ralentissaient pratiquement l'ensemble du réseau. Ces problèmes sont très difficiles à résoudre, car il faut, d'une part, les déterminer, d'autre part, ajuster le prix de réalisation de ces opérations et, troisièmement, réaliser un hard fork, ce qui implique de mettre à jour tous les nœuds du réseau vers une nouvelle version. du logiciel, puis activation simultanée de ces modifications.

Quant à Ethereum, de nombreuses recherches ont été menées, de nombreuses expériences pratiques ont été acquises : à la fois positives et négatives, mais il reste néanmoins des difficultés et des vulnérabilités qui doivent encore être traitées d'une manière ou d'une autre.

Ainsi, la partie thématique de l’article est terminée, passons aux questions qui se posent assez souvent.

LES QUESTIONS LES PLUS FRÉQUENTES

— Si toutes les parties à un contrat intelligent existant souhaitent modifier les termes, peuvent-elles annuler ce contrat intelligent à l'aide de multisig, puis créer un nouveau contrat intelligent avec des conditions d'exécution mises à jour ?

La réponse ici sera double. Pourquoi? Car d'une part, un contrat intelligent est défini une seule fois et n'implique plus aucun changement, et d'autre part, il peut avoir une logique pré-écrite qui prévoit une modification totale ou partielle de certaines conditions. Autrement dit, si vous souhaitez modifier quelque chose dans votre contrat intelligent, vous devez alors prescrire les conditions dans lesquelles vous pouvez mettre à jour ces conditions. En conséquence, ce n'est que de manière aussi prudente que le renouvellement du contrat peut être organisé. Mais ici aussi, vous pouvez rencontrer des problèmes : commettez une erreur et obtenez une vulnérabilité correspondante. Par conséquent, ces éléments doivent être très détaillés et soigneusement conçus et testés.

— Que se passe-t-il si le médiateur conclut un accord avec l'une des parties participantes : séquestre ou contrat intelligent ? Un médiateur est-il obligatoire dans un contrat intelligent ?

Un médiateur n’est pas requis dans un contrat intelligent. Cela n’existe peut-être pas. Si, en cas de séquestre, le médiateur conclut une conspiration avec l'une des parties, alors oui, ce stratagème perd alors fortement toute sa valeur. Par conséquent, les médiateurs sont sélectionnés de manière à ce que toutes les parties impliquées dans ce processus leur fassent confiance en même temps. Par conséquent, vous ne transférerez tout simplement pas de pièces vers une adresse multisignature avec un médiateur en qui vous n'avez pas confiance.

— Est-il possible, avec une seule transaction Ethereum, de transférer de nombreux jetons différents de votre adresse vers différentes adresses cibles, par exemple les adresses d'échange où ces jetons sont échangés ?

C’est une bonne question et elle concerne le modèle de transaction Ethereum et en quoi il diffère du modèle Bitcoin. Et la différence est radicale. Si, dans le modèle de transaction Ethereum, vous transférez simplement des pièces, elles ne sont alors transférées que d'une adresse à une autre, aucun changement, juste le montant spécifique que vous avez spécifié. En d’autres termes, il ne s’agit pas d’un modèle de produits non dépensés (UTXO), mais d’un modèle de comptes et de soldes correspondants. Il est théoriquement possible d'envoyer plusieurs jetons différents en une seule transaction à la fois si vous rédigez un contrat intelligent astucieux, mais vous devrez toujours effectuer de nombreuses transactions, créer un contrat, puis y transférer des jetons et des pièces, puis appeler la méthode appropriée. . Cela demande des efforts et du temps, donc dans la pratique, cela ne fonctionne pas comme ça et tous les paiements sur Ethereum sont effectués dans des transactions distinctes.

— L'un des mythes concernant la plateforme Ethereum est qu'il est impossible de décrire les conditions qui dépendront des données d'une ressource Internet externe, alors que faire ?

La solution est que le contrat intelligent lui-même peut fournir un ou plusieurs oracles dits de confiance, qui collectent des données sur l'état des choses dans le monde extérieur et les transmettent aux contrats intelligents via des méthodes spéciales. Le contrat lui-même considère comme vraies les données qu'il a reçues de parties de confiance. Pour une plus grande fiabilité, choisissez simplement un grand groupe d'oracles et minimisez le risque de leur collusion. Le contrat lui-même ne peut pas prendre en compte les données des oracles qui contredisent la majorité.

L'une des conférences du cours en ligne sur Blockchain est consacrée à ce sujet - "Introduction aux contrats intelligents ».

Source: habr.com

Ajouter un commentaire