Utiliser le protocole brut Bitcoin – crypto investissement

Carte de paiement Crypto

Demandez votre Carte de paiement Crypto ici

Recevez 8 € de BTC gratuitement

Inscrivez-vous à CoinBase









Actualité btc


Toute l'attention médiatique récente sur Bitcoin m'a inspiré pour apprendre comment fonctionne réellement Bitcoin, jusqu'aux octets circulant sur le réseau.
Les gens normaux utilisent un logiciel[1] cela cache ce qui se passe réellement, mais je voulais acquérir une compréhension pratique du protocole Bitcoin.
Mon objectif était d'utiliser le système Bitcoin directement: créez une transaction Bitcoin manuellement, insérez-la dans le système sous forme de données hexadécimales et voyez comment elle est traitée.
Cela s’est avéré considérablement plus difficile que prévu, mais j’ai beaucoup appris au cours du processus et j’espère que vous le trouverez intéressant.

(23 février: J'ai un nouvel article qui couvre les détails techniques de l'exploitation minière. Si vous aimez cet article, consultez aussi mon article sur l'exploitation minière.)

Cet article de blog commence par un aperçu rapide de Bitcoin, puis passe aux détails de bas niveau: créer une adresse Bitcoin, effectuer une transaction, signer la transaction, alimenter la transaction dans le réseau d'égal à égal et observer les résultats.

Un aperçu rapide de Bitcoin

Je vais commencer par un bref aperçu du fonctionnement de Bitcoin.[2],
avant de plonger dans les détails.
Bitcoin est une monnaie numérique relativement nouvelle[3] qui peuvent être transmis sur Internet. Vous pouvez acheter des bitcoins[4] avec des dollars ou autre monnaie traditionnelle de sites tels que Coinbase ou MtGox[5], envoyez des bitcoins à d’autres personnes, achetez des objets avec eux à certains endroits et échangez des bitcoins en dollars.

Pour simplifier un peu, les bitcoins consistent en des entrées dans une base de données distribuée qui garde la trace de la propriété des bitcoins.
Contrairement à une banque, les bitcoins ne sont pas liés à des utilisateurs ou à des comptes. Au lieu de cela, les bitcoins appartiennent à un Bitcoin. adresse, par exemple 1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa.

Transactions Bitcoin

UNE transaction est le mécanisme pour dépenser des bitcoins. Dans une transaction, le propriétaire de certains bitcoins transfère la propriété à une nouvelle adresse.

Une innovation clé de Bitcoin est la façon dont les transactions sont enregistrées dans la base de données distribuée via exploitation minière.
Les transactions sont regroupées en blocs et, toutes les 10 minutes environ, un nouveau bloc de transactions est envoyé et fait désormais partie du journal des transactions. blockchain, qui indique que la transaction a été faite (plus ou moins) officielle.[6]
Le Bitcoin mining est le processus qui place les transactions dans un bloc, afin de s'assurer que tout le monde a une vue cohérente du journal des transactions.
Pour exploiter un bloc, les mineurs doivent trouver une solution extrêmement rare à un problème cryptographique (sinon inutile). La recherche de cette solution génère un bloc miné, qui devient une partie de la chaîne de blocs officielle.

L'exploitation est également le mécanisme par lequel les nouveaux bitcoins entrent dans le système.
Lorsqu'un bloc est exploité avec succès, de nouveaux bitcoins sont générés dans le bloc et versés au mineur. Cette prime minière est importante – actuellement, 25 bitcoins par bloc (environ 19 000 dollars). De plus, le mineur perçoit tous les frais associés aux transactions dans le bloc. De ce fait, l’exploitation minière est très compétitive et de nombreuses personnes tentent de miner des blocs.
La difficulté et la compétitivité de l'exploitation minière sont un élément clé de la sécurité Bitcoin, car elles garantissent que personne ne peut inonder le système de blocs défectueux.

Le réseau peer-to-peer

Il n'y a pas de serveur Bitcoin centralisé. Au lieu de cela, Bitcoin s'exécute sur un réseau d'égal à égal. Si vous exécutez un client Bitcoin, vous faites partie de ce réseau. Les nœuds du réseau échangent des transactions, des blocs et des adresses entre homologues.
Lorsque vous vous connectez au réseau pour la première fois, votre client télécharge la blockchain à partir d'un ou de plusieurs nœuds aléatoires. À son tour, votre client peut fournir des données à d'autres nœuds. Lorsque vous créez une transaction Bitcoin, vous l'envoyez à un homologue, qui l'envoie à d'autres homologues, et ainsi de suite, jusqu'à ce qu'elle atteigne l'ensemble du réseau. Les mineurs récupèrent votre transaction, génèrent un bloc miné contenant votre transaction et l'envoient à des homologues. Finalement, votre client recevra le blocage et votre client indiquera que la transaction a été traitée.

Cryptographie

Bitcoin utilise des signatures numériques pour garantir que seul le propriétaire des bitcoins puisse les dépenser. Le propriétaire d'une adresse Bitcoin a la clé privée associée à l'adresse. Pour dépenser des bitcoins, ils signent la transaction avec cette clé privée, ce qui prouve qu'ils en sont le propriétaire. (C'est un peu comme signer un chèque physique pour le rendre valide.) Une clé publique est associée à chaque adresse Bitcoin, et tout le monde peut l'utiliser pour vérifier la signature numérique.

