Introduction aux contrats intelligents

Dans cet article, nous examinerons ce que sont les contrats intelligents, ce qu'ils sont, nous familiariserons avec les différentes plateformes de contrats intelligents, leurs fonctionnalités, et discuterons également de leur fonctionnement et des avantages qu'ils peuvent offrir. Ce matériel sera très utile pour les lecteurs qui ne connaissent pas 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, regardons un exemple de la différence entre un contrat ordinaire, qui est établi sur papier, et un contrat intelligent, qui est présenté sous forme numérique.

image

Comment cela fonctionnait-il avant les contrats intelligents? Imaginez un groupe de personnes qui souhaite établir des règles et conditions pour la distribution des valeurs, ainsi qu'un certain mécanisme pour garantir la mise en œuvre de cette distribution selon les règles et conditions données. Puis ils se sont réunis, ont fait un papier sur lequel ils ont noté leurs données d'identification, les conditions, les valeurs concernées, fixé la date et signé. Ce contrat a également été certifié par une partie de confiance, comme un notaire. De plus, ces personnes ont divergé dans différentes directions 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, et il a été assuré sur papier qu'elles devraient faire quelque chose de 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 présenter au tribunal et rechercher la conformité entre le contrat et les actions réelles. Très souvent, il est difficile d'obtenir une exécution équitable de ce contrat, ce qui entraîne des conséquences désagréables.

Que 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é définies et que la transaction ou la demande correspondante a été signée, après avoir accepté cette demande ou cette transaction, il n'est plus possible de modifier les conditions ou d'affecter leur mise en œuvre.

Il existe un validateur ou l'ensemble du réseau, ainsi qu'une base de données qui stocke tous les contrats intelligents entrés 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 pour l'exécution d'un contrat intelligent. De plus, il doit tenir compte de la valeur même, dont la distribution est décrite dans le contrat. Si cela s'applique à certaines devises numériques, cette base de données doit en tenir compte.

En d'autres termes, les validateurs de contrats intelligents doivent avoir accès à toutes les données avec lesquelles le contrat intelligent fonctionne. Par exemple, une base de données doit être utilisée pour enregistrer simultanément les devises 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, le début d'un certain temps ou le fait d'une certaine transaction, mais pas plus.

Définition de contrat intelligent


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

Les contrats intelligents impliquent une certaine automatisation de la distribution de la valeur, qui peut ne dépendre que des conditions prédéfinies. Dans sa forme la plus simple, il ressemble à un contrat avec des conditions strictement spécifiées, qui est signé par certaines parties.

Les contrats intelligents sont conçus pour minimiser la confiance des tiers. Parfois, le centre de décision, dont tout dépend, est complètement exclu. De plus, il est plus facile de réaliser un audit pour de tels contrats. C'est une conséquence de certaines caractéristiques de conception d'un tel système, mais le plus souvent, nous entendons 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îneront 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 d'entiercement


Regardons un exemple très simple. Il vous aidera à vous rapprocher de la compréhension des fonctionnalités des contrats intelligents et à mieux naviguer dans quels cas ils doivent être utilisés.

image

Il peut également être mis en œuvre à l'aide de Bitcoin, bien qu'il soit encore difficile d'appeler Bitcoin une plate-forme à part entière pour les contrats intelligents. Donc, nous avons un acheteur et il y a une boutique en ligne. L'acheteur souhaite acheter un moniteur dans ce magasin. Dans le cas le plus simple, l'acheteur prépare et envoie le paiement, et la boutique en ligne l'accepte, confirme, puis envoie la marchandise. Cependant, dans cette situation, il faut une grande confiance - l'acheteur doit faire confiance à la boutique en ligne pour le coût total du moniteur. Étant donné que la boutique en ligne peut avoir une mauvaise réputation aux yeux de l'acheteur, il y a un risque que, pour une raison quelconque, après avoir accepté le paiement, la boutique refuse de réparer et n'envoie pas les marchandises à l'acheteur. Par conséquent, l'acheteur pose une question (respectivement, et la boutique en ligne pose cette question) sur 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, vous pouvez offrir à l'acheteur et au vendeur la possibilité de choisir un médiateur indépendamment. Il y a beaucoup de gens qui traitent des questions litigieuses. Et nos participants peuvent choisir parmi la liste générale des médiateurs à qui on fera confiance en même temps. Ensemble, ils créent une adresse multisignature 2 sur 3, où il y a trois clés et deux signatures sont nécessaires pour deux clés afin de dépenser des pièces de cette adresse. Une clé appartiendra à l'acheteur, la seconde à la boutique en ligne et la troisième au médiateur. Et l'acheteur enverra le montant nécessaire pour payer le moniteur à une telle adresse multisignature. Désormais, lorsque le vendeur constate que l'argent est bloqué pendant un certain temps sur l'adresse multisignature, qui dépend de lui, il peut envoyer le moniteur en toute sécurité par mail.

