Glossaire / Transactions et frais
Transaction sérialisée
Aussi appelé Transaction brute.
- Qu'est-ce qu'une transaction sérialisée ?
- Une transaction sérialisée est la chaîne d'octets exacte qu'un portefeuille remet au réseau, la forme hexadécimale que chaque nœud analyse, hache et relaie sans modifier un seul octet.
Spécifié dans BIP-144.
Tout ce qui est convivial dans une transaction, les adresses, les montants dans votre monnaie locale, les libellés, est une décoration que votre portefeuille ajoute. Ce qui circule réellement est un blob binaire compact, généralement de 200 à 250 octets pour un paiement simple, et il est entièrement autonome. Copiez cet hexadécimal depuis un ordinateur hors ligne vers n'importe quel ordinateur connecté et le paiement peut être diffusé depuis là.
Comment cela fonctionne
La sérialisation suit un ordre fixe sans noms de champs, de sorte que les analyseurs s'appuient entièrement sur la position et sur des préfixes de longueur.
Le blob commence par la version de quatre octets. Les transactions Segregated Witness insèrent ensuite deux octets d'indicateur, 0x00 et 0x01, que les anciens analyseurs liraient comme une transaction sans entrée et rejetteraient donc, une astuce délibérée qui a permis au nouveau format de coexister avec l'ancien. Vient ensuite le nombre d'entrées sous forme d'entier compactSize, puis chaque entrée : 36 octets nommant la pièce dépensée, un script de déverrouillage précédé de sa longueur, et un numéro de séquence de quatre octets. Le nombre de sorties suit, puis chaque sortie sous forme d'un montant de huit octets en satoshis plus un script de verrouillage précédé de sa longueur. Les données de témoin, lorsqu'elles sont présentes, se trouvent vers la fin, et les quatre derniers octets sont toujours le locktime.
Les nombres sont stockés en little endian, l'octet le plus petit en premier, ce qui explique qu'un montant de 100 000 satoshis apparaisse dans l'hexadécimal sous la forme a0 86 01 00 00 00 00 00. Les hachages sont stockés dans l'ordre d'octets interne, l'inverse de ce qu'un explorateur vous montre, de sorte que les identifiants de transaction à l'intérieur d'un blob brut semblent inversés.
Deux hachages sortent de cette seule structure. L'identifiant de transaction est un double SHA-256 sur la sérialisation, le marqueur, l'indicateur et le témoin étant retirés, ce qui rend les signatures insensibles à une altération après coup. L'identifiant de transaction témoin, défini dans le BIP141, hache l'ensemble, témoin compris, et les nœuds l'utilisent pour la comptabilité de relais. Un paiement SegWit natif à une entrée et deux sorties se sérialise en environ 222 octets bruts et compte pour environ 141 octets virtuels, parce que la partie témoin bénéficie d'une décote.
Où vous le voyez
La forme brute apparaît dès que vous sortez d'une seule application, ce qui, pour la plupart des gens, signifie signer hors ligne ou sauver un paiement.
Les portefeuilles matériels et les configurations isolées du réseau exportent une transaction finalisée sous forme d'hexadécimal ou de code QR contenant les mêmes octets, et vous la collez dans le formulaire de diffusion d'un explorateur de blocs pour l'envoyer. La ligne de commande de Bitcoin Core l'utilise dans les deux sens : createrawtransaction et signrawtransactionwithwallet produisent de l'hexadécimal, decoderawtransaction retransforme l'hexadécimal en JSON lisible, et sendrawtransaction le met sur le réseau. Les demandes d'assistance réclament souvent l'hexadécimal brut plutôt que l'identifiant de transaction, parce que l'hexadécimal prouve ce que la transaction contient au lieu de simplement la nommer.
Une remarque de sécurité. Une transaction brute signée est une information au porteur : quiconque a l'hexadécimal peut la diffuser, et rien à son sujet n'est confidentiel. Ne collez pas une telle transaction dans un forum public en demandant de l'aide, sauf si vous acceptez que le paiement soit effectué.
Transaction sérialisée vs identifiant de transaction
La transaction sérialisée est le document ; l'identifiant de transaction est son nom de fichier. L'une est quelques centaines d'octets d'hexadécimal pouvant atteindre cinq cents caractères à l'écran, et l'autre fait toujours exactement 64 caractères hexadécimaux.
Les gens les confondent parce que les deux ressemblent à de longues chaînes d'hexadécimal. Le test est la longueur et ce que la chaîne peut faire. Une chaîne de 64 caractères peut être recherchée sur un explorateur et rien d'autre. Une chaîne plus longue peut être décodée en champs, et si elle est entièrement signée, elle peut être diffusée par quiconque la détient, y compris un inconnu à qui vous l'avez envoyée.