Les blocs et les transactions sont identifiés par un hachage cryptographique de 256 bits de leur contenu. Cette valeur de hachage est utilisée à plusieurs endroits dans le protocole Bitcoin. En outre, il est difficile de trouver un hachage spécial pour extraire un bloc.

Pièce statistique Bitcoin ANTANA

Plonger dans le protocole brut Bitcoin

Le reste de cet article explique, étape par étape, comment j'ai utilisé le protocole brut Bitcoin.
J'ai d'abord généré une adresse Bitcoin et des clés. Ensuite, j'ai effectué une transaction pour déplacer une petite quantité de bitcoins à cette adresse. Signer cette transaction m'a pris beaucoup de temps et de difficulté. Enfin, j'ai transféré cette transaction dans le réseau peer-to-peer Bitcoin et j'ai attendu qu'elle soit minée.
Le reste de cet article décrit ces étapes en détail.

Il s'avère que l'utilisation du protocole Bitcoin est plus difficile que prévu. Comme vous le verrez, le protocole est un peu un fouillis: il utilise des nombres big-endian, des nombres little-endian, des nombres à longueur fixe, des nombres à longueur variable, des codages personnalisés, un codage DER et une variété d’algorithmes cryptographiques. arbitrairement. En conséquence, il y a beaucoup de manipulations ennuyeuses pour obtenir des données dans le bon format.[7]

La seconde complication liée à l’utilisation directe du protocole est que, étant cryptographique, il est très impitoyable. Si vous vous trompez d'un octet, la transaction est rejetée sans indiquer le problème.[8]

La dernière difficulté que j'ai rencontrée est que le processus de signature d'une transaction est beaucoup plus difficile que nécessaire, avec de nombreux détails à corriger. En particulier, la version d'une transaction signée est très différente de la version réellement utilisée.

Adresses et clés Bitcoin

Ma première étape a été de créer une adresse Bitcoin. Normalement, vous utilisez le logiciel client Bitcoin pour créer une adresse et les clés associées. Cependant, j'ai écrit du code Python pour créer l'adresse, montrant exactement ce qui se passe dans les coulisses.

Bitcoin utilise une variété de clés et d’adresses, le diagramme suivant peut donc vous aider à les expliquer. Vous commencez par créer une clé privée aléatoire de 256 bits. La clé privée est nécessaire pour signer une transaction et ainsi transférer (dépenser) des bitcoins. Ainsi, la clé privée doit être gardée secrète, sinon vos bitcoins peuvent être volés.

L'algorithme DSA à courbe elliptique génère une clé publique de 512 bits à partir de la clé privée. (La cryptographie à courbe elliptique sera discutée plus tard.) Cette clé publique est utilisée pour vérifier la signature d'une transaction. De manière gênante, le protocole Bitcoin ajoute un préfixe 04 à la clé publique. La clé publique n'est révélée qu'une fois la transaction signée, contrairement à la plupart des systèmes où la clé publique est rendue publique.

Comment les clés et les adresses bitcoin sont liées

Comment les clés et les adresses bitcoin sont liées

L'étape suivante consiste à générer l'adresse Bitcoin partagée avec les autres.
Etant donné que la clé publique de 512 bits est trop grande, elle est réduite à 160 bits à l’aide des algorithmes de hachage SHA-256 et RIPEMD.[9] La clé est ensuite codée en ASCII à l'aide du codage Base58Check personnalisé de Bitcoin.[10] L'adresse résultante, telle que 1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa, est l’adresse que les gens publient afin de recevoir des bitcoins. Notez que vous ne pouvez pas déterminer la clé publique ou la clé privée à partir de l'adresse. Si vous perdez votre clé privée (par exemple en jetant votre disque dur), vos bitcoins sont perdus pour toujours.

Enfin, la clé WIF (Wallet Interchange Format) sert à ajouter une clé privée au logiciel de votre portefeuille client. Il s’agit simplement d’un codage Base58Check de la clé privée en ASCII, qui est facilement inversé pour obtenir la clé privée de 256 bits. (J'étais curieux de savoir si quelqu'un utiliserait la clé privée ci-dessus pour voler mes 80 centimes de bitcoins, et bien sûr, quelqu'un l'a fait.)

Pour résumer, il existe trois types de clés: la clé privée, la clé publique et le hachage de la clé publique. Elles sont représentées de manière externe en ASCII à l'aide du codage Base58Check. La clé privée est la clé importante, car il est nécessaire d'accéder aux bitcoins et les autres clés peuvent être générées à partir de celle-ci. La clé publique hash est l'adresse Bitcoin que vous voyez publiée.

J'ai utilisé l'extrait de code suivant[11] générer une clé privée au format WIF et une adresse. La clé privée est simplement un nombre aléatoire de 256 bits. La bibliothèque de chiffrement ECDSA génère la clé publique à partir de la clé privée.[12] L'adresse Bitcoin est générée par le hachage SHA-256, le hachage RIPEMD-160, puis l'encodage Base58 avec somme de contrôle. Enfin, la clé privée est codée dans Base58Check pour générer le codage WIF utilisé pour entrer une clé privée dans le logiciel client Bitcoin.[1] Remarque: cette fonction aléatoire Python n’est pas cryptographiquement puissante; utilisez une meilleure fonction si vous le faites réellement.

À l'intérieur d'une transaction