De plus, l'acheteur reçoit le colis, inspecte les marchandises et prend une décision concernant 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 des pièces de l'adresse multisignature au vendeur, ou peut être insatisfait de quelque chose. Dans le second cas, il contacte le médiateur pour composer une transaction alternative, qui distribuera ces pièces différemment.

Supposons que le moniteur soit arrivé un peu rayé et qu'il n'y avait pas de câble pour se connecter à un ordinateur dans le kit, bien qu'il ait été écrit sur le site Web de la boutique en ligne que le câble devrait être inclus dans le kit. Ensuite, l'acheteur recueille 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 chèque par la poste, prend une photo des rayures sur le moniteur et montre que le sceau a été brisé et que le câble a été retiré. La boutique en ligne, à son tour, recueille ses preuves et les transmet au médiateur.

Le médiateur souhaite satisfaire à la fois l'indignation de l'acheteur et les intérêts de la boutique en ligne (on comprendra pourquoi). Il invente une telle transaction dans laquelle des pièces avec des adresses multisignatures seront dépensées dans une certaine proportion entre l'acheteur, la boutique en ligne et le choix, car il prend une part pour lui-même en récompense de son travail. Supposons que 90% du montant total reviennent au vendeur, 5% au médiateur et 5% d'indemnisation à l'acheteur. Le médiateur signe cette transaction avec sa clé, mais elle ne peut pas encore être appliquée, car cela nécessite deux signatures, mais une seule. 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, la transaction sera en outre signée et distribuée au réseau. Pour sa validation, il suffit qu'un des participants à la transaction soit d'accord avec l'option médiateur.

Dans ce cas, il est important de choisir initialement 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 une telle option pour la distribution de pièces qui satisfera au moins un participant, alors, après accord mutuel, 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 compilée avec un autre choix, qui, peut-être, sera plus compétent en la matière et offrira une meilleure option.

Exemple de dortoir et de réfrigérateur


Regardons un exemple plus complexe qui montre plus explicitement les capacités d'un contrat intelligent.

image

Disons qu'il y a trois gars qui se sont récemment installés dans un dortoir. Les trois sont intéressés à acheter un réfrigérateur dans leur chambre, qu'ils partageront. L'un d'eux s'est porté volontaire pour collecter le montant nécessaire pour acheter un réfrigérateur et négocier avec le vendeur. Cependant, ils se sont rencontrés relativement récemment et il n'y a pas assez de confiance entre eux. De toute évidence, deux d'entre eux sont à risque, donnant de l'argent à un tiers. En outre, ils doivent parvenir à un accord sur le choix du vendeur.

Ils peuvent utiliser le service d'entiercement, c'est-à-dire choisir un médiateur qui surveillera l'exécution de la transaction et réglera les problèmes litigieux le cas échéant. Après avoir accepté, ils établissent un contrat intelligent et y prescrivent certaines conditions.

La première condition est qu'avant un certain temps, par exemple, dans la semaine, trois paiements provenant de certaines adresses pour un certain montant doivent être reçus sur le compte correspondant du contrat intelligent. Si cela ne se produit pas, le contrat intelligent prend fin et retourne les pièces à tous les participants. Si la condition est remplie, les valeurs des identifiants du vendeur et du médiateur sont définies et la condition que tous les participants approuvent le choix du vendeur et du médiateur est vérifiée. Lorsque toutes les conditions sont remplies, les fonds seront transférés aux adresses spécifiées. Une telle approche peut protéger les participants contre la fraude de n'importe quel côté et élimine généralement le besoin de faire confiance.

