Le meilleur guide étape par étape des scripts Bitcoin, partie 2

Ceci est la partie 2 de notre meilleur guide de script Bitcoin. Il est fortement recommandé de lire la partie 1 avant de poursuivre.

Le meilleur guide de script Bitcoin, partie 2

Dans la partie 1, nous avons couvert les points suivants:

  • Introduction au script Bitcoin.
  • Comment fonctionnent les transactions en Bitcoin?
  • Comment fonctionnent les scripts?
  • Le jeu du verrouillage et du déverrouillage dans les scripts.
  • Cryptographie ECDSA en script bitcoin.

REMARQUE: À partir de maintenant, nous n’utiliserons plus la commande “OP_” aussi fréquemment car il faut comprendre que “OP_” sera toujours préfixé à chaque opcode. Veuillez garder cela à l’esprit. Nous n’avons pas utilisé “OP_” pour améliorer la lisibilité. Lorsque vous exécutez le script, n’oubliez pas d’utiliser “OP_”.

Transactions multisignatures

Les transactions que nous avons vues jusqu’à présent sont toutes très simples (un à un dans sa nature). Cependant, les transactions peuvent devenir beaucoup plus compliquées et stratifiées que cela.

Tout d’abord, nous vérifierons les transactions multi-signatures. Dans une transaction multi-signature, la seule façon de déverrouiller les sorties Bitcoin est si plusieurs personnes vérifient la transaction.

Alors, où est-ce utile?

Imaginez qu’il existe une énorme entreprise multinationale. De toute évidence, ils ne laisseront pas une seule personne contrôler tous ses fonds, n’est-ce pas? Ils auront un comité de personnes qui sera en charge des fonds.

Maintenant, comment cela fonctionnera-t-il dans le contexte des transactions de script Bitcoin?

Les scripts à signatures multiples définissent une condition dans laquelle N clés publiques sont enregistrées dans le script et au moins M de celles-ci doivent fournir des signatures pour débloquer les fonds. Ceci est également connu sous le nom de schéma M-of-N, où N est le nombre total de clés et M est le plus petit nombre de signatures requises pour la validation. La transaction est également appelée multisig M-of-N.

Le format de script d’une sortie multisig ressemble à ceci:

M… N CHECKMULTISIG

Voyons comment cela fonctionne dans un exemple.

Supposons que nous envoyions de l’argent à une entreprise dirigée par 3 personnes (Alice, Bob et Charlie) et que deux de ces trois personnes doivent vérifier la transaction pour qu’elle aboutisse. Cette transaction est également appelée un multisig 2 sur 3.

À quoi ressemblera la sortie?

2 3 CHECKMULTISIG

Très bien, c’est donc la sortie. Comment l’entreprise va-t-elle débloquer la production et accéder aux fonds? Rappelez-vous qu’il s’agit d’une signification multisig 2 sur 3, 2 des 3 personnes impliquées doivent présenter leurs signatures.

Ainsi, la combinaison de signatures utilisée peut être l’une des suivantes:

Supposons que Bob et Charlie soient ceux qui vérifient la transaction. Le script de validation complet se lira alors comme ceci:

2 3 CHECKMULTISIG

SI les conditions ci-dessus sont vraies et que les signatures sont correctes, alors le transaction sera VRAI et cela passera. Cependant, si les signatures sont incorrectes, la transaction échouera.

Cependant, si vous cochez des exemples de transaction multi-sig, vous remarquerez que le format que nous avons utilisé:

2 3 CHECKMULTISIG

…est incorrect.

La raison pour laquelle il en est ainsi est qu’il y a un bogue dans l’opcode CHECKMULTISIG.

Le bogue dans l’opcode CHECKMULTISIG

Idéalement, un opcode CHECKMULTISIG devrait sortir M + N + 2 éléments de la pile. Prenons l’exemple avec lequel nous avons travaillé jusqu’à présent:

2 3 CHECKMULTISIG

Avant que CHECKMULTISIG ne soit exécuté, la pile ressemblera à ceci:

Le meilleur guide de script Bitcoin, partie 2

CHECKMULTISIG, en substance, fait apparaître tous les éléments de la pile.

Dans cet exemple M = 3 et N = 2.

