Contrats et adresses multisig dans Bitcoin et Ethereum


Les contrats multisig dans les réseaux décentralisés modernes sont un outil puissant qui vous permet de protéger simplement et de manière fiable les fonds dans les comptes collectifs, ainsi que d'effectuer des transactions avec plusieurs participants. Si vous êtes intéressé par la façon d'utiliser ces adresses, vous devez simplement comprendre les mécanismes de leur propriété et avoir une bonne idée de l'ordre de transaction. Travailler avec de telles adresses nécessite la participation de plusieurs comptes.


Malgré le même nom et une logique de travail similaire, les algorithmes et méthodes internes pour interagir avec des adresses protégées par multi-signature sont très différents dans Bitcoin et Ethereum. Il s'agit de ce périphérique interne qui sera abordé dans cet article.


Nous parlerons de deux réseaux: Bitcoin et Ethereum. Dans d'autres blockchains, l'accès multisig aux actifs cryptographiques peut être implémenté de manière complètement différente.


Présentation


Supposons que nous ayons pour tâche de protéger les fonds contre les accès non autorisés à l'adresse (compte, si la terminologie bancaire est plus proche de vous), où l'argent de l'organisation est stocké. L'accès à l'adresse (la possibilité de créer une transaction à partir de celle-ci vers une externe) est accessible à plusieurs personnes, par exemple, le général, le financier et le chef comptable. Pour protéger l'argent, si quelqu'un de cette trinité est obligé de signer une conclusion, il y a multisig. Dans Bitcoin et Ethereum, vous pouvez créer une adresse, dont le retrait de fonds nécessite non pas une, mais plusieurs confirmations.


Désormais, chacun des trois participants, désireux de créer une transaction de retrait, doit fournir sa signature confirmant son consentement à la transaction. Lorsque suffisamment de signatures sont collectées, les fonds sont transférés. Cette logique est appelée multisig: envoi de N de M signatures (M> N) pour confirmer l'opération.


Pour les réseaux décentralisés, multisig est un modèle natif, car toute transaction valide envoyée à une certaine adresse par conception contient une signature électronique créée par la clé secrète de l'expéditeur, de sorte que presque toutes les fonctionnalités nécessaires pour les adresses multisig sont déjà intégrées à la plupart des blockchains modernes.