Nous voyons dans cet exemple le principe lui-même qu'une telle opportunité de définir pas à pas des paramètres pour chaque condition à remplir permet de créer des systèmes de toute complexité et profondeur de niveaux imbriqués. De plus, vous pouvez d'abord définir la première condition dans un contrat intelligent, et seulement après son achèvement, vous pouvez déjà définir des paramètres pour la condition suivante. En d'autres termes, formellement, la condition est prescrite et les paramètres pour celle-ci peuvent déjà être définis pendant son fonctionnement.

Classification des contrats intelligents


Pour la classification, vous pouvez spécifier différents groupes de critères. Cependant, au moment du développement technologique, quatre d'entre elles sont pertinentes.

Les contrats intelligents peuvent être distingués par un environnement d'exécution qui peut être centralisé ou décentralisé. Dans le cas de la décentralisation, nous avons beaucoup plus d'indépendance et de tolérance aux pannes lors de l'exécution de contrats intelligents.

Ils peuvent également être distingués par le processus de définition et de réalisation des conditions: ils peuvent être arbitrairement programmables, limités ou prédéfinis, c'est-à-dire strictement typés. Lorsque sur la plate-forme de contrat intelligent il n'y a que 4 contrats intelligents spécifiques, les paramètres pour eux peuvent être définis arbitrairement. En conséquence, leur définition est beaucoup plus facile: nous sélectionnons un contrat dans la liste et passons les paramètres.

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

De plus, les contrats intelligents varient en termes de confidentialité. Ils peuvent être soit complètement ouverts, soit partiellement, soit totalement confidentiels. Ce dernier signifie que les observateurs extérieurs ne voient pas les termes des contrats intelligents. Cependant, le sujet de la vie privée est très vaste et doit être considéré séparément de l'article actuel.

Ci-dessous, nous nous attarderons sur les trois premiers critères afin de clarifier la compréhension du sujet actuel.

Contrats intelligents d'exécution


image

Le runtime fait la distinction entre les plateformes de contrat intelligent centralisées et décentralisées. Dans le cas des contrats numériques centralisés, un service est utilisé, où il n'y a qu'un seul valideur et il peut y avoir un service de sauvegarde et de récupération, qui est également géré de manière centralisée. Il existe une base de données qui stocke toutes les informations nécessaires pour fixer les termes du contrat intelligent et la répartition de la valeur qui est prise en compte dans cette même base de données du service. Un tel service centralisé a un client qui fixe des conditions à certaines demandes et utilise de tels contrats. Du fait que la plateforme est centralisée, les mécanismes d'authentification peuvent être moins fiables que dans les crypto-monnaies.

À titre d'exemple, vous pouvez prendre des fournisseurs de téléphonie mobile (différents opérateurs de téléphonie mobile). Supposons qu'un certain opérateur assure le suivi du trafic sur ses serveurs de manière centralisée, qui peut être transmis dans différents formats, par exemple: sous la forme d'appels vocaux, de SMS, de trafic Internet mobile et selon diverses normes, et assure également le suivi des fonds sur le solde des utilisateurs. En conséquence, un fournisseur de services mobiles peut établir des contrats pour la comptabilité des services fournis et leur paiement à différentes conditions. Dans ce cas, des conditions telles que «envoyer un SMS avec tel ou tel code à tel ou tel numéro et vous obtiendrez telle ou telle conditions de répartition du trafic» sont facilement paramétrables.

Un autre exemple peut être cité: les banques traditionnelles avec une fonctionnalité bancaire Internet avancée et des contrats très simples tels que les 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 runtime décentralisé, nous avons alors un groupe de validateurs. Dans le cas idéal, n'importe qui peut devenir validateur. En raison du protocole de synchronisation de la base de données et de la recherche d'un consensus, nous avons une base de données commune, qui stockera désormais toutes les transactions avec des contrats strictement décrits, et non certaines demandes conditionnelles, dont les formats changent souvent, mais il n'y a pas de spécification ouverte. Ici, les transactions contiendront des instructions sur la façon d'exécuter un contrat conformément à des spécifications strictes. 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 plates-formes décentralisées sont supérieures aux plates-formes centralisées en termes d'indépendance et de tolérance aux pannes, mais leur conception et leur maintenance sont beaucoup plus compliquées.

Des contrats intelligents en route pour fixer et remplir les conditions