UNE transaction est l'opération de base dans le système Bitcoin.
Vous pourriez vous attendre à ce qu'une transaction déplace simplement des bitcoins d'une adresse à une autre, mais c'est plus compliqué que cela.
Une transaction Bitcoin déplace des bitcoins entre un ou plusieurs contributions et les sorties. Chaque entrée est une transaction et une adresse fournissant des bitcoins. Chaque sortie est une adresse recevant bitcoin, ainsi que la quantité de bitcoins allant à cette adresse.

Un exemple de transaction Bitcoin. La transaction C dépense 0,008 bitcoins des transactions A et B.

Un exemple de transaction Bitcoin. La transaction C dépense 0,008 bitcoins des transactions A et B.

Le diagramme ci-dessus montre un exemple de transaction "C". Dans cette transaction, 0,005 BTC provient d'une adresse de la transaction A et 0,003 BTC d'une adresse de la transaction B. (Notez que les flèches sont des références aux sorties précédentes et sont donc inversées dans le flux de bitcoins.) Pour les sorties, 0,003 BTC sont dirigés vers la première adresse et 0,004 BTC vers la deuxième adresse. Les 0,001 BTC restants sont versés au mineur du bloc. Notez que le .015 BTC dans l'autre sortie de la transaction A n'est pas dépensé dans cette transaction.

Chaque entrée utilisée doit être entièrement dépensée dans une transaction. Si une adresse a reçu 100 bitcoins dans une transaction et que vous souhaitez simplement dépenser 1 bitcoin, la transaction doit dépenser la totalité des 100. La solution consiste à utiliser une deuxième sortie pour changement, qui vous restitue les 99 bitcoins restants.

Les transactions peuvent également inclure honoraires. S'il reste des bitcoins après avoir additionné les entrées et soustrait les sorties, le reste est une redevance versée au mineur.
Les frais ne sont pas strictement nécessaires, mais les transactions sans frais seront une priorité mineure pour les mineurs et pourraient ne pas être traitées pendant plusieurs jours ou être entièrement supprimées.[13]
Les frais typiques pour une transaction sont de 0,0002 bitcoins (environ 20 cents), les frais sont donc faibles mais non négligeables.

Créer manuellement une transaction

Pour mon expérience, j'ai utilisé une transaction simple avec une entrée et une sortie, illustrée ci-dessous.
J'ai commencé par copier des bitcoins de Coinbase et mettre 0,00101234 bitcoins en adresse 1MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5, qui était transaction 81b4c832 .... Mon but était de créer une transaction pour transférer ces bitcoins à l'adresse que j'ai créée ci-dessus,
1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFaen soustrayant des frais de 0,0001 bitcoins. Ainsi, l'adresse de destination recevra 0,00091234 bitcoins.

Structure de l'exemple de transaction Bitcoin.

Structure de l'exemple de transaction Bitcoin.

Suivant la spécification, la transaction non signée peut être assemblée assez facilement, comme indiqué ci-dessous. Une entrée utilise la sortie 0 (la première sortie) de la transaction. 81b4c832 .... Notez que ce hachage de transaction est inversé de manière inopportune dans la transaction. Le montant en sortie est 0,00091234 bitcoins (91234 est 0x016462 en hex), qui est stocké dans le champ de valeur sous forme little-endian. Les parties cryptographiques – scriptSig et scriptPubKey – sont plus complexes et seront discutés plus tard.

version 01 00 00 00
nombre d'entrées 01
contribution hash de sortie précédent
(renversé)
48 4d 40 d4 5b 9e a0 d6 52 fc a8 25 8a b7 ca a4 25 41 eb 52 97 58 57 f9 6f b5 0c d7 32 c8 b4 81
indice de sortie précédent 00 00 00 00
longueur du script
scriptSig script contenant la signature
séquence ff ff ff ff
nombre de sorties 01
sortie valeur 62 64 01 00 00 00 00 00
longueur du script
scriptPubKey script contenant l'adresse de destination
blocage du temps 00 00 00 00

Voici le code que j'ai utilisé pour générer cette transaction non signée. C'est juste une question de compression des données en binaire. La signature de la transaction est la partie difficile, comme vous le verrez ensuite.

Comment les transactions Bitcoin sont signées

Le diagramme suivant donne une vue simplifiée de la manière dont les transactions sont signées et liées entre elles.[14] Considérons la transaction intermédiaire, le transfert de bitcoins de l'adresse B à l'adresse C. Le contenu de la transaction (y compris le hachage de la transaction précédente) est haché et signé avec la clé privée de B. De plus, la clé publique de B est incluse dans la transaction.

En exécutant plusieurs étapes, tout le monde peut vérifier que la transaction est autorisée par B. Premièrement, la clé publique de B doit correspondre à l'adresse de B dans la transaction précédente, ce qui prouve que la clé publique est valide. (L'adresse peut facilement être déduite de la clé publique, comme expliqué précédemment.) Ensuite, la signature de la transaction par B peut être vérifiée à l'aide de la clé publique de B dans la transaction. Ces étapes garantissent que la transaction est valide et autorisée par B. Un élément inattendu de Bitcoin est que la clé publique de B n'est pas rendue publique tant qu'elle n'est pas utilisée dans une transaction.

Avec ce système, les bitcoins sont transmis d’adresse en adresse via une chaîne de transactions. Chaque étape de la chaîne peut être vérifiée pour s'assurer que les bitcoins sont dépensés de manière valide. Notez que les transactions peuvent avoir plusieurs entrées et sorties en général, ainsi la chaîne se divise en une arborescence.