Les éléments qui apparaissent CHECKMULTISIG sont: Les clés publiques 3 (M), 2 (N) signatures et deux constantes, ce qui signifie essentiellement que le nombre total d’éléments qui devraient idéalement être sortis sont (M + N + 2 =) 3 + 2 + 2 = 7 éléments.

Cependant, il y a un problème dans l’opcode CHECKMULTISIG qui le fait apparaître un élément de plus que ce qui est disponible dans la pile. Cela finit évidemment par provoquer une erreur de pile.

Afin d’éviter cette erreur, une solution de contournement est utilisée pour la contrer. Chaque fois que nous avons un script de validation combiné, nous commençons toujours par un «0». Cela signifie que le script ressemblera maintenant à:

0 2 3 CHECKMULTISIG

Par la suite, notre pile ressemble maintenant à ceci:

Le meilleur guide de script Bitcoin, partie 2

En ajoutant cet élément supplémentaire «0» au début, nous nous assurons de ne pas faire face à des erreurs.

Cela signifie également qu’au lieu d’utiliser ce script de déverrouillage:

Nous finissons par utiliser ceci:

0

Qu’est-ce que Pay-to-Script-Hash ou P2SH?

Bien que les transactions multisignatures donnent à vos transactions une grande flexibilité, elles peuvent devenir un peu compliquées. Imaginez une entreprise qui compte 5 partenaires impliqués dans l’opération. Si Alice devait envoyer des bitcoins à cette société, son script de sortie ressemblera à ceci (en supposant que 2 des 5 personnes impliquées doivent vérifier la transaction):

2 5 CHECKMULTISIG

Comme vous pouvez le voir, cela devient très encombrant et présente un ensemble d’inconvénients:

  • Tout d’abord, l’entreprise devra en fait relayer ces informations et ce script à ses clients.

  • Les clients devront ensuite utiliser un logiciel de portefeuille Bitcoin spécial avec la possibilité de créer un script de transaction personnalisé.

  • La transaction résultante serait cinq fois plus grande qu’une transaction normale et nécessiterait plus de frais.

Une solution était nécessaire pour rendre ce script bitcoin un peu moins compliqué. Il a été décidé que le script multisig complexe serait haché et que les gens incluraient le hachage au lieu du script dans le script de verrouillage.

Afin de déverrouiller et de valider la transaction, le destinataire devra présenter le script original avec les signatures. Étant donné que l’expéditeur envoie de l’argent à un hachage au lieu d’une adresse publique, ce type de transaction est appelé Pay to Public Script Hash ou P2SH.

Alors, comment P2SH a-t-il changé les transactions (pour l’exemple donné ci-dessus)?

Avant P2SH

Script de verrouillage: 2 5 CHECKMULTISIG

Script de déverrouillage:

Après P2SH

Utiliser le script: 2 5 CHECKMULTISIG

Script de verrouillage: HASH160 EQUAL

Script de déverrouillage:

Comme on peut le voir, la responsabilité de fournir les conditions de rachat d’une transaction est transférée de l’expéditeur au rédempteur qui présente le script de rachat.

Alors, à quoi ressemblerait le script de notre entreprise si P2SH n’était pas utilisé? Sans P2SH, le script bitcoin qu’ils auraient utilisé serait le suivant:

2 5 CHECKMULTISIG

Ce qui se traduirait par quelque chose comme ceci:

2 5 04C16B8698A9ABF84250A7C3EA7EEDEF9897D1C8C6ADF47F06CF73370D74DCCA01CDCA79DCC5C395D7EEC6984D83F1F50C900A24DD47F569FD4193AF5DE762C58704A2192968D8655D6A935BEAF2CA23E3FB87A3495E7AF308EDF08DAC3C1FCBFC2C75B4B0F4D0B1B70CD2423657738C0C2B1D5CE65C97D78D0E34224858008E8B49047E63248B75DB7379BE9CDA8CE5751D16485F431E46117B9D0C1837C9D5737812F393DA7D4420D7E1A9162F0279CFC10F1E8E8F3020DECDBC3C0DD389D99779650421D65CBD7149B255382ED7F78E946580657EE6FDA162A187543A9D85BAAA93A4AB3A8F044DADA618D087227440645ABE8A35DA8C5B73997AD343BE5C2AFD94A5043752580AFA1ECED3C68D446BCAB69AC0BA7DF50D56231BE0AABF1FDEEC78A6A45E394BA29A1EDF518C022DD618DA774D207D137AAB59E0B000EB7ED238F4D800 CHECKMULTISIG