Nous allons maintenant analyser plus en détail comment les contrats intelligents peuvent différer dans la manière dont ils sont définis et exécutés. Ici, nous prêtons attention aux contrats intelligents, qui sont programmés arbitrairement et Turing-complete. Un contrat intelligent Turing-complete vous permet de spécifier presque n'importe quel algorithme comme condition pour remplir le contrat: des cycles de registres, une sorte de fonctions de calcul de probabilité, etc., jusqu'à vos propres algorithmes de signature électronique. Dans ce cas, nous entendons une orthographe vraiment arbitraire de la logique.

Ils distinguent également les contrats intelligents arbitraires, mais pas complets selon Turing. Il s'agit notamment de Bitcoin et Litecoin avec leur propre script. Cela signifie qu'il est possible d'utiliser uniquement certaines opérations dans un ordre arbitraire, mais il n'est plus possible d'écrire des boucles et des algorithmes personnalisés.

En outre, il existe de telles plateformes de contrats intelligents qui mettent en œuvre des contrats intelligents prédéfinis. Il s'agit notamment de Bitshares et Steemit. Bitshares a un certain nombre de contrats intelligents pour le trading, la gestion des comptes, 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 trading 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 les plates-formes Ethereum et RootStock, qui sont toujours en cours de développement. Par conséquent, nous nous attarderons plus en détail sur la plate-forme de contrat intelligent Ethereum.

Contrats intelligents par méthode d'initiation


Par la méthode d'initiation, les contrats intelligents peuvent également être divisés en au moins deux groupes: automatisé et manuel (non automatisé).Il est typique pour les automatisés qu'avec tous les paramètres connus et le début des conditions, le contrat intelligent est entièrement exécuté automatiquement, c'est-à-dire qu'il ne nécessite pas d'envoyer de transactions supplémentaires et de dépenser une commission supplémentaire pour chaque exécution ultérieure. La plateforme elle-même dispose de toutes les données afin de calculer la fin du contrat intelligent. La logique n'est pas arbitraire, mais prédéterminée, et tout cela est prévisible. Autrement dit, à l'avance, vous pouvez évaluer la complexité du contrat intelligent, utiliser une sorte de commission constante pour lui, et tous les processus pour sa mise en œuvre sont plus efficaces.

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

Comptes Ethereum


Types de comptes Ethereum


Voyons ce que peuvent être les comptes sur la plate-forme Ethereum. Il n'y a que deux types de comptes ici et il n'y a plus d'options. Le premier type est appelé le compte d'utilisateur, le second est le compte de contrat. Voyons comment ils diffèrent.

Le compte utilisateur n'est géré que par la clé privée de la signature électronique. Le propriétaire du compte génère sa paire de clés pour la signature électronique par l'algorithme ECDSA (Elliptic Curve Digital Signature Algorithm). Seules les transactions signées par cette clé peuvent changer l'état de ce compte.

Il existe une logique distincte pour le compte de contrat intelligent. Il ne peut être contrôlé qu'à l'aide d'un code de programme prédéterminé qui détermine complètement 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 fournis par les développeurs dans le code du programme, des problèmes peuvent survenir. Par exemple, un contrat intelligent peut recevoir un état spécifique dans lequel il n'accepte le lancement d'une exécution ultérieure d'aucun des utilisateurs. Dans ce cas, les pièces seront gelées, car le contrat intelligent ne permet pas de sortir de cet état.

Comment créer des comptes dans Ethereum


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

Notez que l'identifiant de compte dans Ethereum est codé en hexadécimal sans utiliser de somme de contrôle, contrairement à Bitcoin et à de nombreux autres systèmes où l'adresse est codée dans le système de numéro de base 58 avec l'ajout d'une somme de contrôle. Cela signifie que vous devez travailler avec les identifiants de compte dans Ethereum avec soin: même une seule erreur dans l'identifiant entraînera la perte de pièces.

Il y a une caractéristique importante et elle consiste dans le fait 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.

Il existe une approche complètement différente pour créer un compte de contrat intelligent. Initialement, l'un des utilisateurs écrit le code source du contrat intelligent, après quoi le code est transmis via un compilateur spécial pour la plate-forme Ethereum, recevant du code octet pour la machine virtuelle Ethereum. Le bytecode reçu est placé dans un champ de transaction spécial. Il est authentifié au nom du compte de l'initiateur. De plus, cette transaction est distribuée sur le réseau et héberge le code de 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 du contrat intelligent, etc.