Comment les transactions Bitcoin sont enchaînées.

Comment les transactions Bitcoin sont enchaînées.[14]

Le langage de script Bitcoin

Vous pouvez vous attendre à ce qu'une transaction Bitcoin soit signée simplement en incluant la signature dans la transaction, mais le processus est beaucoup plus compliqué.
En fait, chaque transaction comporte un petit programme qui est exécuté pour décider si une transaction est valide.
Ce programme est écrit en Scénario, le langage de script Bitcoin basé sur la pile. Les conditions de rachat complexes peuvent être exprimées dans cette langue. Par exemple, un système d'entiercement peut obliger deux utilisateurs spécifiques sur trois à signer la transaction pour la dépenser. Ou différents types de contrats peuvent être mis en place.[15]

Le langage de script est étonnamment complexe, avec environ 80 opcodes différents. Il comprend l'arithmétique, les opérations au niveau des bits, les opérations sur les chaînes, les conditions et la manipulation de la pile. Le langage inclut également les opérations cryptographiques nécessaires (SHA-256, RIPEMD, etc.) sous forme de primitives. Afin de garantir la fin des scripts, le langage ne contient aucune opération de bouclage. (En conséquence, il ne s'agit pas de Turing-complete.) En pratique, toutefois, seuls quelques types de transactions sont pris en charge.[16]

Pour qu'une transaction Bitcoin soit valide, les deux parties du script de rachat doivent être exécutées avec succès.
Le script de l'ancienne transaction s'appelle scriptPubKey et le script dans la nouvelle transaction s'appelle scriptSig.
Pour vérifier une transaction, le scriptSig exécuté suivi de la scriptPubKey.
Si le script se termine avec succès, la transaction est valide et le bitcoin peut être utilisé. Sinon, la transaction est invalide. L'intérêt de ceci est que le scriptPubKey de l'ancienne transaction définit les conditions de dépense des bitcoins. Le scriptSig dans la nouvelle transaction doit fournir les données pour satisfaire les conditions.

Dans une transaction standard, le scriptSig pousse la signature (générée à partir de la clé privée) dans la pile, suivie de la clé publique. Ensuite, le scriptPubKey (à partir de la transaction source) est exécuté pour vérifier la clé publique, puis la signature.

Comme indiqué dans Script, le scriptSig est:

PUSHDATA
données de signature et SIGHASH_ALL
PUSHDATA
données de clé publique

Le scriptPubKey est:

OP_DUP
OP_HASH160
PUSHDATA
Adresse Bitcoin (hash de la clé publique)
OP_EQUALVERIFY
OP_CHECKSIG

Lorsque ce code est exécuté, PUSHDATA envoie d'abord la signature à la pile. Le prochain PUSHDATA pousse la clé publique dans la pile. Ensuite, OP_DUP duplique la clé publique de la pile. OP_HASH160 calcule le hachage de 160 bits de la clé publique. PUSHDATA envoie l'adresse Bitcoin requise. Ensuite, OP_EQUALVERIFY vérifie que les deux premières valeurs de pile sont égales – que le hachage de la clé publique de la nouvelle transaction correspond à l'adresse de l'ancienne adresse. Cela prouve que la clé publique est valide. Ensuite, OP_CHECKSIG vérifie que la signature de la transaction correspond à la clé publique et à la signature de la pile. Cela prouve que la signature est valide.

Signature de la transaction