Non, quelqu’un n’a pas vomi ces chiffres et ces lettres, c’est à quoi ressembleraient les 5 clés publiques combinées!

Imaginez que les clients envoient ce script Bitcoin pour envoyer leurs UTXO Bitcoin.

Maintenant, si ce même bloc hexadécimal était analysé via SHA 256 suivi de RIPEMD160, cela ressemblerait à ceci:

54c557e07dde5bb6cb791c7a540e0a4796f5e97e

Tellement plus propre et gérable, non?

La version P2SH du script de verrouillage ressemblerait maintenant à ceci:

HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e EQUAL

Pour déverrouiller, le script de déverrouillage ressemblerait maintenant à:

: <2 Clé publique 1 Clé publique 2 Clé publique 3 Clé publique 4 Clé publique 5 5 MULTISIG>

La combinaison de ces deux scripts bitcoin se déroule en deux étapes.

Tout d’abord, le script de rachat est comparé au hachage pour voir s’il correspond:

<2 Clé publique 1 Clé publique 2 Clé publique 3 Clé publique 4 Clé publique 5 5 MULTISIG> HASH160 EQUAL.

Si ce script bitcoin renvoie VRAI alors la deuxième partie du déverrouillage a lieu via ce morceau de code qui se déroule automatiquement. Celui-ci est notre déverrouillage multisig traditionnel:

 2 Clé publique 1 Clé publique 2 Clé publique 3 Clé publique 4 Clé publique 5 5 CHECKMULTISIG

Les adresses P2SH commencent toujours par 3 au lieu de 1.

3KP3okFKoGs53JqgyGB27pqaum8tCz2BvW <- Une adresse P2sh.

Qu’est-ce que le contrôle de flux?

L’un des aspects les plus intéressants de la programmation est le contrôle de flux. En utilisant certaines conditions, on peut détecter quelles commandes sont exécutées et quand. Quiconque a une base de programmation connaît le concept de programmation IF-ELSE.

Il s’agit de la forme la plus simple et la plus élémentaire de contrôle de flux.

Dans le script bitcoin, les éléments suivants sont utilisés pour le contrôle d’état:

  • SI
  • ELSEIF
  • FIN SI
  • NOTIF

Dans un programme normal, la condition IF-ELSE ressemble à ceci:

Si (condition)

{

ÉNONCÉ A

}

autre

{

ÉNONCÉ B

}

ÉNONCÉ C

Alors, que se passe-t-il ici?

  • Si la condition est vraie, exécutez STATEMENT A.
  • Sinon, exécutez STATEMENT B.
  • Ensuite, STATEMENT C est exécuté quelle que soit la condition utilisée.

Cependant, dans le script bitcoin, il a un aspect différent. N’oubliez pas que la principale caractéristique du script bitcoin est qu’il s’agit d’un langage basé sur la pile. C’est pourquoi dans ce cas, la condition vient AVANT l’instruction IF.

Donc, ça ressemble à quelque chose comme ça:

ÉTAT

SI

ÉNONCÉ A

AUTRE

ÉNONCÉ B

FIN SI

ÉNONCÉ C

À quoi ressemblera l’exécution de ce bloc de script?

Étape 1: La condition apparaît sur la pile:

Étape 2: L’opcode IF sort de la condition et vérifie s’il est VRAI ou non.

Étape 3: SI true, STATEMENT A est exécuté et le script bitcoin ignore l’instruction ELSE pour passer à ENDIF et pousser STATEMENT C sur la pile.

Étape 4: Si l’opcode IF retourne FALSE alors le bloc ELSE est exécuté et STATEMENT B est poussé sur la pile.

Étape 5: Après que l’ETAT B soit poussé sur la pile, la condition ENDIF est activée et l’ETAT C continue d’être poussé sur la pile.

Sidenote:

Comme nous l’avons vu précédemment, le contrôle de flux pourrait être établi en ajoutant l’instruction VERIFY à certaines conditions.

2 4 ÉGALERER 3

