Glossaire / Référence pour développeurs
Ordre des octets interne
- Qu'est-ce que l'ordre des octets interne ?
- L'ordre des octets interne est la disposition que le bitcoin utilise à l'intérieur des structures sérialisées : les entiers sont écrits octet le moins significatif en premier, et les empreintes de hachage dans l'ordre où SHA-256 les a produites.
Deux conventions circulent sous un même nom. Chaque champ entier d'une transaction ou d'un en-tête de bloc est en little endian, si bien qu'un numéro de version de 2 s'écrit 02000000, et chaque hachage de 32 octets figure dans les données brutes exactement tel que la fonction de hachage l'a produit. Les outils destinés aux humains inversent ces hachages avant de les afficher, ce qui est la raison la plus fréquente pour laquelle un analyseur écrit à la main ne concorde pas avec un explorateur de blocs.
Comment cela fonctionne
L'ordre des octets interne s'apprend au mieux en démontant l'en-tête du bloc de genèse de 80 octets, car chaque champ y est assez petit pour être vérifié à l'œil.
Il commence par 01000000, le numéro de version 1 sur quatre octets little endian. Puis 32 octets à zéro, car le premier bloc n'a pas de parent. Puis la racine de merkle, stockée sous la forme 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a, qui est l'empreinte que tout explorateur affiche comme 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b écrite à l'envers, un octet à la fois. Puis 29ab5f49, l'horodatage 1231006505, soit 18:15:05 UTC le 3 janvier 2009. Puis ffff001d, le champ de difficulté dont la valeur logique est 0x1d00ffff. Puis 1dac2b7c, le nonce 2083236893.
Les montants obéissent à la même règle. Un bitcoin vaut 100 000 000 satoshis, et une sortie qui paie exactement cette somme porte les huit octets 00e1f50500000000.
La raison est historique et assez banale. Bitcoin a été écrit pour des machines x86, qui conservent les entiers octet le moins significatif en premier, et le premier code écrivait les structures dans l'agencement que le processeur leur donnait déjà. Les hachages n'ont jamais été inversés. Ce qui a changé, c'est l'affichage, car Bitcoin Core stocke une empreinte dans une classe qui la traite comme un nombre énorme, et les nombres s'affichent avec la partie la plus significative à gauche.
Où cela se voit
L'ordre des octets interne est ce que vous obtenez chaque fois qu'un outil vous remet des octets bruts au lieu d'une réponse mise en forme.
Récupérez une transaction avec getrawtransaction sans indicateur verbose, ou un en-tête avec getblockheader avec verbose à false, et tout ce qu'ils contiennent arrive dans cet ordre. Il en va de même pour un PSBT exporté par un portefeuille matériel, pour l'hexadécimal derrière l'onglet brut d'un explorateur, et pour les fichiers de blocs présents dans le répertoire blocks d'un nœud.
Le champ qui prend les gens en défaut est l'outpoint au début de chaque entrée. Il nomme la transaction dépensée par 32 octets qui se lisent comme l'inverse de l'identifiant affiché par l'explorateur. Rien n'est corrompu quand ces deux chaînes ne correspondent pas : inversez l'une et elles concordent.
Ordre des octets interne vs ordre des octets RPC
L'ordre des octets interne et l'ordre des octets RPC décrivent les mêmes 32 octets parcourus en sens opposés, et la règle de conversion entre eux comporte une exception importante. Les empreintes de hachage sont inversées à la sortie vers un humain et inversées de nouveau à l'entrée. Les entiers, non. Une hauteur de bloc, un horodatage et un montant en satoshis sont tous présentés comme des nombres décimaux ordinaires, et inverser l'un d'eux à l'entrée ou à la sortie donne simplement une valeur fausse plutôt qu'une écriture différente. Inversez les hachages et rien d'autre, et la plupart des bogues d'ordre des octets disparaissent.