Glosario / Referencia para desarrolladores
Orden de bytes interno
- ¿Qué es el orden de bytes interno?
- El orden de bytes interno es la disposición que bitcoin usa dentro de las estructuras serializadas: los enteros se escriben con el byte menos significativo primero y los hash, en el orden en que SHA-256 los produjo.
Bajo un mismo nombre viajan dos convenciones. Todo campo entero de una transacción o de un encabezado de bloque es little endian, así que un número de versión 2 se escribe 02000000, y todo hash de 32 bytes está en los datos en bruto exactamente como lo emitió la función hash. Las herramientas orientadas a personas invierten esos hash antes de imprimirlos, que es la razón más común por la que un analizador sintáctico escrito a mano no coincide con un explorador de bloques.
Cómo funciona
El orden de bytes interno se aprende mejor desmontando el encabezado de 80 bytes del bloque génesis, ya que cada uno de sus campos es lo bastante pequeño para comprobarlo a simple vista.
Empieza con 01000000, el número de versión 1 en cuatro bytes little endian. Luego, 32 bytes cero, porque el primer bloque no tiene bloque padre. Luego, la raíz de Merkle, almacenada como 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a, que es el hash que todo explorador imprime como 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b, invertido byte a byte. Luego, 29ab5f49, la marca de tiempo 1231006505, es decir, las 18:15:05 UTC del 3 de enero de 2009. Luego, ffff001d, el campo de dificultad cuyo valor lógico es 0x1d00ffff. Luego, 1dac2b7c, el nonce 2083236893.
Los montos siguen la misma regla. Un bitcoin equivale a 100.000.000 satoshis, y una salida que paga exactamente eso lleva los ocho bytes 00e1f50500000000.
La razón es histórica y bastante prosaica. Bitcoin se escribió para máquinas x86, que guardan los enteros con el byte menos significativo primero, y el código más antiguo escribía las estructuras tal como el procesador ya las tuviera dispuestas. Los hash nunca se invirtieron en absoluto. Lo que cambió fue la impresión, porque Bitcoin Core guarda un hash en una clase que lo trata como un único número enorme, y los números se imprimen con la parte más significativa a la izquierda.
Dónde aparece
El orden de bytes interno es lo que se obtiene cada vez que una herramienta entrega bytes en bruto en lugar de una respuesta formateada.
Obtenga una transacción con la llamada RPC getrawtransaction sin el argumento verbose, o un encabezado de bloque con la llamada RPC getblockheader y verbose en false, y todo lo que contienen llega en este orden. Lo mismo vale para un PSBT exportado por una billetera de hardware, para la cadena hexadecimal que hay detrás de la pestaña de datos en bruto de un explorador y para los archivos de bloques que hay en el directorio blocks de un nodo.
El campo que hace tropezar a la gente es el outpoint al principio de cada entrada. Nombra la transacción que se está gastando con 32 bytes que se leen como el inverso del identificador que mostró el explorador. No hay nada corrupto cuando esas dos cadenas de caracteres no coinciden: invierta una y coincidirán.
Orden de bytes interno frente a orden de bytes RPC
El orden de bytes interno y el orden de bytes RPC describen los mismos 32 bytes recorridos en sentidos opuestos, y la regla para convertir de uno a otro tiene una excepción importante. Los hash se invierten al mostrarse a una persona y se vuelven a invertir al introducirse de nuevo. Los enteros no. Una altura de bloque, una marca de tiempo y un monto en satoshis se presentan todos como números decimales corrientes, e invertir uno de ellos al leerlo o al mostrarlo solo produce un valor erróneo, no uno escrito de otra forma. Invierta los hash y nada más, y la mayoría de los errores de orden de bytes desaparecerán.