RealT a annoncé cette semaine la liquidation de ses sociétés. Des investisseurs, parfois engagés à hauteur de plusieurs dizaines de milliers de dollars, racontent à Cryptoast leur désillusion, tandis qu'une action collective se met en place en France.
Lâarticle Chute de RealT : ces investisseurs flouĂ©s racontent la descente aux enfers est apparu en premier sur Cryptoast.
Vous conservez vos Bitcoins en self-custody et cherchez une solution plus robuste quâune clĂ© unique pour assurer leur sĂ©curitĂ© ? Multisignature, mĂ©canisme de rĂ©cupĂ©ration, prĂ©paration de la transmission : le portefeuille Liana combine ces outils avancĂ©s pour sĂ©curiser vos BTC sans intermĂ©diaire. Voici un tutoriel complet pour configurer le wallet Liana Ă©tape par Ă©tape.
Lâarticle Comment sĂ©curiser et transmettre vos Bitcoins grĂące Ă des clĂ©s de secours avec Liana ? Tutoriel complet est apparu en premier sur Cryptoast.
Le secteur des cryptomonnaies vit des heures sombres et terrifiantes depuis que les enlÚvements contre rançon de personnalités populaires de l'écosystÚme se sont multipliés. Une réalité qui prend une tournure rapidement horrible lorsque des soupçons de fraude sont de la partie.
Lâarticle Un escroc de la crypto et sa femme retrouvĂ©s dĂ©membrĂ©s et enterrĂ©s Ă DubaĂŻ est apparu en premier sur Cryptoast.
Le layer 2 Scroll a suscité la colÚre de sa communauté en annonçant à l'avance la date de son snapshot pour l'airdrop de son token SCR. Cette décision inhabituelle, permettant potentiellement à un plus grand nombre de personnes de se qualifier pour l'airdrop en réalisant des transactions sur la blockchain, est perçue comme favorisant les whales au détriment des utilisateurs de la premiÚre heure. L'activité sur la blockchain Scroll est-elle organique ou bien uniquement sous perfusion jusqu'à la date du snapshot ?
Lâarticle Scroll, une blockchain sous perfusion avant l'airdrop de tokens SCR ? est apparu en premier sur Cryptoast.
Scroll est un layer 2 de la blockchain Ethereum de type zk-Rollup. Développé en collaboration avec le groupe Privacy and Scaling Explorations de la Fondation Ethereum, ce projet utilise des preuves à divulgation nulle de connaissance (ZKP) pour traiter les transactions hors chaßne, allégeant ainsi la charge sur Ethereum. Avec l'arrivée imminente de son token via un potentiel airdrop, Scroll est-il en passe de devenir un acteur clé de ce secteur ?
Lâarticle Qu'est-ce que Scroll ? Zoom sur ce layer 2 soutenu par la Fondation Ethereum est apparu en premier sur Cryptoast.
Lorsqu'il a conçu le prototype de Bitcoin en janvier 2009, Satoshi Nakamoto a dû construire un premier bloc à partir duquel la chaßne s'est allongée. Ce bloc il l'a appelé le bloc de genÚse (« genesis block » en anglais) en référence au premier livre de la Torah et de la Bible, qui raconte la création du monde par Dieu.
Par convention, on considÚre qu'il s'agit du bloc de hauteur 0 (ou « bloc 0 ») au-dessus duquel les autres blocs sont successivement empilés. Examinons plus en détail ce que contient cet élément fondateur de Bitcoin en procédant à une dissection minutieuse !
Â
Le bloc de genĂšse est une donnĂ©e essentielle du protocole Bitcoin car il constitue la base Ă partir de laquelle on peut dĂ©terminer la chaĂźne la plus longue (c'est-Ă -dire celle ayant le plus de preuve de travail accumulĂ©e) et par consĂ©quent la validitĂ© des transactions du registre. Il est thĂ©oriquement le seul bloc Ă devoir ĂȘtre inscrit en dur dans le protocole, mĂȘme si d'autres l'ont Ă©tĂ© par la suite.
Tel que l'écrivait Satoshi Nakamoto :
« La chaßne de blocs est une structure en forme d'arbre qui a pour racine le bloc de genÚse, chaque bloc pouvant avoir plusieurs candidats à sa suite. »
![]()
Le code de novembre 2008 (fourni par Satoshi à Hal Finney, Ray Dillinger et James A. Donald notamment) contenait déjà une premiÚre version du bloc de genÚse, horodatée au 10 septembre 2008, 18:02:08 UTC. Néanmoins, un nouveau bloc a été construit en janvier 2009 spécialement pour le lancement du prototype.
Le bloc de genÚse que nous connaissons est ainsi présent dans la version 0.1 du logiciel de Bitcoin, publiée le 8 janvier 2009. Un commentaire au sein du code le décrit :
Genesis Block:
GetHash() = 0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
hashMerkleRoot = 0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
txNew.vin[0].scriptSig = 486604799 4 0x736B6E616220726F662074756F6C69616220646E6F63657320666F206B6E697262206E6F20726F6C6C65636E61684320393030322F6E614A2F33302073656D695420656854
txNew.vout[0].nValue = 5000000000
txNew.vout[0].scriptPubKey = 0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704 OP_CHECKSIG
block.nVersion = 1
block.nTime = 1231006505
block.nBits = 0x1d00ffff
block.nNonce = 2083236893
CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1)
CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
vMerkleTree: 4a5e1e
Ce bloc pÚse trÚs exactement 285 octets. Le voici représenté en hexadécimal brut :
0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000
Le bloc de genĂšse est composĂ© d'un entĂȘte de 80 octets et d'une unique transaction, la transaction de rĂ©compense. Son identifiant (le rĂ©sultat du hachage de l'entĂȘte par double SHA-256) est 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f. Les zĂ©ros qui dĂ©butent cet identifiant indiquent qu'une preuve de travail a Ă©tĂ© rĂ©alisĂ©e.
Notez que les différentes informations contenues dans le bloc sont souvent transmises avec un ordre des octets inverse (dit « little-endian » ou « petit-boutiste »). Nous donnerons ici les informations dans l'ordre ordinaire (qu'on appelle « big-endian » ou « gros-boutiste ») à l'aide du préfixe 0x.
Â
Comme tous les blocs dans le protocole, le bloc de genĂšse possĂšde un entĂȘte donnant 6 informations diffĂ©rentes. Voici cet entĂȘte en dĂ©tail :
01000000 - version 0000000000000000000000000000000000000000000000000000000000000000 - identifiant du bloc précédent 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a - racine de Merkle 29ab5f49 - horodatage ffff001d - valeur cible 1dac2b7c - nonce
Â
0x00000001
La version du bloc indique l'ensemble des rÚgles respectées par le bloc. Cette version 1 indiquait un respect des rÚgles du protocole originel défini par Satoshi. D'autres versions ont été introduites plus tard : la version 2 pour l'application du BIP-34 en mars 2013, la version 3 pour l'activation du BIP-66 en juillet 2015, et la version 4 pour celle du BIP-65 en décembre 2015. Le champ de version a par la suite été utilisé pour que les mineurs signalent leur intention d'appliquer un soft fork (conformément au BIP-9).
Â
0x0000000000000000000000000000000000000000000000000000000000000000
Puisqu'il s'agit du premier bloc de la chaßne, le champ utilisé pour donner l'identifiant du bloc précédent est fixé à zéro par convention.
Â
0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
La racine de Merkle correspond Ă l'empreinte finale de l'arbre de Merkle des transactions. Puisqu'il n'y a qu'une seule transaction dans le bloc de genĂšse, il s'agit simplement de l'identifiant de cette transaction.
Â
0x495fab29
L'horodatage indique la date et l'heure à laquelle le mineur a trouvé le bloc. Il est donné par le nombre de secondes depuis le 1er janvier 1970 00:00:00 UTC. Ici, le nombre correspond à 1 231 006 505 secondes : le bloc de genÚse est donc horodaté au 3 janvier 2009 à 18:15:05 UTC.
Toutefois, il ne faut pas croire que cet horodatage indique l'instant précis du lancement effectif du réseau. Ce dernier a en effet été réalisé un peu plus tardivement : le bloc 1 est ainsi horodaté au 9 janvier 2009 à 02:54:25 UTC, soit 5 jours, 8 heures, 39 minutes et 20 secondes plus tard.
Â
0x1d00ffff
La valeur cible est la valeur minimale que l'identifiant du bloc peut avoir pour que ce dernier constitue une solution au problÚme de preuve de travail de Bitcoin. Moins cette valeur cible est haute, plus il est facile de trouver une solution et de miner un bloc. Elle est donc inversement proportionnelle à la difficulté du réseau.
La valeur cible du bloc de genĂšse correspond Ă la plus grande valeur possible dans Bitcoin, ou la difficultĂ© la plus basse pour le dire autrement. Elle est encodĂ©e comme un nombre flottant oĂč le premier octet reprĂ©sente un exposant et oĂč la mantisse est dĂ©terminĂ©e par les 3 octets suivants. Ici, elle est Ă©gale Ă 0x00ffff Ă 256(0x1d - 3) c'est-Ă -dire 0x00000000ffff0000000000000000000000000000000000000000000000000000.
La preuve de travail du bloc est valide car l'identifiant est effectivement (largement) inférieur à cette valeur cible :
0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f †0x00000000ffff0000000000000000000000000000000000000000000000000000
On définit la difficulté du minage comme l'inverse de la valeur cible multipliée par la valeur cible de base :
difficulté = cible_de_base / cible
La difficulté du bloc de genÚse est donc de 1.
AprÚs le lancement du réseau, la difficulté a stagné à ce niveau pendant prÚs d'un an avant d'enfin commencer à augmenter le 30 décembre 2009.
Au sein du code, le champ de la valeur cible est appelĂ© nBits, car ce paramĂštre dĂ©signait (avant que Satoshi n'en modifie le sens) le nombre de bits de tĂȘte Ă mettre Ă zĂ©ro pour que la solution soit valide. Dans la version de novembre 2008, le champ Ă©tait en effet fixĂ© Ă 20, ce qui correspondait Ă 5 zĂ©ros de tĂȘte en reprĂ©sentation hexadĂ©cimale, soit une valeur cible de 0x00000fffff....
Â
0x7c2bac1d
Le nonce (mot qui provient de l'expression anglaise « for the nonce » signifiant « pour la circonstance, pour l'occasion ») désigne le nombre que le mineur fait varier pour calculer la preuve de travail. Il n'a aucune signification particuliÚre, étant déterminé au hasard.
Â
L'ensemble des transactions forme la seconde partie du bloc. Le voici en détail :
01 - nombre de transactions 01000000 - version 01 - nombre d'entrées 0000000000000000000000000000000000000000000000000000000000000000 - identifiant de transaction de la sortie précédente ffffffff - index de la sortie précédente 4d - taille du script de déverrouillage 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73 - script de déverrouillage ffffffff - numéro de séquence 01 - nombre de sorties 00f2052a01000000 - montant 43 - taille du script de verrouillage 4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac - script de verrouillage 00000000 - temps de verrouillage
Â
0x01
Le bloc contient une seule transaction : la transaction de rĂ©compense qui rĂ©munĂšre le mineur (ici Satoshi) pour la preuve de travail rĂ©alisĂ©e. Le bloc ne comporte ainsi aucune autre transaction, tout comme les blocs minĂ©s dans les premiers jours. Il a fallu attendre le 12 janvier et le bloc 170 pour voir la premiĂšre transaction effective du rĂ©seau ĂȘtre confirmĂ©e : celle entre Satoshi et Hal Finney.
Toutes les données restantes du bloc appartiennent à la transaction de récompense.
Â
0x00000001
La version de la transaction indique comment celle-ci doit ĂȘtre interprĂ©tĂ©e. Elle est fixĂ©e Ă 1 conformĂ©ment au protocole initial. Aujourd'hui, il existe Ă©galement une version 2 qui autorise l'usage des verrous temporels relatifs (voir BIP-68).
Â
0x01
La transaction contient une seule entrée : la base de piÚce, ou coinbase, qui permet de créer ex nihilo les nouveaux bitcoins et de recueillir les frais de transaction. Cette entrée est donc purement superflue, mais permet de conserver une certaine cohérence dans l'implémentation logicielle. Elle est constituée des champs identifiant la sortie précédente (théorique), d'un script de déverrouillage et d'un numéro de séquence.
Â
0x0000000000000000000000000000000000000000000000000000000000000000
Ce champ est utilisé dans les transactions pour dire à quel sortie transactionnelle correspond une entrée, en donnant l'identifiant de la transaction qui a créé la sortie. Puisqu'il s'agit d'une transaction de récompense qui ne fait pas référence à une sortie transactionnelle précédente, ce champ est fixé à 0 par convention.
Â
0xffffffff
Ce champ est utilisé dans les transactions pour dire à quel sortie transactionnelle correspond une entrée, en donnant la position de la sortie dans la transaction qui l'a créée. Puisqu'il s'agit d'une transaction de récompense qui ne fait pas référence à une sortie transactionnelle précédente, ce champ est fixé au maximum par convention.
Â
0x04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
Dans Bitcoin, le script de déverouillage est combiné à un script de verrouillage précédent et détermine la validité d'une dépense. Il contient généralement les signatures nécessaires à la dépense d'une piÚce et est par conséquent souvent appelé scriptSig. Dans le cas d'une transaction de récompense, l'entrée ne fait référence à aucune sortie transactionnelle existante et ce script peut donc contenir des données arbitraires.
Ici, le script se présente de la maniÚre suivante :
<valeur cible> <nonce supplémentaire> <chaßne de caractÚres>
Ainsi, il est constitué de trois informations :
0xffff001d0x04), ou extra nonce, mis en place par Satoshi dans le code du logiciel. Le nonce supplémentaire du bloc de genÚse a pour valeur 4, et ceux des blocs suivants sont croissants : celui du bloc 1 est aussi égal à 4, celui du bloc 2 à 11, celui du bloc 3 à 14, etc. La variation de ce nonce supplémentaire au sein des blocs a permis de mettre en évidence un motif particulier, appelé le « Patoshi Pattern », qui détermine précisément les blocs minés par Satoshi et qui démontre que sa fortune s'élÚve à plus de 1 125 150 bitcoins.The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
Cette courte phrase correspond à la une du Times du 3 janvier 2009, qui annonçait que le ministre des finances du Royaume-Uni était sur le point de renflouer les banques pour la deuxiÚme fois. Le Times étant un quotidien anglais, cela a mené à des spéculations quant à l'identité de Satoshi, qui écrivait également dans un anglais britannique.
![]()
Cette phrase présente dans le script de la transaction de récompense possÚde un rÎle double :
Ce script de la base de piĂšce est encore utilisĂ© de nos jours par les mineurs pour de multiples raisons. Ă l'instar de Satoshi, ils peuvent inclure des informations arbitraires dans le bloc et faire passer un message public au monde. Ă'a Ă©tĂ© le cas de la coopĂ©rative F2Pool qui, le 11 mai 2020, a Ă©voquĂ© l'injection de liquiditĂ© de la RĂ©serve FĂ©dĂ©rale en rĂ©action Ă la crise du covid-19 au sein du bloc 629 999 (le bloc prĂ©cĂ©dant le troisiĂšme halving) :
NYTimes 09/Apr/2020 With $2.3T Injection, Fed's Plan Far Exceeds 2008 Rescue
Les regroupements de mineurs peuvent Ă©galement s'identifier en indiquant leur nom, ce qui permet de juger de la dĂ©centralisation du rĂ©seau, mĂȘme si cette pratique reste purement dĂ©clarative.
Enfin, les mineurs se servent encore de ce champ pour faire varier un nonce supplĂ©mentaire, le nonce de l'entĂȘte ne permettant plus depuis 2012 d'essayer suffisamment de possibilitĂ©s par rapport Ă la difficultĂ© Ă©levĂ©e du rĂ©seau.
Â
0xffffffff
Le numéro de séquence de l'entrée est maximal, ce qui fait que la transaction est considérée comme finale.
à l'origine, le numéro de séquence dans les entrées avait pour objectif de permettre les échanges répétés au sein de contrats, tels que les canaux de paiement. Ce modÚle imaginé par Satoshi n'était pas suffisamment sécurisé et a par conséquent été abandonné. Cependant, la rÚgle de finalité, qui fait que la transaction est considérée comme finale (pas de temps de verrouillage) si les numéros de séquence de toutes les entrées sont maximaux (comme ici), a été conservée.
Aujourd'hui, ce numéro de séquence est utilisé pour déterminer le temps de verrouillage relatif d'une entrée et pour signaler Replace-by-Fee.
Â
0x01
La transaction contient une seule sortie, celle créditant Satoshi de son revenu de minage. Cette sortie est constituée d'un montant et d'un script de verrouillage.
Â
0x000000012a05f200
Le montant de la sortie est donné dans la plus petite unité du systÚme, unité qu'on a appelé le satoshi en hommage au créateur de Bitcoin. Ce montant correspond ici à 5 milliards de satoshis, soit 50 bitcoins. Il s'agit de la limite maximale du taux de création monétaire de l'époque (50 bitcoins par bloc).
Â
0x4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac
Le scrpt de verrouillage est l'ensemble des conditions à fournir pour pouvoir dépenser la piÚce correspondante. Ici, il possÚde la forme :
<clé publique> CHECKSIG
oĂč la clĂ© publique est 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f. Il s'agit donc d'une sortie transactionnelle de type Pay to Public Key (P2PK), un schĂ©ma utilisĂ© dans les dĂ©buts de Bitcoin, qui demande une simple signature pour dĂ©bloquer les fonds. Cela explique le nom donnĂ© couramment Ă ce script : scriptPubKey.
Bien souvent, cette sortie est rĂ©trospectivement attribuĂ©e Ă l'adresse 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa, obtenue en prenant l'empreinte de la clĂ© publique. Cela est nĂ©anmoins purement esthĂ©tique car c'est bien la clĂ© publique elle-mĂȘme qui a servi Ă recevoir les bitcoins, pas l'adresse.
Fait intĂ©ressant : cette sortie transactionnelle n'est pas considĂ©rĂ©e comme dĂ©pensable par le protocole en raison de la façon dont le bloc de genĂšse est exprimĂ© dans le code. Cette erreur de programmation pourrait ĂȘtre corrigĂ©e par un hard fork, mais cela ne serait ni utile (Satoshi n'a pas touchĂ© Ă ses bitcoins depuis qu'il a disparu), ni mĂȘme souhaitable (incompatibilitĂ© du protocole). Les 50 premiers bitcoins créés sont donc probablement brĂ»lĂ©s Ă tout jamais.
Â
0x00000000
Le temps de verrouillage (donnĂ©e globale appartenant Ă la transaction) dĂ©termine la date Ă partir de laquelle cette transaction pourra ĂȘtre confirmĂ©e. En Ă©tant fixĂ© Ă zĂ©ro, celui-ci est dĂ©sactivĂ©.
Â
Si le bloc de genĂšse constitue un fondement du protocole Bitcoin, il sert Ă©galement de base aux diffĂ©rentes branches minoritaires de Bitcoin qui possĂšdent le mĂȘme historique jusqu'Ă leurs scissions respectives : Bitcoin Cash, Bitcoin SV, Bitcoin Gold ou encore eCash/XEC. D'autres protocoles possĂšdent leur propre bloc de genĂšse et certains d'entre eux ont Ă©galement incorporĂ© la une d'un journal ou d'un magazine pour garantir que le lancement du rĂ©seau ne s'est pas rĂ©alisĂ© avant la date donnĂ©e. Ainsi, le bloc de genĂšse de Litecoin (datant du 7 octobre 2011) contient la phrase suivante :
NY Times 05/Oct/2011 Steve Jobs, Appleâs Visionary, Dies at 56
Celui de Dash (datant du 19 janvier 2014) inclut la une suivante :
Wired 09/Jan/2014 The Grand Experiment Goes Live: Overstock.com Is Now Accepting Bitcoins
Â
Bitcoin Wiki, Genesis block
Bitcoin est un systĂšme de monnaie programmable et constitue la premiĂšre implĂ©mentation de ce quâon appelle les smart contracts ou contrats autonomes. Ă chaque transaction, des scripts sont exĂ©cutĂ©s pour vĂ©rifier que les fonds dĂ©pensĂ©s remplissent les conditions voulues par lâutilisateur prĂ©cĂ©dent. De nombreuses conditions sont peuvent ĂȘtre mises en place (divulgation dâun secret, verrou temporel, multisignature), mĂȘme si le plus souvent les fonds sont simplement dĂ©pensĂ©s grĂące Ă la signature dâun utilisateur unique.
Bitcoin repose sur un modĂšle de piĂšces (UTXO), oĂč chaque piĂšce est verrouillĂ©e par un script incomplet Ă©crit sur la chaĂźne. Lors dâune transaction, les piĂšces de bitcoin en entrĂ©e sont dĂ©verrouillĂ©es par un script complĂ©mentaire. Puis, de nouvelles piĂšces sont créées Ă partir des anciennes grĂące Ă de naouveaux scripts de verrouillage, ce qui perpĂ©tue le caractĂšre programmable du systĂšme.
![]()
Lorsque jâai dĂ©couvert comment les transactions fonctionnaient et ce quâelles permettaient, jâai Ă©tĂ© fascinĂ© par lâĂ©lĂ©gance de cette solution. NĂ©anmoins, en approfondissant ma recherche, jâai Ă©tĂ© perturbĂ© par lâexistence dâune chose qui diffĂ©rait des autres, une exception : le schĂ©ma Pay to Script Hash, quâon abrĂšge couramment en P2SH.
Â
Des scripts sont impliquĂ©s dans chaque transaction du rĂ©seau Bitcoin. Le langage de script est constituĂ© de plus dâune centaine de codes opĂ©ration, de sorte quâun large Ă©ventail de possibilitĂ©s sâoffre Ă nous vis-Ă -vis des conditions quâon souhaite imposer.
Cependant, dans le but dâamĂ©liorer la communication entre les diffĂ©rentes applications et de limiter le risque de perte, certains standards de scripts, ou schĂ©mas, ont Ă©mergĂ©.
Â
Le premier schĂ©ma sâappelle Pay to Public Key (P2PK), quâon peut traduire littĂ©ralement en français par « payer Ă la clĂ© publique ». Il sâagit dâenvoyer des fonds vers la clĂ© publique (public key) dâun utilisateur, que lui seul pourrait dĂ©penser en signant avec sa clĂ© privĂ©e. Le script de verrouillage (parfois appelĂ© scriptPubKey) permettant ce type dâenvoi est :
<clé publique> CHECKSIG
Au moment de la dĂ©pense, lâutilisateur doit utiliser un script de dĂ©verrouillage (parfois appelĂ© scriptSig) contenant simplement sa signature :
<signature>
Pour lâexpliquer en français, lâexĂ©cution successive de ces deux scripts permet de vĂ©rifier que la signature fournie par lâutilisateur correspond Ă sa clĂ© publique, auquel cas elle est valide.
Si le schĂ©ma P2PK Ă©tait utilisĂ© dans les premiers jours de Bitcoin, notamment pour recevoir les gains de minage, il est aujourdâhui tombĂ© en dĂ©suĂ©tude au profit dâun schĂ©ma rival : P2PKH.
Â
Pay to Public Key Hash (P2PKH), littĂ©ralement « payer Ă lâempreinte de la clĂ© publique », est le deuxiĂšme type de schĂ©ma apparu dans Bitcoin dĂšs le dĂ©but, grĂące Ă la conception de Satoshi Nakamoto. Ce schĂ©ma permet non pas de rĂ©aliser un paiement vers une clĂ© publique, mais vers lâempreinte dâune clĂ© publique, et de faire en sorte que le systĂšme de script de Bitcoin vĂ©rifie quand mĂȘme que la signature correspond Ă la clĂ© publique lors de la dĂ©pense des fonds. Lâempreinte de la clĂ© publique est alors considĂ©rĂ©e comme la donnĂ©e essentielle de lâadresse, qui dans ce cas commence toujours par un 1, comme par exemple 1DzxhUphLFq8FZPGbFgLF8Ssz3hMX9EuMp.
Le script de verrouillage ici est :
DUP HASH160 <empreinte de la clé publique> EQUALVERIFY CHECKSIG
Et le script de déverrouillage est :
<signature> <clé publique>
Pour le dire en français, lâexĂ©cution des deux scripts permet de :
HASH160 (lâempreinte) est Ă©gale Ă lâempreinte qui est spĂ©cifiĂ©e dans le script ;Lâavantage de ce schĂ©ma est quâil permet dâavoir des adresses plus courtes (lâinformation Ă encoder nâest que de 20 octets au lieu de 65 octets pour une clĂ© publique), chose pour laquelle Satoshi Nakamoto lâa implĂ©mentĂ©. De plus, en ne rĂ©vĂ©lant la clĂ© publique quâau moment de la dĂ©pense, ce schĂ©ma accroĂźt aussi la sĂ©curitĂ© contre la menace (trĂšs hypothĂ©tique) de lâordinateur quantique.
Â
Le schĂ©ma Pay To MultiSig (P2SH), littĂ©ralement « payer Ă la multisignature », sâest popularisĂ© dĂ©but 2012. Il sâagit essentiellement dâun schĂ©ma qui permet dâexiger la signature de M personnes faisant partie dâun groupe de N participants, via le script de verrouillage :
M <clé publique 1> ... <clé publique N> N CHECKMULTISIG
Le script de déverrouillage correspondant est :
<leurre (0)> <signature 1> ... <signature M>
Pour plus dâinformations sur la multisignature, je vous invite Ă lire mon article sur les adresses multisignatures.
Câest ce schĂ©ma, particuliĂšrement exigeant au niveau de la mise en place, qui a motivĂ© la crĂ©ation du schĂ©ma P2SH.
Â
Pay to Script Hash (P2SH), littĂ©ralement « payer Ă lâempreinte du script ». Ce schĂ©ma reprend lâidĂ©e derriĂšre P2PKH, Ă la seule diffĂ©rence que la donnĂ©e hachĂ©e ici nâest pas une clĂ© publique, mais le script lui-mĂȘme ! Le script en question est alors appelĂ© script de rĂšglement (redeem script) et son empreinte est la donnĂ©e constituante de lâadresse, cette derniĂšre commençant toujours par un 3 Ă lâinstar de 3DyDCGSC59yYY46dnRH7Vw1iKbV8zeW36q.
Ce type de schĂ©ma a pour avantage de permettre Ă un utilisateur dây inclure nâimporte quel script et de pouvoir recevoir des fonds de la quasi-totalitĂ© des portefeuilles existants. Le fardeau de la construction et du dĂ©verrouillage du script revient donc au dĂ©tenteur de lâadresse, non Ă celui qui envoie les fonds, ce qui simplifie grandement la communication.
Le script de verrouillage pour le schéma P2SH est :
HASH160 <empreinte du script de rĂšglement> EQUAL
Et le script de déverrouillage est un script de la forme :
[éléments de déverrouillage] <script de rÚglement>
En français, cela veut dire que le systĂšme de script originel de Bitcoin va vĂ©rifier que le hachage du script de rĂšglement est Ă©gal Ă lâempreinte inscrite dans le script. Et câest tout.
Comment ça, « câest tout » ? Le script de rĂšglement nâest pas exĂ©cutĂ© ? Nâimporte qui connaissant le script pourrait dĂ©penser les bitcoins ?
Comme on va le voir, ce nâest pas le cas et le script de rĂšglement est bien exĂ©cutĂ©, bien que ce ne soit pas indiquĂ© explicitement.
Â
Dans la vie, il y a souvent une maniĂšre Ă©lĂ©gante de faire les choses, qui demande parfois plus dâefforts initiaux mais qui prĂ©serve lâordre et la simplicitĂ©, et une maniĂšre grossiĂšre, plus facile Ă implĂ©menter mais qui complique les choses et crĂ©e le dĂ©sordre.
Ainsi, dans le systĂšme lĂ©gislatif dâun pays, il est plus facile de crĂ©er et de faire voter de nouvelles lois execeptionnelles que de rĂ©former en profondeur le systĂšme. Cette tendance Ă lâinflation lĂ©gislative fait quâon se retrouve avec des pays comme la France, qui cumule 73 codes juridiques en vigueur et qui vit de 214 taxes et impĂŽts ainsi que dâune myriade de cotisations sociales.
En informatique comme en droit, lâajout de nouvelles exceptions crĂ©e de la dette technique, rendant le systĂšme plus complexe Ă apprĂ©hender, plus difficile Ă maintenir et plus susceptible de ne pas fonctionner comme attendu. P2SH fait partie de ces exceptions.
Â
LâidĂ©e dâimplĂ©menter un schĂ©ma de script qui utilise lâempreinte dâun autre script comme identifiant est nĂ©e en 2011, afin de reproduire ce qui est rĂ©alisĂ© dans la schĂ©ma P2PKH. Toutefois, cette idĂ©e nâa pas Ă©tĂ© dĂ©veloppĂ©e initialement comme P2SH, mais Ă travers OP_EVAL, un nouveau code opĂ©ration permettant lâexĂ©cution rĂ©cursive dâun script Ă lâintĂ©rieur dâun autre script.
Lâajout de ce code opĂ©ration, proposĂ© le 18 octobre 2011 par Gavin Andresen, devait ĂȘtre implĂ©mentĂ© comme un soft fork, via le remplacement de lâinstruction nulle OP_NOP1.
Un schéma standard aurait également été ajouté. Le script de verrouillage imaginé pour ce schéma était :
DUP HASH160 <empreinte du script de rĂšglement> EQUALVERIFY EVAL
Le script de déverrouillage correspondant était :
[éléments de déverrouillage] <script de rÚglement>
Pour le dire en français, lâexĂ©cution des deux scripts cĂŽte Ă cĂŽte aurait permis de :
NĂ©anmoins cette solution nâa pas Ă©tĂ© acceptĂ©e, celle-ci ayant Ă©tĂ© jugĂ©e trop dangereuse au niveau du pouvoir de rĂ©cursion. Ă la place câest un autre modĂšle, plus restrictif, qui a prĂ©valu : le schĂ©ma P2SH.
Â
P2SH a Ă©tĂ© proposĂ© le 3 janvier 2012 comme alternative Ă OP_EVAL et Ă dâautres propositions. Il a Ă©tĂ© intĂ©grĂ© au protocole Bitcoin le 1er avril sous la forme dâun soft fork activĂ© par les mineurs.
LâexĂ©cution de ce type de script fonctionne exactement comme le schĂ©ma liĂ© Ă OP_EVAL, Ă lâexception quâune partie du script nâest pas explicitement indiquĂ©e. Dâune part, la vĂ©rification de la correspondance entre lâempreinte indiquĂ©e et le script de rĂšglement est bien rĂ©alisĂ©e par le script de verrouillage. En effet, celui-ci devient (comme on lâa vu) :
DUPHASH160 <empreinte du script de rĂšglement> EQUALVERIFYEVAL
Dâautre part, lâĂ©valuation du script de rĂšglement est effectuĂ©e implicitement grĂące Ă une exception ajoutĂ©e au code source. DĂšs que les nĆuds du rĂ©seau reconnaissent le schĂ©ma, ils lâinterprĂštent diffĂ©remment. Ainsi dans Bitcoin Core, on peut observer la condition suivante au sein de la fonction VerifyScript de lâinterprĂ©teur :
// Additional validation for spend-to-script-hash transactions:
if ((flags & SCRIPT_VERIFY_P2SH) && scriptPubKey.IsPayToScriptHash())
{
...
}
Cette exception permet lâexĂ©cution du script de rĂšglement aprĂšs lâexĂ©cution des deux scripts (dĂ©verrouillage et verrouillage). DâoĂč le fait quâon indique les Ă©lĂ©ments de dĂ©verrouillage avant de pousser le script de rĂšglement dans le script de dĂ©verrouillage :
[éléments de déverrouillage] <script de rÚglement>
Si cette solution est pratique, elle crĂ©e une complexitĂ© et nâest pas trĂšs Ă©lĂ©gante. Comme lâa dit Gavin Andresen dans lâexplication du BIP-16 :
ReconnaĂźtre une forme « spĂ©ciale » de scriptPubKey et rĂ©aliser une validation supplĂ©mentaire quand elle est dĂ©tectĂ©e, câest laid. Cependant, lâavis gĂ©nĂ©ral est que les alternatives sont soit encore plus laides, soit plus complexes Ă implĂ©menter, et/ou Ă©tendent le pouvoir du langage dâexpression de maniĂšre dangereuse.
LâimplĂ©mentation initiale de P2SH a donc compliquĂ© les choses. Mais cela ne sâest pas arrĂȘtĂ© pas lĂ , car lâactivation de SegWit en 2017 a ajoutĂ© de la complexitĂ© au modĂšle.
Â
En aoĂ»t 2017, la mise Ă niveau SegWit a Ă©tĂ© intĂ©grĂ©e Ă Bitcoin (BTC) sous la forme dâun soft fork. Celle-ci avait pour objectif de corriger la mallĂ©abilitĂ© des transactions, dâaugmenter la capacitĂ© transactionnelle, dâamĂ©liorer la vĂ©rification des signatures et de faciliter les modifications futures du protocole.
Pour ce faire, SegWit implĂ©mentait un nouveau modĂšle de transaction, oĂč les signatures sont situĂ©es dans une partie sĂ©parĂ©e de la transaction appelĂ©e le tĂ©moin (dâoĂč le nom de Segregated Witness). Afin dâimplĂ©menter ce changement comme un soft fork, il a Ă©tĂ© nĂ©cessaire dâintroduire un moyen dâaccĂ©der au nouveau type de transaction sans briser la compatibilitĂ© avec les anciennes adresses.
Câest ainsi que 4 nouveaux types dâadresse ont vu le jour : deux nouveaux types « natifs », P2WPKH (Pay to Witness Public Key Hash) et P2WSH (Pay to Witness Script Hash), incompatibles avec portefeuilles ne supportant pas SegWit ; et deux types « imbriquĂ©s » associĂ©s, P2SH-P2WPKH et P2SH-P2WSH, qui permettent la transition grĂące Ă lâemploi de P2SH.
Pour ces deux derniers types dâadresse, le schĂ©ma utilisĂ© est P2SH avec un script de rĂšglement de la forme :
<version SegWit> <empreinte>
Dans la version 0 de SegWit (la seule qui existe pour le moment), lâempreinte est affectĂ©e Ă une clĂ© publique ou Ă un script selon sa longueur : si elle est de 20 octets, elle est interprĂ©tĂ©e comme une empreinte de clĂ© publique ; si elle est de 32 octets, elle est interprĂ©tĂ©e comme une empreinte de script. Cette empreinte est aussi appelĂ©e « programme ».
Ce script est anyone-can-spend puisque le script de rÚglement suffit à déverrouiller la piÚce :
<script de rĂšglement>
Comme pour P2SH, la connaissance du script de rÚglement ne suffit pourtant pas à dépenser les fonds, car une nouvelle exception est ajoutée au code de façon à ce que les éléments de déverrouillage soient transférées dans le témoin. Dans Bitcoin Core, cette exception se traduit par :
// P2SH witness program
if (flags & SCRIPT_VERIFY_WITNESS) {
...
}
SegWit a ainsi apportĂ© un nouveau lot de complexitĂ©, et notamment un deuxiĂšme niveau de rĂ©cursion. Dans le cas du schĂ©ma P2SH-P2WSH, on a en effet une sĂ©rie de 3 scripts imbriquĂ©s. Le premier script est le script de dĂ©verrouillage que lâon a prĂ©sentĂ© au dĂ©but de cet article :
HASH160 <empreinte du script de rĂšglement> EQUAL
Le deuxiÚme script est le script de rÚglement spécifique à P2SH :
<version SegWit> <empreinte du script SegWit>
Le troisiĂšme est le script SegWit, indiquĂ© dans le tĂ©moin avec les Ă©lĂ©ments de dĂ©verrouillage au moment de la dĂ©pense des fonds. Par exemple, il peut sâagir dâun script de multisignature comme vu prĂ©cĂ©demment :
2 <clé publique 1> <clé publique 2> 2 CHECKMULTISIG
quâon complĂšte avec les Ă©lĂ©ments :
0 <signature 1> <signature 2>
Â
Pay to Script Hash (P2SH) est donc une maniĂšre imparfaite mais trĂšs pratique de permettre aux utilisateurs de payer Ă lâempreinte dâun script, câest-Ă -dire Ă une adresse simple qui correspond Ă un script. La rĂ©cursion qui intervient dans lâexĂ©cution du script aurait pu ĂȘtre implĂ©mentĂ©e de maniĂšre plus Ă©lĂ©gante grĂące au code opĂ©ration OP_EVAL, mais ce dernier a Ă©tĂ© jugĂ© trop dangereux par la communautĂ© pour voir le jour.
En ajoutant une nouvelle exception au protocole pour ĂȘtre exĂ©cutĂ©, le schĂ©ma P2SH reprĂ©sente un vecteur de complexitĂ©. De plus, cette complexitĂ© est dĂ©multipliĂ©e par lâincorporation de SegWit, qui ajoute de nouvelles exceptions rigides Ă P2SH et qui finit de dĂ©tourner complĂštement le fonctionnement originel du systĂšme de script de Bitcoin.
NĂ©anmoins, ce qui est fait est fait, et aujourdâhui ces changements commencent Ă ĂȘtre connus dans lâĂ©cosystĂšme, et on peut donc espĂ©rer que cette complexitĂ© nâimpacte pas trop les nouveaux dĂ©veloppeurs. En particulier, le schĂ©ma P2SH est rĂ©pandu dans tout lâĂ©cosystĂšme, par les protocoles associĂ©s Ă Bitcoin tel que Bitcoin Cash, Litecoin ou Dash. Seuls les dĂ©veloppeurs de Bitcoin SV ont se sont opposĂ©s Ă cette particularitĂ© de maniĂšre catĂ©gorique et ont choisi de dĂ©sactiver P2SH en fĂ©vrier 2020.
Ce quâil faut retenir de tout ceci, câest que Bitcoin, au-delĂ de son aspect technique, est un systĂšme Ă©conomique et social. Il Ă©volue selon les exigences de ses utilisateurs, si bien quâil est impossible de le comprendre sans apprĂ©hender les dynamiques sous-jacentes qui ont Ă©tĂ© Ă lâĆuvre dans le passĂ©.
Â
Gavin Andresen, BIP-11 (M-of-N Standard Transactions), 18 octobre 2011.
Gavin Andresen, BIP-12 (OP_EVAL), 18 octobre 2011.
Gavin Andresen, BIP-16 (Pay to Script Hash), 3 janvier 2012.
Mike Hearn, On consensus and forks, 12 août 2015.
Eric Lombrozo, Johnson Lau et Pieter Wuille, BIP-141 (Segregated Witness), 21 décembre 2015.