La plus intéressante est l'adresse multisig simple 2/3, dont la conclusion n'est possible qu'avec l'accord de deux des trois participants. Un tel multisig est capable d'effectuer de nombreuses transactions avec trois parties de manière pratique et sûre et de résoudre les problèmes lorsque deux participants font confiance au tiers pour les juger. Presque tous les services financiers dans lesquels il existe un tiers de confiance sont mis en œuvre en utilisant multisig 2/3. Par exemple, prenez une lettre de crédit: le payeur fait l'argent et ne peut pas le prendre à moins de convaincre la banque (où les documents d'achat ne sont pas arrivés) ou le destinataire (de sa propre volonté) d'accepter cela. Le destinataire ne pourra pas non plus récupérer l'argent si le vendeur ne le restitue pas (de son plein gré) ou si la banque n'informe pas que les documents nécessaires lui sont parvenus et qu'il les a vérifiés. Dans le schéma, le service de la banque est indécemment simple: lorsqu'elle voit un accord sur l'achat d'un appartement, au lieu de porter la clé de la cellule au magasin, elle envoie simplement un approuver à une adresse multisig.


Les tâches de comptabilité et de paiement des services gravitent également vers le multisig 2/3: il oblige souvent un tiers à décider si le service a été fourni et dans quelle mesure. Multisig, où l'une des trois signatures appartient à l'organisation, qui décide finalement si le service a été fourni ou non (par exemple, au tribunal), signifie que le tribunal, ayant décidé en faveur de l'une des parties, signe simplement sa décision et envoie la transaction, débloquant automatiquement les fonds pour le côté gagnant. Pour les services B2C tels que Uber ou AirBnB, le multisig, bien qu'implicitement, est le schéma de travail principal: lorsque le service est fourni, c'est la signature de la demande par le service qui initie l'envoi de fonds du client au chauffeur ou au propriétaire de l'appartement.


En général, un multisig commodément mis en œuvre - comme un fusil d'assaut Kalachnikov: bon marché et gai, peut être utilisé à la maison et pour des frais de millions de dollars. Et dans la blockchain, tout cela est «sans inscription et SMS» (du point de vue de la sécurité, c'est d'ailleurs une thèse assez sérieuse, si vous y réfléchissez).


Nous considérerons deux blockchains - Bitcoin et Ethereum. Je dois dire que le périphérique multisig interne en eux est assez différent, tout fonctionne différemment. Mais n'allons pas de l'avant.


Bitcoin multisig


Le Bitcoin n'est en fait pas aussi simple qu'il peut sembler à beaucoup. Sa conception vous permet de mettre en œuvre des schémas légers et en même temps très sûrs pour accéder aux fonds. Eh bien, j'ajoute que, uniquement à mon avis personnel, les structures et les algorithmes de Bitcoin sont bien pensés, optimaux et tout simplement magnifiques. La traduction standard de X bitcoins d'adresse en adresse n'est que le type de transaction par défaut, la pointe de l'iceberg des capacités potentielles de Bitcoin. La transaction par défaut pour traduire BTC du point de vue du code est le multisig 1/1 le plus simple: pour utiliser X bitcoins de l'adresse a1, vous devez attacher une signature électronique à la transaction en utilisant la clé secrète qui appartient à l'adresse a1. Examinons la structure d'une transaction Bitcoin et approfondissons un peu son fonctionnement.


image


Il y a une exigence dans Bitcoin: tous les BTC stockés à une certaine adresse sont toujours dépensés dans leur ensemble. Autrement dit, après avoir confirmé son droit de posséder une adresse, la transaction dépense la totalité du solde, la répartissant sur plusieurs sorties. Dans la vraie vie, laisser la différence entre les entrées et les sorties au mineur en tant que commission, mais pour cet article, cela n'est pas significatif.


Imaginez la situation. Vasya a reçu 50 BTC. Vasya veut envoyer Peta 0.5 BTC. Pour ce faire, il doit dépenser les 50 BTC. Pour obtenir un changement, Vasya prend une entrée (50 BTC) et crée deux sorties:


  • 0,5 BTC à l'adresse de Petit;
  • 49,5 BTC à l'une de vos propres adresses.

Quand ils disent "Vasya signe la transaction" - ce n'est pas tout à fait exact pour Bitcoin. Vasya signe toutes les entrées de la transaction, et chaque entrée est une adresse bitcoin distincte, et chacune d'elles a besoin d'une clé secrète correspondante. Supposons que Vasya ait trois adresses auxquelles trois de ses amis ont envoyé 0,1 BTC chacun. Pour dépenser 0,25 BTC, Vasya devra signer trois entrées (chacune de 0,1) et former deux sorties (0,25 à l'adresse du destinataire et 0,05 à lui-même en tant que changement). Un tel schéma permet, en particulier, de ne jamais utiliser la même adresse deux fois et de renvoyer à chaque fois la modification à une nouvelle. Certains portefeuilles, comme Electrum, permettent au propriétaire de choisir la stratégie de réutilisation des adresses, plus privées (à chaque nouvelle adresse) ou plus simples, mais avec des adresses permanentes (ce schéma est plus pratique si vous avez recours à des transactions régulières complexes). Je vous rappelle que la différence entre la somme des entrées et des sorties est à la fois une commission pour le mineur: simple et fiable.


Maintenant, au lieu de "Vasya signe la transaction", je dis: "Vasya signe l'entrée." Mais j'ai délibérément manqué quelques points de plus, afin de ne pas compliquer le schéma global. Le fait est que les adresses en Bitcoin ne sont pas une clé publique dans sa forme la plus pure, mais son hachage (deux fois un hachage avec plusieurs octets de service et version, détails dans l' article Bitcoinwiki), c'est-à-dire que dans une transaction normale, l'expéditeur ne connaît même pas la clé publique du destinataire. Par conséquent, Vasya, en signant l'entrée, en plus de la signature elle-même, présente Bitcoin Script avec sa propre clé publique, la révélant ainsi. Naturellement, en connaissant la clé publique, vous pouvez facilement générer une adresse Bitcoin.


En plus de signer des entrées, Vasya définit également une condition pour chaque sortie, comment dépenser BTC à partir de cette sortie particulière. Mais les «exigences» lui ont été fournies par celui qui recevra les bitcoins: c'est son souci de savoir comment il va dépenser son BTC. C'est un point extrêmement important. L'adresse Bitcoin contient un hachage du code qui décidera d'autoriser ou non le BTC à partir de cette adresse.