Dans ce cas, puisque 2 n’est pas égal à 4, le script arrêterait de s’exécuter sur-le-champ sans même aller à 3.

L’utilisation du contrôle de flux dans le script Bitcoin

L’une des applications les plus courantes de Flow Control est de créer des scripts de rachat qui ont plusieurs chemins d’exécution.

Nous avons déjà vu des exemples d’exécutions multi-niveaux avec Multisignatures. Voyons maintenant comment les mêmes transactions multisig peuvent être écrites via des instructions de contrôle de flux.

Supposons que nous allons exécuter un Multisig 1 sur 2. Les 2 personnes impliquées dans le multisig sont Alice et Bob et seules de ces deux personnes doivent vérifier la transaction pour qu’elle passe.

Donc, pour cette multisig, comment le script de verrouillage sera-t-il conçu à l’aide des contrôles de flux?

Verrouillage du script Bitcoin

SI

CHECKSIG

AUTRE

CHECKSIG

FIN SI

Comme vous pouvez le voir, il s’agit d’une simple boucle if-else simple. Cependant, il y a quelque chose qui ne va pas ici.

Que pensez-vous qu’il manque?

C’est correct… la condition!

La condition elle-même manque… est-ce donc une erreur? Pensez-y vraiment maintenant… pourquoi n’avons-nous pas mis la condition dans le script de verrouillage?

Avoir une condition déverrouillera le script IF-ELSE et vous permettra d’accéder aux instructions, SANS fournir une vérification. N’oubliez pas que le script IF-ELSE ne peut être déverrouillé que si certaines conditions sont remplies.

C’est pourquoi, dans le script de verrouillage, nous fournissons le code IF-ELSE sans la condition.

Déverrouiller le script Bitcoin

Dans le script de déverrouillage, Bob ou Alice fournissent leur signature et les conditions requises pour déverrouiller le script.

Selon le script, le code d’Alice est déverrouillé si la condition est TRUE et le code de Bob est déverrouillé si la condition est FALSE. Nous utilisons «1» pour signifier VRAI et «0» pour signifier FAUX.

Donc, en gardant toutes ces informations à l’esprit, le script de déverrouillage d’Alice serait:

1

Le script de déverrouillage de Bob est:

0

Exécution de script

Supposons que Bob veuille déverrouiller l’UTXO, voici à quoi ressemblerait le script de validation combiné (nous allons utiliser dans cet exemple au lieu de tout le code IF-ELSE pour améliorer la compréhension):

0

Étape 1: La signature de Bob sera poussée sur la pile.

Le meilleur guide de script Bitcoin, partie 2

Étape 3: Maintenant, la partie amusante commence.

Il est temps que le soit exécuté, ce qui ressemble à ceci:

SI

CHECKSIG

AUTRE

CHECKSIG

FIN SI

Premièrement, la condition IF fait apparaître «0» hors de la pile.

Le meilleur guide de script Bitcoin, partie 2

Étape 5: CHECKSIG est exécuté qui fait apparaître à la fois la signature et la clé publique de la pile et exécute l’opération CHECKSIG sur celles-ci.

D’accord, c’était donc un simple multisig 1 sur 2.

Cependant, montons un peu plus la mise et voyons ce qui se passe lorsque nous augmentons le contrôle de flux dans un script.

SI

ÉNONCÉ A

AUTRE

SI

ÉNONCÉ B

AUTRE

ÉNONCÉ C

FIN SI

FIN SI

Très bien, nous avons donc trois instructions que nous voulons exécuter. Afin d’exécuter une instruction particulière, nous devrons saisir certaines conditions pour les atteindre.

Pour exécuter l’énoncé B, quelles conditions doivent être saisies? Les conditions seront: 1, 0 OU {TRUE, FALSE}.

Mais attendez, la déclaration B, vient après un ELSE et un IF non? La séquence de conditions ne devrait donc pas être 0,1 OU {FALSE, TRUE}?

Eh bien… rappelez-vous que Script est un langage de programmation basé sur Stack. Ainsi, une entrée de {TRUE, FALSE} apparaîtrait comme ceci sur la pile:

Le meilleur guide de script Bitcoin, partie 2

Alors, quelle est la première chose qui apparaîtra?

FALSE droite?

Cette condition FALSE fera que le script sautera IF et passera directement à ELSE.