Structure de transaction Ethereum


Pour plus de clarté, nous allons commencer à revoir la structure de la transaction Ethereum et l'exemple de code de contrat intelligent.

image

Une transaction Ethereum comprend plusieurs champs. Le premier de ces nonce est un certain numéro de transaction par rapport au compte lui-même, qui le distribue et en est l'auteur. Cela est nécessaire pour distinguer les doubles des transactions, c'est-à-dire pour exclure le cas où la même transaction est acceptée deux fois. Grâce à l'utilisation d'un identifiant, chaque transaction a une valeur de hachage unique.

Vient ensuite un domaine tel que le prix du gaz . Il s'agit du prix auquel la devise de base Ethereum est convertie en gaz, qui paie pour l'exécution du contrat intelligent et l'allocation de la ressource de machine virtuelle. Qu'est-ce que cela signifie?

Dans Bitcoin, les commissions sont payées directement par la devise de base - Bitcoin lui-même. Ceci est possible grâce à un mécanisme simple de calcul: nous payons strictement la quantité de données contenues dans la transaction. Dans Ethereum, la situation est plus compliquée, car il est très difficile de partir de la quantité de données de transaction. Ici, la transaction peut toujours 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 sur le 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 de la transaction dans Ethereum: le bytecode qu'il contient pour l'exécution dans la machine virtuelle sera exécuté jusqu'à ce qu'il se termine avec un certain résultat (succès-échec) ou jusqu'à ce qu'un certain nombre de pièces soit alloué payer une commission. C'est pour éviter la situation où en cas d'erreur toutes les pièces ont été dépensées en commission sur le compte de l'expéditeur (par exemple, un cycle éternel a été lancé dans la machine virtuelle), le champ suivant existe - démarrer le gaz (il est souvent appelé limite de gaz) - il définit Le montant maximum de pièces que l'expéditeur est prêt à dépenser pour une transaction spécifique.

Le champ suivant est appelé adresse de destination. Cela comprend 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 il suit le champ de valeur , où le montant des pièces qui sont envoyées à l'adresse de destination est entré.

Vient ensuite un champ intéressant appelé données , qui s'adapte à toute la structure. Ce n'est pas un champ séparé, mais toute la structure dans laquelle le code de la machine virtuelle est défini. Vous pouvez mettre des données arbitraires ici - il existe des règles distinctes pour cela.

Et le dernier champ est appelé signature. Il contient à 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 pour cette transaction, c'est-à-dire identifier de manière unique le compte de l'expéditeur dans le système lui-même. Par la structure de la transaction, nous avons découvert l'essentiel.

Exemple de code de contrat intelligent pour la solidité


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 est un code source simplifié qui peut contenir des pièces d'utilisateur et les retourner sur demande.

Il existe donc un contrat intelligent bancaire qui remplit les fonctions suivantes: il accumule des pièces sur son solde, c'est-à-dire qu'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 se souvient des utilisateurs et de la répartition des pièces entre eux; Il 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 de code source. Il y a des champs constants dans ce contrat. L'un d'eux, avec le type d'adresse, est appelé propriétaire. Ici, le contrat se souvient de l'adresse de l'utilisateur qui a créé ce contrat intelligent. De plus, il existe une structure dynamique qui préserve la correspondance entre les adresses des utilisateurs et les soldes.

Après cela suit la méthode de la Banque - elle s'appelle la même chose 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 publié ce contrat intelligent sur le réseau. C'est la seule chose qui se produit dans ce constructeur. Autrement dit, le msg dans ce cas correspond exactement aux données qui ont été transférées à la machine virtuelle avec la transaction contenant tout le 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 permet à une transaction de transférer un certain nombre de pièces sur un compte de contrat. Dans ce cas, le contrat intelligent, recevant ces pièces, les laisse sur son bilan, mais écrit à la structure des soldes qui était exactement l'expéditeur de ces pièces afin de savoir à qui elles appartiennent.