Si vous recherchez toujours des analogies, Vasya pour chaque sortie (qu'il a reçue par ceux qui reçoivent le BTC) joindra des données qui répondent à la question "Quel code et sur quelles données doit retourner vrai pour que le signataire soit considéré comme le propriétaire de cette sortie?" . Voici une autre analogie pour les pythonistes: vous pouvez imaginer que chaque sortie contient une fonction lambda, qui, exécutée par Petya, qui lui a fourni des arguments, retournera vrai ou faux. Si true est retourné, alors Petya peut utiliser la sortie comme entrée pour les transactions suivantes. Dans la version par défaut, le programme peut prendre deux arguments fournis par Petya - la signature de sortie et la clé publique de Petin - et vérifier la signature. Si true est retourné, alors Petya a le droit de produire et peut le dépenser; par conséquent, la transaction est valide. Il n'est pas nécessaire de plonger plus profondément dans le cadre de cet article dans Script, mais c'est extrêmement souhaitable. Soit dit en passant, racheter le script - c'est le contrat très intelligent, c'est-à-dire une règle formelle par laquelle le droit de BTC passe d'une adresse à une autre. Les clients du réseau, lors de la transaction, exécutent chaque script dans chaque transaction, vérifiant sa validité. Si valide - gaspillage valide et indéniable de bitcoins à partir d'une adresse spécifique.


Voici le premier excellent article sur ce sujet, je recommande fortement de le lire, tout le mécanisme brut avec des exemples en python est parfaitement peint: Bitcoins à la dure: Utilisation du protocole Bitcoin brut . Et voici un autre: Bitcoin en bref - Transaction .


Revenons à multisig 2/3, notant que la transaction habituelle avec le transfert de bitcoins peut également être considérée comme multisig 1/1. Supposons que Petya veuille que Vasya lui transfère simplement BTC. Petya donne à Vasya l'adresse à laquelle le hachage du script par défaut est cousu, et Bitcoins peut récupérer les bitcoins de cette adresse en fournissant un code de vérification de signature standard et la signature elle-même. Ces adresses "traditionnelles" en Bitcoin commencent par le chiffre 1 (unité). Les adresses dans lesquelles le code "non conventionnel" est cousu (vérification du script multisig) sont appelées pay-to-script et commencent par 3 (triplets).


Bitcoin nous permet de créer une adresse dans laquelle le hachage de NOTRE PROPRE script de rachat sera cousu. Après tout, c'est notre problème, car nous dépenserons alors notre BTC, et non celui de l'envoi. Peu importe qui transfère les bitcoins à une adresse, mais il est important que lorsque nous voulons les dépenser, nous devrons fournir un code correspondant à l'adresse. Autrement dit, en me demandant de transférer BTC vers une adresse de paiement au script, je m'engage à fournir le script lui-même plus tard, dans une transaction qui utilise cette entrée.


Selon la documentation, pour le code multisig de ce type est utilisé:


----------------------------------------------------------- Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Signature script: <sig> [sig] [sig...] <redeemScript> ----------------------------------------------------------- 

( Suite de l'article sur le script et le multisig )


Nous avons besoin d'un script pour que toutes les signatures nécessaires soient immédiatement présentées dans la transaction de dépenses. Si, par exemple, notre multisig 2/3 contient les adresses de trois participants (PDG, chef comptable et administrateur système) et que les clés secrètes pour les signatures sont sur leurs ordinateurs séparément, alors pour former une transaction de dépenses, l'administrateur système devra:


  • générer une transaction de dépenses;
  • créez votre propre signature;
  • transférer le contenu de la transaction au deuxième signataire (par exemple, aller au service comptable ou au général avec une clé USB);
  • demander au deuxième signataire d'ajouter une signature à la transaction;
  • envoyer une transaction au réseau avec deux des trois signatures.

Ce n'est pas un moyen très simple, mais cela vous permet d'utiliser comme l'un des signataires un ordinateur complètement déconnecté du réseau et il n'est pas garanti de fusionner la clé secrète. Dans ce cas, le retrait des fonds est complètement «manuel», ce qui est assez bon pour les gros montants. Amis du 21e siècle, il est désormais de bon ton de mettre un ordinateur portable zéro dans un coffre-fort sans connexion réseau et avec le seul logiciel installé - un portefeuille Bitcoin.


Ethereum multisig


L'implémentation de multisig dans Ethereum est très différente de celle de Bitcoin en raison de la conception différente des algorithmes de réseau client internes, mais il existe des parallèles. Dans Ethereum, une transaction spéciale de type "create_contract" crée une adresse sur le réseau à laquelle le code d'un contrat particulier est lié. Cette adresse a également un équilibre éther. Si vous envoyez de l'éther là-bas, l'adresse "prendra l'équilibre". Et vice versa, si vous envoyez de l'éther à partir de l'adresse, il sera "retiré du bilan".


Je jette immédiatement quelques analogies assez précises pour comprendre une cuisine très simple et logique. Si nous oublions le consensus et la façon dont les nœuds mettent à jour la chaîne de blocs et considérons la chaîne de blocs comme un stockage abstrait, le placement du contrat peut être comparé, par exemple, à l'instanciation d'un objet, c'est-à-dire transformer la classe en un véritable objet en RAM. Dans une analogie, la mémoire est une chaîne de blocs et le code de classe est un code de contrat. Après instanciation, l'objet (contrat) reçoit sa propre adresse dans la «mémoire», et le réseau en connaît l'interface, présentée sous la forme décrite dans la classe des méthodes.


Les transactions arrivant à l'adresse dans un tel schéma sont des méthodes d'écriture, elles modifient l'état interne de l'objet du contrat. Tout client du réseau exécute des lecteurs de méthodes qui lisent simplement les données de l'état du contrat, car il est sûr que sa copie de l'objet est correcte et confirmée par le consensus des producteurs de blocs. Il est également très important de comprendre que le code de contrat est exécuté lorsque le mineur «applique» la transaction reçue au contrat existant, et dans notre version, il appelle simplement l'une des méthodes du contrat avec des arguments intégrés dans la transaction.


Eh bien, puisque le contrat a un état interne (champs d'objet dans notre analogie), il peut implémenter le multisig sans avoir besoin d'envoyer des signatures en une seule transaction. Nous créons un contrat, nous y codons en dur les adresses des signataires, lorsque les transactions de retrait arrivent - nous transférons le contrat séquentiellement à l'état d'attente du nombre requis de confirmations. Si nous parlons de multisig 2/3, cela pourrait ressembler à ceci:


  • l'administrateur système déploiera un contrat multisig sur le réseau et y inscrira les adresses du directeur général et chef comptable;
  • les clients heureux envoient des tonnes d'éther au contrat;
  • le comptable en chef va effectuer un gros paiement et envoie une transaction au contrat avec le désir de transférer de l'éther vers une adresse externe;
  • le contrat multisig passe à l'état "J'attends N confirmations", dans notre cas une seule suffit;
  • le PDG veut aider le comptable en chef, mais il a oublié dans quel ordinateur portable la clé secrète est nécessaire;
  • l'administrateur système envoie une transaction - confirmation du retrait des fonds du contrat;
  • le contrat, ayant accepté la transaction de l'administrateur système, comprend que les N confirmations nécessaires ont été composées, et envoie la diffusion à l'adresse commandée par le chef comptable, tout en revenant à l'état de simple réception des fonds.

Beaucoup de choses peuvent être implémentées différemment selon la mise en œuvre du contrat multisig. Cela s'applique au stockage des commandes en attente de retrait, à l'intervalle de temps d'attente du retrait, aux restrictions pratiques. Par exemple, vous pouvez autoriser le retrait de montants jusqu'à une certaine limite sans multi-signature et demander une confirmation si la limite est dépassée.


Il existe plusieurs options pour le code de contrat de portefeuille multisig; vous pouvez facilement les trouver. Le plus officiel d'entre eux est celui-ci . Il existe de nombreuses autres modifications des contrats multisig, ainsi que des contrats multisig, mais ne le savent même pas, car tout contrat avec plusieurs rôles au sens philosophique est multisig.


Conclusion


Nous avons examiné le schéma de fonctionnement de l'une des briques les plus importantes pour la construction de systèmes de contrats complexes et l'organisation de transactions multilatérales. Où est le moyen le plus simple de ressentir des adresses multisig en direct:


  • pour Bitcoin: le portefeuille Electrum a une instruction détaillée étape par étape avec des captures d'écran sur la façon de créer et de configurer une adresse multisig et comment l'utiliser. Recherchez simplement Electrum multisig;
  • pour Ethereum: il y a une section Contrats dans le portefeuille standard Ethereum, et vous pouvez facilement créer multisig. De plus, multisig sera certainement présenté sous de nombreuses formes sur des plateformes de lancement de contrats standards, par exemple, nous en avons déjà un sur notre Smartz.io .

Comme vous pouvez le voir, sur la blockchain, ces schémas sont très technologiques et simples, alors utilisez-les pour votre plaisir et protégez correctement votre crypto-richesse.

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


All Articles