J'ai trouvé la signature de la transaction comme la partie la plus difficile de l'utilisation manuelle de Bitcoin, avec un processus étonnamment difficile et sujet aux erreurs.
L'idée de base est d'utiliser l'algorithme de courbe elliptique ECDSA et la clé privée pour générer une signature numérique de la transaction, mais les détails sont délicats.
Le processus de signature a été décrit à travers un
Processus en 19 étapes (plus d'informations).
Cliquez sur la vignette ci-dessous pour afficher un diagramme détaillé du processus.


La plus grande complication est la signature apparaît au milieu de la transaction, ce qui soulève la question de savoir comment signer la transaction avant d'avoir la signature.
Pour éviter ce problème,
la scriptPubKey Le script est copié de la transaction source dans la transaction de dépense (c'est-à-dire la transaction en cours de signature) avant le calcul de la signature. Ensuite, la signature est transformée en code dans le langage de script, créant le scriptSig script intégré à la transaction. Il semble que l’utilisation de la transaction précédente scriptPubKey lors de la signature est pour des raisons historiques plutôt que pour toute raison logique.[17]
Pour les transactions avec plusieurs entrées, la signature est encore plus compliquée, car chaque entrée nécessite une signature séparée, mais je n’entrerai pas dans les détails.

Une étape qui m'a fait trébucher est la type de hachage.
Avant de signer, une transaction de type hash est ajoutée temporairement à la transaction. Pour une transaction normale, il s'agit de SIGHASH_ALL (0x00000001). Après la signature, ce type de hachage est supprimé de la fin de la transaction et ajouté au scriptSig.

Un autre inconvénient du protocole Bitcoin est que la signature et la clé publique sont des valeurs de courbes elliptiques de 512 bits, mais elles sont représentées de manière totalement différente: la signature est codée avec le codage DER mais la clé publique est représentée sous forme d'octets simples. De plus, les deux valeurs ont un octet supplémentaire, mais sont positionnées de manière incohérente: SIGHASH_ALL est placé après la signature et le type 04 avant la clé publique.

Le débogage de la signature a été rendu plus difficile car l'algorithme ECDSA utilise un nombre aléatoire.[18] Ainsi, la signature est différente à chaque fois que vous la calculez, elle ne peut donc pas être comparée à une signature connue comme étant de bonne qualité.

Mise à jour (février 2014): Un effet secondaire important de la signature qui change à chaque fois est que si vous renouvelez la signature d'une transaction, le hachage de la transaction changera. Ceci est connu sous le nom de Transaction Malleability. Il existe également des moyens permettant à des tiers de modifier des transactions de manière triviale, ce qui modifie le hachage mais pas le sens de la transaction. Bien qu’elle soit connue depuis des années, la malléabilité a récemment posé de gros problèmes (février 2014) avec MtGox (communiqué de presse).

Avec ces complications, il m'a fallu beaucoup de temps pour que la signature fonctionne.
Finalement, cependant, j'ai éliminé tous les bogues de mon code de signature et signé avec succès une transaction. Voici l'extrait de code que j'ai utilisé.

Le script final contient la signature ainsi que la clé publique de l’adresse source (1MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5). Cela prouve que je suis autorisé à dépenser ces bitcoins, ce qui rend la transaction valide.

PUSHDATA 47 47
Signature
(DER)
séquence 30
longueur 44
entier 02
longueur 20
X 2c b2 65 bf 10 70 7b f4 93 46 c3 51 5d d3 d1 6f c4 54 61 8c 58 ec 0a 0f f4 48 a6 76 c5 4f f7 13
entier 02
longueur 20
Y

6c 66 24 j7 62 a1 fc ef 46 18 28 4e ad 8f 08 67 8a c0 5b 13 c8 42 35 f1 65 4e 6a d1 68 23 3e 82

SIGHASH_ALL 01
PUSHDATA 41 41
Clé publique type 04
X 14 e3 01 b2 32 8f 17 44 2c 0b 83 10 j7 87 bf 3d 8a 40 4c fb d0 70 4f 13 5b 6a d4 b2 d3 ee 75 13
Y 10 f9 81 92 6e 53 a6 e8 c3 9b d7 d3 fe fd 57 6c 54 3c ce 49 3c ba c0 63 88 f2 65 1d 1a ac bf cd

Le script final ScriptPubKey contient le script qui doit réussir pour dépenser les bitcoins. Notez que ce script est exécuté à un moment arbitraire dans le futur lorsque les bitcoins sont dépensés.
Il contient l'adresse de destination
(1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa) exprimée en hexa et non en base58Check. En conséquence, seul le propriétaire de la clé privée associée à cette adresse peut utiliser les bitcoins. Cette adresse est donc le propriétaire.

OP_DUP 76
OP_HASH160 a9
PUSHDATA 14 14
clé de hachage publique c8 e9 09 96 c7 c6 08 0e e0 62 84 60 0c 68 4e d9 04 d1 4c 5c
OP_EQUALVERIFY 88
OP_CHECKSIG ac

La transaction finale

Une fois que toutes les méthodes nécessaires sont en place, la transaction finale peut être assemblée.

La transaction finale est indiquée ci-dessous. Ceci associe le scriptSig et le scriptPubKey ci-dessus à la transaction non signée décrite précédemment.

version 01 00 00 00
nombre d'entrées 01
contribution hash de sortie précédent
(renversé)
48 4d 40 d4 5b 9e a0 d6 52 fc a8 25 8a b7 ca a4 25 41 eb 52 97 58 57 f9 6f b5 0c d7 32 c8 b4 81
indice de sortie précédent 00 00 00 00
longueur du script 8a
scriptSig 47 30 44 02 20 2c b2 65 bf 10 70 7b f4 93 46 c3 51 5d d3 d1 6f c4 54 61 8c 58 ec 0a de f4 48 a6 76 c5 4f de7 13 02 20 6c 66 24 d7 62 a1 fc ef 46 18 28 4e ad 8f 08 67 8a c0 5b 13 c8 42 35 f1 65 4e 6a d1 68 23 3e 82 01 41 04 14 e3 01 b2 32 8f 17 44 2c 0b 133 10f7 87 bf 3d 8a 40 4c fb d0 70 4f 13 5b 6a d4 b2 d3 ee 75 13 10 f9 81 92 6e 53 a6 e8 c3 9b d7 d3 fe fd 57 6c 54 3c ce 49 3c ba c0 63 88 f2 65 1d 1a ac bf cd
séquence ff ff ff ff
nombre de sorties 01
sortie valeur 62 64 01 00 00 00 00 00
longueur du script 19
scriptPubKey 76 a9 14 c8 e9 09 96 c7 c6 08 0e e0 62 84 60 0c 68 4e d9 04 d1 4c 5c 88 ac
blocage du temps 00 00 00 00

Une tangente: comprendre les courbes elliptiques

Bitcoin utilise des courbes elliptiques dans le cadre de l'algorithme de signature. J'avais déjà entendu parler des courbes elliptiques dans le cadre de la résolution du dernier théorème de Fermat, alors j'étais curieux de savoir ce qu'elles sont.
La mathématique des courbes elliptiques est intéressante, je vais donc faire un détour et vous donner un rapide aperçu.

Le nom courbe elliptique est déroutant: les courbes elliptiques ne sont pas des ellipses, ne ressemblent en rien à des ellipses et ont très peu à voir avec les ellipses.
Une courbe elliptique est une courbe satisfaisant l'équation assez simple y ^ 2 = x ^ 3 + ax + b.
Bitcoin utilise une courbe elliptique spécifique appelée secp256k1 avec l’équation simple y ^ 2 = x ^ 3 + 7.
[25]

Formule à courbe elliptique utilisée par Bitcoin.

Formule à courbe elliptique utilisée par Bitcoin.

Une propriété importante des courbes elliptiques est que vous pouvez définir l'addition de points sur la courbe avec une règle simple: si vous tracez une ligne droite sur la courbe et qu'elle frappe trois points A, B et C, l'ajout est défini par A +. B + C = 0. En raison de la nature particulière des courbes elliptiques, l’addition définie de cette façon fonctionne "normalement" et forme un groupe. Une fois l’ajout défini, vous pouvez définir la multiplication d’entiers: par ex. 4A = A + A + A + A.

Ce qui rend les courbes elliptiques utiles en cryptographie, c’est la rapidité avec laquelle il est possible de multiplier des nombres entiers, mais la division nécessite essentiellement de la force brute. Par exemple, vous pouvez calculer un produit tel que 12345678 * A = Q très rapidement (en calculant une puissance de 2), mais si vous ne connaissez que A et Q, la résolution de n * A = Q est difficile. Dans la cryptographie à courbe elliptique, le nombre secret 12345678 serait la clé privée et le point Q de la courbe serait la clé publique.

En cryptographie, au lieu d'utiliser des points de valeur réelle sur la courbe, les coordonnées sont des entiers modulo a prime.[19] Une des propriétés surprenantes des courbes elliptiques réside dans le fait que les calculs fonctionnent de manière pratiquement identique, que vous utilisiez des nombres réels ou une arithmétique modulo.
Pour cette raison, la courbe elliptique de Bitcoin ne ressemble pas à l'image ci-dessus, mais est un désordre aléatoire de points 256 bits (imaginez un grand carré gris de points).

L'algorithme ECDSA (Elliptic Curve Digital Signature Algorithm) prend un hachage de message, puis effectue une arithmétique simple de la courbe elliptique à l'aide du message, de la clé privée et d'un nombre aléatoire.[18] générer un nouveau point sur la courbe qui donne une signature. Toute personne disposant de la clé publique, du message et de la signature peut effectuer un calcul arithmétique simple de courbe elliptique pour vérifier que la signature est valide. Ainsi, seule la personne avec la clé privée peut signer un message, mais toute personne possédant la clé publique peut vérifier le message.

Pour plus d'informations sur les courbes elliptiques, voir les références[20].

Envoi de ma transaction dans le réseau peer-to-peer

Laissant des courbes elliptiques derrière, à ce stade, j'ai créé une transaction et l'ai signée. L'étape suivante consiste à l'envoyer au réseau peer-to-peer, où il sera récupéré par les mineurs et intégré dans un bloc.

Comment trouver des pairs

La première étape pour utiliser le réseau d'égal à égal consiste à rechercher un homologue.
La liste des pairs change toutes les quelques secondes, chaque fois que quelqu'un exécute un client.
Une fois qu'un nœud est connecté à un nœud homologue, ils partagent de nouveaux homologues en échangeant addr messages chaque fois qu'un nouveau pair est découvert. Ainsi, de nouveaux pairs se sont rapidement répandus dans le système.

Il y a cependant un problème d'œuf et de poule concernant la recherche du premier pair. Les clients Bitcoin résolvent ce problème avec plusieurs méthodes. Plusieurs pairs fiables sont enregistrés dans le DNS sous le nom bitseed.xf2.org. En effectuant une recherche nslookup, un client obtient les adresses IP de ces pairs et, espérons-le, l'un d'entre eux fonctionnera.
Si cela ne fonctionne pas, une liste de départ de pairs est codée en dur dans le client.
[26]

nslookup peut être utilisé pour trouver des pairs Bitcoin.

nslookup peut être utilisé pour trouver des pairs Bitcoin.

Les pairs entrent et sortent du réseau lorsque des utilisateurs ordinaires démarrent et arrêtent des clients Bitcoin. Il y a donc beaucoup de roulement chez les clients. Il est peu probable que les clients que j'utilise soient opérationnels à l'heure actuelle. Vous devrez donc trouver de nouveaux pairs si vous souhaitez effectuer des expériences. Vous devrez peut-être essayer plusieurs solutions pour en trouver une qui fonctionne.

Parler à ses pairs

Une fois que j'avais l'adresse d'un homologue actif, l'étape suivante consistait à envoyer ma transaction dans le réseau homologue à homologue.[8] L'utilisation du protocole peer-to-peer est assez simple. J'ai ouvert une connexion TCP à un homologue arbitraire sur le port 8333, commencé à envoyer des messages et reçu des messages à tour de rôle. Le protocole peer-to-peer Bitcoin est assez tolérant; les pairs continueraient à communiquer même si je faisais complètement foirer mes requêtes.

Remarque importante: comme l'ont fait remarquer quelques personnes, si vous souhaitez expérimenter, vous devez utiliser Bitcoin Testnet, qui vous permet d'expérimenter de "faux" bitcoins, car il est facile de perdre vos précieux bitcoins si vous vous trompez sur le réseau réel. (Par exemple, si vous oubliez l'adresse de changement dans une transaction, les bitcoins en excédent iront aux mineurs à titre de frais.) Mais je pensais que j'utiliserais le véritable réseau Bitcoin et risquerais mon bitcoins d'une valeur de 1,00 USD.

Le protocole comprend environ 24 types de messages différents.
Chaque message est un blob binaire assez simple contenant un nom de commande ASCII et une charge utile binaire appropriée à la commande.
Le protocole est bien documenté sur le wiki Bitcoin.

La première étape lors de la connexion à un homologue consiste à établir la connexion en échangeant version messages.
D'abord j'envoie un version message avec mon numéro de version de protocole[21], adresse et quelques autres choses. Le pair envoie son version message en retour. Après cela, les nœuds sont supposés accuser réception du message de version avec verack message. (Comme je l'ai mentionné, le protocole est indulgent – tout fonctionne bien même si je saute le verack.)

Générer le version Le message n’est pas totalement trivial car il contient plusieurs champs, mais il peut être créé avec quelques lignes de Python. makeMessage ci-dessous crée un message arbitraire entre homologues à partir du numéro magique, du nom de la commande et de la charge utile. getVersionMessage crée la charge utile d'un version message en regroupant les différents domaines.

Envoi d'une transaction: tx

J'ai envoyé la transaction dans le réseau d'égal à égal avec le script Python simplifié ci-dessous. Le script envoie un version message, reçoit (et ignore) le correspondant version et verack messages, puis envoie la transaction en tant que tx message. La chaîne hexadécimale est la transaction que j'ai créée précédemment.

La capture d'écran suivante montre comment l'envoi de ma transaction apparaît dans le programme d'analyse de réseau Wireshark.[22]. J'ai écrit des scripts Python pour traiter le trafic réseau Bitcoin, mais pour simplifier les choses, je vais simplement utiliser Wireshark ici. Le type de message "tx" est visible dans le dump ASCII, suivi sur la ligne suivante par le début de ma transaction (01 00 …).

Une transaction téléchargée sur Bitcoin, comme dans Wireshark.

Une transaction téléchargée sur Bitcoin, comme dans Wireshark.

Pour surveiller les progrès de ma transaction, un socket a été ouvert sur un autre homologue aléatoire. Cinq secondes après l’envoi de ma transaction, l’autre homologue m’a envoyé un tx message avec le hachage de la transaction que je viens d'envoyer. Ainsi, il a suffi de quelques secondes pour que ma transaction soit transmise au moins une partie du réseau entre homologues.

Victoire: ma transaction est minée

Après avoir envoyé ma transaction dans le réseau d'égal à égal, je devais attendre qu'elle soit exploitée avant de pouvoir prétendre à la victoire.
Dix minutes plus tard, mon script a reçu un inv message avec un nouveau bloc (voir la trace de Wireshark ci-dessous).
Vérifier ce bloc a montré qu'il contenait ma transaction, prouvant que ma transaction a fonctionné.
Je pourrais également vérifier le succès de cette transaction en consultant mon portefeuille Bitcoin et en vérifiant en ligne.
Ainsi, après beaucoup d'efforts, j'avais réussi à créer une transaction manuellement et à la faire accepter par le système. (Inutile de dire que mes premières tentatives de transaction n'ont pas abouti – mes transactions défectueuses ont disparu du réseau, pour ne plus jamais être revues.[8])

Un nouveau bloc dans Bitcoin, comme dans Wireshark.

Un nouveau bloc dans Bitcoin, comme dans Wireshark.

Ma transaction a été extraite par le grand pool minier GHash.IO, dans un bloc
# 279068 avec hachage 0000000000000001a27b1d6eb8c405410398ece796e742da3b3e35363c2219ee. (Le hash est inversé dans inv message ci-dessus: ee19 …) Notez que le hachage commence par un grand nombre de zéros – trouver une valeur aussi littérale que celle d'un quintillion est ce qui rend l'exploitation minière si difficile. Ce bloc contient 462 transactions, dont ma transaction n’est que l’une.

Pour l'extraction de ce bloc, les mineurs ont reçu la récompense de 25 bitcoins et des frais totaux de 0,104 bitcoins, soit environ 19 000 $ et 80 $ respectivement. J'ai payé des frais de 0,0001 bitcoins, environ 8 cents ou 10% de ma transaction.
Le processus d'extraction est très intéressant, mais je le laisserai pour un prochain article.

Untitled "height =" 240 "src =" http://farm4.staticflickr.com/3780/9305154893_e1b7925728_n.jpg "width =" 320

L’exploitation de bitcoins utilise normalement du matériel ASIC spécial, conçu pour calculer les hachages à grande vitesse.
 Crédit photo: Gastev, CC: par

Conclusion

L’utilisation du protocole Bitcoin brut s’est avérée plus difficile que prévu, mais j’ai beaucoup appris sur les bitcoins en cours de route, et j’espère que vous aussi.
My code is purely for demonstration – if you actually want to use bitcoins through Python, use a real library[24] rather than my code.

Notes and references

[1]

The original Bitcoin client is Bitcoin-qt. In case you're wondering why qt, the client uses the common Qt UI framework. Alternatively you can use wallet software that doesn't participate in the peer-to-peer network, such as Electrum or MultiBit. Or you can use an online wallet such as Blockchain.info.

[2]

A couple good articles on Bitcoin are How it works and the very thorough How the Bitcoin protocol actually works.

[3]

The original Bitcoin paper is Bitcoin: A Peer-to-Peer Electronic Cash System written by the pseudonymous Satoshi Nakamoto in 2008. The true identity of Satoshi Nakamoto is unknown, although there are many theories.

[4]

You may have noticed that sometimes Bitcoin is capitalized and sometimes not. It's not a problem with my shift key – the "official" style is to capitalize Bitcoin when referring to the system, and lower-case bitcoins when referring to the currency units.

[5]

In case you're wondering how the popular MtGox Bitcoin exchange got its name, it was originally a trading card exchange called "Magic: The Gathering Online Exchange" and later took the acronym as its name.

[6]

For more information on what data is in the blockchain, see the very helpful article Bitcoin, litecoin, dogecoin: How to explore the block chain.

[7]

I'm not the only one who finds the Bitcoin transaction format inconvenient. For a rant on how messed up it is, see Criticisms of Bitcoin's raw txn format.

[8]

You can also generate transaction and send raw transactions into the Bitcoin network using the bitcoin-qt console. Type sendrawtransaction a1b2c3d4…. This has the advantage of providing information in the debug log if the transaction is rejected. If you just want to experiment with the Bitcoin network, this is much, much easier than my manual approach.

[9]

Apparently there's no solid reason to use RIPEMD-160 hashing to create the address and SHA-256 hashing elsewhere, beyond a vague sense that using a different hash algorithm helps security.
See discussion. Using one round of SHA-256 is subject to a length extension attack, which explains why double-hashing is used.

[10]

The Base58Check algorithm is documented on the Bitcoin wiki. It is similar to base 64 encoding, except it omits the O, 0, I, and l characters to avoid ambiguity in printed text. A 4-byte checksum guards against errors, since using an erroneous bitcoin address will cause the bitcoins to be lost forever.

[11]

Some boilerplate has been removed from the code snippets. For the full Python code, see my repository shirriff/bitcoin-code on GitHub. You will also need the ecdsa cryptography library.

[12]

You may wonder how I ended up with addresses with nonrandom prefixes such as 1MMMM. The answer is brute force – I ran the address generation script overnight and collected some good addresses. (These addresses made it much easier to recognize my transactions in my testing.) There are scripts and websites that will generate these "vanity" addresses for you.

[13]

For a summary of Bitcoin fees, see bitcoinfees.com.
This recent Reddit discussion of fees is also interesting.

[14]

The original Bitcoin paper has a similar figure showing how transactions are chained together. I find it very confusing though, since it doesn't distinguish between the address and the public key.

[15]

For details on the different types of contracts that can be set up with Bitcoin, see Contracts. One interesting type is the 2-of-3 escrow transaction, where two out of three parties must sign the transaction to release the bitcoins. Bitrated is one site that provides these.

[16]

Although Bitcoin's Script language is very flexible, the Bitcoin network only permits a few standard transaction types and non-standard transactions are not propagated (details). Some miners will accept non-standard transactions directly, though.

[17]

There isn't a security benefit from copying the scriptPubKey into the spending transaction before signing since the hash of the original transaction is included in the spending transaction. For discussion, see Why TxPrev.PkScript is inserted into TxCopy during signature check?

[18]

The random number used in the elliptic curve signature algorithm is critical to the security of signing. Sony used a constant instead of a random number in the PlayStation 3, allowing the private key to be determined. In an incident related to Bitcoin, a weakness in the random number generator allowed bitcoins to be stolen from Android clients.

[19]

For Bitcoin, the coordinates on the elliptic curve are integers modulo the prime2^256 – 2^32 – 2^9 -2^8 – 2^7 – 2^6 -2^4 -1, which is very nearly 2^256. This is why the keys in Bitcoin are 256-bit keys.

[20]

For information on the historical connection between elliptic curves and ellipses (the equation turns up when integrating to compute the arc length of an ellipse) see the interesting article Why Ellipses Are Not Elliptic Curves, Adrian Rice and Ezra Brown, Mathematics Magazine, vol. 85, 2012, pp. 163-176.
For more introductory information on elliptic curve cryptography, see ECC tutorial or A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography.
For more on the mathematics of elliptic curves, see
An Introduction to the
Theory of Elliptic Curves
by Joseph H. Silverman.
Three Fermat trails to elliptic curves includes a discussion of how Fermat's Last Theorem was solved with elliptic curves.

[21]

There doesn't seem to be documentation on the different Bitcoin protocol versions other than the code. I'm using version 60002 somewhat arbitrarily.

[22]

The Wireshark network analysis software can dump out most types of Bitcoin packets, but only if you download a recent "beta release – I'm using version 1.11.2.

[24]

Several Bitcoin libraries in Python are
bitcoin-python, pycoin, and
python-bitcoinlib.

[25]

The elliptic curve plot was generated from the Sage mathematics package:

var("x y")
implicit_plot(y^2-x^3-7, (x,-10, 10), (y,-10, 10), figsize=3, title="y^2=x^3+7")

[26]

The hardcoded peer list in the Bitcoin client is in chainparams.cpp in the array pnseed.
For more information on finding Bitcoin peers, see How Bitcoin clients find each other or Satoshi client node discovery.



Traduit depuis http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html

Carte de paiement Crypto

Demandez votre
Carte de paiement Crypto ici

Recevez 8 € de BTC gratuitement


Inscrivez-vous à CoinBase