La méthode suivante est appelée retirer et elle prend un paramètre - la quantité de pièces que quelqu'un veut retirer de cette banque. Voici une vérification pour voir s'il y a suffisamment de pièces sur le solde de l'utilisateur qui appelle cette méthode pour les envoyer. S'il y en a assez, le contrat intelligent lui-même retourne cette quantité 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 obtenir cet équilibre 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 rien les variables de sa classe et en fait ce n'est qu'une méthode de lecture. Une transaction distincte n'est pas créée pour appeler cette méthode, aucune commission n'est payée 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 d'un contrat intelligent. Et ici, un contrôle supplémentaire est écrit si l'appelant de cette méthode est le propriétaire de ce contrat. Si tel est le cas, le contrat s'autodétruit et la fonction de destruction accepte 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 iront automatiquement à l'adresse du titulaire du contrat.

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


Voyons 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.

image

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

De plus, nous avons un module pour stocker les données de la chaîne de blocs, traiter, sélectionner une branche prioritaire, compléter des blocs, découpler des blocs, vérifier ces blocs, etc.

Le troisième module est appelé EVM (Ethereum virtual machine) - c'est la machine virtuelle qui accepte le code d'octet de la transaction Ethereum. Ce module prend l'état actuel d'un compte spécifique et modifie son état en fonction du bytecode reçu. La version de la machine virtuelle sur chacun des nœuds du réseau doit être la même. Les calculs sur chacun des nœuds Ethereum sont exactement les mêmes, mais ils se produisent dans un ordre asynchrone: quelqu'un vérifie et accepte cette transaction plus tôt, c'est-à-dire exécute tout le code qu'il contient, et quelqu'un plus tard. En conséquence, lors de la création d'une transaction, elle est distribuée sur le réseau, les nœuds l'acceptent et, au moment de la vérification, tout comme Bitcoin Script est exécuté dans Bitcoin, le code d'octet 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 pour un compte spécifique a été généré et enregistré jusqu'à ce qu'il soit clair si cette transaction est appliquée ou non. Si la transaction est appliquée, cet état est considéré non seulement comme terminé, mais déjà pertinent. Il existe une base de données qui stocke le statut de chaque compte pour chaque hôte. Étant donné que tous les calculs se déroulent de la même manière et que l'état de la blockchain est le même, la base de données contenant l'état de tous les comptes sera également la même pour chaque nœud.

Mythes et limites des contrats intelligents


En ce qui concerne les restrictions qui existent pour les plateformes de contrat intelligent de type Ethereum, les éléments suivants peuvent être cités:

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

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

En outre, la machine virtuelle peut lire les données de la base de données de la chaîne de blocs afin d'utiliser ces données comme déclencheur pour exécuter l'une ou l'autre logique des contrats intelligents. Une machine virtuelle peut créer et envoyer des transactions, elle peut créer de nouveaux contrats et méthodes d'appel d'autres contrats intelligents qui sont déjà publiés sur le réseau: existent, disponibles, etc.

Le mythe le plus courant est que les contrats intelligents Ethereum peuvent utiliser les informations de toutes les ressources Internet dans leurs propres conditions. La vérité est que la machine virtuelle ne peut pas envoyer une demande de réseau à une ressource d'informations externe sur Internet, c'est-à-dire qu'il est impossible d'écrire un contrat intelligent qui répartira la valeur entre les utilisateurs en fonction de la météo dans la rue, ou qui a gagné dans 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 sont tout simplement pas dans la base de données de la plate-forme elle-même. Autrement dit, il n'y a rien sur la blockchain à ce sujet. S'il n'y apparaît pas, la machine virtuelle ne peut pas utiliser ces données comme déclencheurs.

Inconvénients d'Ethereum


Énumérons les principaux. Le premier inconvénient est qu'il y a quelques difficultés à concevoir, développer et tester des contrats intelligents dans Ethereum (Ethereum utilise le langage Solidity pour écrire des contrats intelligents). En effet, la pratique montre qu'un très grand pourcentage de toutes les erreurs appartient 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 se produisent très souvent des erreurs qui conduisent au vol de fonds, à leur gel, à la destruction des contrats intelligents de manière inattendue, etc. De nombreux cas de ce type sont déjà connus.

Le deuxième inconvénient est que la machine virtuelle elle-même n'est pas parfaite, car elle est également écrite par des personnes. Il peut exécuter des commandes arbitraires et c'est une 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. C'est 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. Il consiste en ce qu'il est possible de manière pratique ou technique de conclure que si vous compilez le code octet du contrat qui sera exécuté sur la machine virtuelle, vous pouvez déterminer un ordre de fonctionnement spécifique. Lorsqu'elles sont exécutées ensemble, ces opérations chargeront très lourdement la machine virtuelle et la ralentiront de manière disproportionnée par rapport à la commission qui a été payée pour ces opérations.