C’est pourquoi chaque fois que nous devons mettre les conditions en place, rappelez-vous le fonctionnement d’une pile.

Qu’est-ce que Timelock?

Un timelock est un contrat intelligent primitif qui impose des restrictions temporelles sur les dépenses Bitcoin. Les trois horloges utilisées dans Bitcoin:

  • Transaction Locktime (nLocktime).
  • CHECKLOCKTIMEVERIFY ou CLTV.
  • CHECKSEQUENCEVERIFY ou CSV

nLocktime

“NLocktime” est fondamentalement le paramètre qui définit le temps avant lequel la transaction n’a pas pu être acceptée dans le bloc. Chaque ensemble de transactions comprend le nLocktime. NLocktime peut emprunter trois itinéraires possibles:

  • Si nLocktime est défini sur 0, la transaction est propagée immédiatement.

  • Si 0

  • Si nLocktime> 500 millions, puis il est interprété comme un horodatage d’époque Unix et la transaction n’est pas valide tant que l’heure spécifiée n’est pas écoulée.

Alors que nLocktime semble bon sur le papier, il y a une faiblesse très flagrante.

Supposons qu’Alice veuille envoyer à Bob du BTC avec un temps de verrouillage d’une semaine. Il est possible qu’Alice puisse utiliser les mêmes UTXO pour créer une autre transaction avant que la semaine ne se soit écoulée avec 0 locktime.

Ainsi, le destinataire est totalement dépendant de l’éthique de l’expéditeur.

CLTV

Le problème avec nLocktime était que le verrouillage de l’heure était appliqué à la transaction, ce qui la rendait vulnérable aux utilisateurs malveillants. Ainsi, CLTV ou CHECKLOCKTIMEVERIFY ont rendu le verrouillage applicable sur les sorties individuelles. Donc, pour le dire en termes simples, CLTV a rendu les sorties individuelles d’une transaction responsables du verrouillage temporel.

CLTV a été implémenté dans un canal de paiement hors chaîne primitif qui résiste à une éventuelle malléabilité. Les canaux de paiement de type CLTV ont été mis en œuvre après le BIP 65. Voyons comment cela fonctionne:

  • Alice (le marchand) donne sa clé publique à Bob (le client).

  • Bob utilise sa clé publique et celle d’Alice pour créer une adresse P2SH en utilisant les conditions suivantes: Condition 1: Alice et Bob signent tous les deux une transaction qui se produit via cette adresse.Condition 2: Seul Bob peut signer toute transaction par lui-même mais cette transaction doit avoir un temps de verrouillage supérieur au dépôt de remboursement.

  • Bob crée immédiatement une transaction de dépôt et la diffuse sur la blockchain. En raison de la condition 2 ci-dessus, il est assuré du fait qu’il peut à peu près générer un remboursement sur demande.

  • Maintenant, rappelez-vous, la première condition stipule que Alice et Bob doivent tous deux signer toute transaction qui se produit dans l’adresse P2SH. Ainsi, Bob (le client) peut signer sa part de la transaction et Alice peut signer sa part sans révéler ses détails de signature à Bob. En faisant cela, Alice peut diffuser le paiement final sur la blockchain avant que le remboursement ne soit diffusé.

CSV

Avant de comprendre le fonctionnement de CHECKSEQUENCEVERIFY ou CSV, vous devez connaître la différence entre le délai absolu et le délai relatif..

Alors que nLocktime et CLTV sont des délais absolus, ce qui signifie qu’ils mentionnent spécifiquement un point dans le temps absolu, les délais relatifs spécifient un temps écoulé à partir de la confirmation de la sortie dans la blockchain.

CSV ou CHECKSEQUENCEVERIFY est un délai relatif. L’opcode CSV spécifie une variable «nSequence».

L’opcode CSV, lorsqu’il est appelé, arrêtera le script de s’exécuter à moins que la nSequence n’indique qu’un temps de verrouillage relatif égal ou supérieur à celui mentionné dans l’opcode CSV.

Très bien, alors amusons-nous maintenant. Utilisons un script utilisant le contrôle de flux et CSV!

Imaginons que nous ayons une entreprise détenue par 3 personnes: B, C et D.La société fonctionne sur un multisig 2 sur 3, ce qui signifie que les fonds de l’entreprise ne peuvent être utilisés que si au moins 2 personnes sur 3 présentent leur clés.