Dans le passé, il y avait déjà une telle période de développement Ethereum, lorsque de nombreux gars qui ont compris en détail le fonctionnement de la machine virtuelle ont trouvé de telles vulnérabilités. En fait, les transactions ont payé une très petite commission, mais ont pratiquement ralenti l'ensemble du réseau. Ces problèmes sont très difficiles à résoudre, car vous devez les déterminer, deuxièmement, ajuster le prix pour effectuer ces opérations et, troisièmement, effectuer un hard fork, ce qui signifie mettre à jour tous les nœuds du réseau vers une nouvelle version du logiciel, puis activation simultanée de ces modifications.

Quant à Ethereum, beaucoup de recherches ont été menées, beaucoup d'expérience pratique a été acquise: à la fois positive et négative, mais néanmoins, il reste des difficultés et des vulnérabilités qui doivent encore être combattues d'une manière ou d'une autre.

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

Foire aux questions


- Si toutes les parties au contrat intelligent actuel souhaitent modifier les conditions, peuvent-elles annuler ce contrat intelligent à l'aide de la multi-signature, puis créer un nouveau contrat intelligent avec des conditions mises à jour pour sa mise en œuvre?

Ici, la réponse sera double. Pourquoi? Parce que, d'une part, un contrat intelligent est défini une fois et n'implique aucune modification, et d'autre part, il peut avoir une logique prédéfinie qui prévoit une modification complète ou partielle dans 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 cette manière prudente que le renouvellement du contrat peut être organisé. Mais ici aussi, vous pouvez rencontrer des problèmes: faites une sorte d'erreur et obtenez la vulnérabilité correspondante. Par conséquent, ces choses doivent être très détaillées et soigneusement conçues et testées.

- Et si le médiateur conclut un complot avec l'une des parties impliquées: séquestre ou contrat intelligent? Un médiateur est-il requis dans un contrat intelligent?

Un médiateur n'est pas requis dans un contrat intelligent. Ce n'est peut-être pas le cas. Si, en cas d'entiercement, le médiateur conclut un complot avec l'une des parties, alors oui, ce stratagème perd alors brutalement toute sa valeur. Par conséquent, les médiateurs sont choisis de manière à ce qu'ils bénéficient en même temps de la confiance de toutes les parties impliquées dans ce processus. En conséquence, vous ne transférez simplement pas de pièces à une adresse multisignature avec le médiateur en qui vous n'avez pas confiance.

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

C'est une bonne question et elle concerne le modèle de transaction Ethereum et ses différences avec le modèle Bitcoin. Et la différence est dramatique. Si dans le modèle de transaction Ethereum vous transférez simplement des pièces, elles ne sont transférées que d'une adresse à une autre, sans 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 sorties non dépensées (UTXO), mais d'un modèle de comptes et de soldes correspondants. Il est théoriquement possible d'envoyer plusieurs jetons différents à la fois avec une transaction, si vous écrivez un contrat intelligent délicat, mais vous devez toujours faire beaucoup de transactions, créer un contrat, puis y transférer des jetons et des pièces, puis appeler la méthode appropriée. Cela nécessite respectivement des efforts et du temps, dans la pratique, cela ne fonctionne pas ainsi et tous les paiements dans Ethereum sont effectués dans des transactions distinctes.

- L'un des mythes concernant la plate-forme Ethereum est qu'il est impossible de décrire des conditions qui dépendront des données d'une ressource Internet externe, alors quoi?

La solution est que le contrat intelligent lui-même peut inclure un ou plusieurs soi-disant oracles de confiance qui collectent des données sur l'état des choses dans le monde extérieur et les transfèrent vers des contrats intelligents par des méthodes spéciales. Le contrat lui-même considère que les données qu'il a reçues de parties de confiance sont vraies. Pour une plus grande fiabilité, ils sélectionnent simplement un grand groupe d'oracles et minimisent le risque de collusion. Le contrat lui-même peut ne pas prendre en compte les données d'oracles qui contredisent la majorité.

Ce sujet est abordé dans l'une des conférences du cours en ligne Blockchain - « Introduction to Smart Contracts ».

Source: https://habr.com/ru/post/fr413231/


All Articles