Cependant, au cas où les gens perdraient leurs clés, ils doivent faire une sécurité intégrée pour s’assurer que les fonds peuvent toujours être activés par Multisig 2 sur 3. Dans ce cas, ils créent une clé de sauvegarde et donnent à leur avocat A.

Alors, à quoi cela ressemblera-t-il dans le script?

SI

SI

2

AUTRE

<30 jours> CHECKSEQUENCEVERIFY DROP <Pubkey de A> CHECKSIGVERIFY

1

FIN SI

<Touche de pub de B> 3 CHECKMULTISIG

AUTRE

<90 jours> CHECKSEQUENCEVERIFY DROP <Pubkey de A> CHECKSIG

FIN SI

Comme vous pouvez le voir, le flux peut se dérouler de trois manières:

  • Si tout va bien, alors il agit comme un simple multisig 2 sur 3.
  • Si l’un des propriétaires perd sa clé et ne peut pas la produire dans les 30 jours, les conditions requises pour avoir accès aux fonds sont la clé de l’avocat ET un multisig 1 sur 3 avec les 3 propriétaires.
  • Si les 3 propriétaires perdent leurs clés, l’avocat peut accéder aux fonds après 90 jours.

Condition n ° 1: tout est bon

Si tout va bien et que personne n’a perdu de clé, alors 2 des 3 propriétaires vérifieront les transactions avec leurs signatures comme dans n’importe quel multisig normal.

Script de déverrouillage: 0

Remarque: n’oubliez pas que toutes les transactions multisig commencent par un «0» pour contourner le bogue CHECKMULTISIG.

Script de validation complet: 0

Alors, à quoi ressemble l’exécution?

Étape 1: Le script de déverrouillage est poussé vers la pile étape par étape

Le meilleur guide de script Bitcoin, partie 2

Cela vous semble-t-il familier?

Ouais… c’est le multisig 2 sur 3 et le script bitcoin est exécuté normalement.

Condition n ° 2: une personne perd ses clés

Dans ce cas, l’avocat A entre en jeu.

Script de déverrouillage: 0

Script de validation complet: 0

Alors, à quoi ressemble l’exécution?

Étape # 1: Le script de déverrouillage est poussé sur la pile.

Le meilleur guide de script Bitcoin, partie 2

Étape # 3: Les séquences à venir sont:

<30 jours> CHECKSEQUENCEVERIFY DROP CHECKSIGVERIFY

Le “<30 jours> CHECKSEQUENCEVERIFY DROP »active essentiellement un délai de 30 jours. Si dans le verrou temporel, le propriétaire qui a perdu sa clé ne peut pas la récupérer, le script passe à l’élément suivant de la pile.

Cependant, s’ils peuvent récupérer la clé et montrer la preuve, le script s’arrête immédiatement de s’exécuter (puisque le code VERIFY est ajouté).

Remarque: qu’est-ce que DROP? Supposons que le paramètre nécessaire pour satisfaire CHECKSEQUENCEVERIFY soit soumis, le paramètre de temps qui l’a précédé, c’est-à-dire “<30 jours>»Est toujours sur la pile. La fonction DROP affiche le dernier élément de la pile qui se trouve être, dans ce cas, <30 jours>.

Le meilleur guide de script Bitcoin, partie 2

Maintenant, cela devient un multisig 1 sur 3. Si la signature de B est vérifiée, le script s’exécute correctement.

Condition n ° 3: les trois propriétaires égarent leurs clés

Dans ce cas, le script n’exécutera même pas le premier IF, il passera directement à l’instruction ELSE.

Script de déverrouillage:

Script de validation complet:

Alors, à quoi ressemble l’exécution?

Étape # 1: Le script de déverrouillage est poussé sur la pile.

Le meilleur guide de script Bitcoin, partie 2

Conclusion

Le but de ce guide était de vous faire comprendre la logique derrière divers scénarios de transaction Bitcoin Script. Il est fascinant de voir le mécanisme derrière ces transactions, c’est le moins qu’on puisse dire. Si vous n’avez pas lu la partie 1 du Guide des scripts Bitcoin, assurez-vous de la consulter!

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me