Glosario / Transacciones y comisiones
Transacción serializada
También se conoce como Transacción en bruto.
- ¿Qué es una transacción serializada?
- Una transacción serializada es la cadena de bytes exacta que una billetera entrega a la red, la forma hexadecimal que todo nodo analiza, cuyo hash calcula y que retransmite sin alterar un solo byte.
Se especifica en el BIP-144.
Todo lo que una transacción tiene de amigable (las direcciones, los montos en su moneda local, las etiquetas) es decoración que añade su billetera. Lo que viaja en realidad es una cadena de bytes binaria y compacta, normalmente de 200 a 250 bytes en un pago sencillo, y es completamente autosuficiente. Copie esa cadena hexadecimal de una computadora sin conexión a cualquier computadora conectada y el pago podrá difundirse desde allí.
Cómo funciona
La serialización es un orden fijo sin nombres de campo, así que los analizadores dependen por completo de la posición y de los prefijos de longitud.
La cadena de bytes empieza con la versión de cuatro bytes. Las transacciones SegWit insertan después dos bytes indicadores, 0x00 y 0x01, que los analizadores antiguos leerían como una transacción con cero entradas y, por tanto, rechazarían: un truco deliberado que permitió que el nuevo formato conviviera con el antiguo. A continuación viene el recuento de entradas como un entero compactSize, y luego cada entrada: 36 bytes que identifican la moneda que se gasta, un script de desbloqueo con prefijo de longitud y un número de secuencia de cuatro bytes. Después viene el recuento de salidas, y luego cada salida como un monto de ocho bytes en satoshis más un script de bloqueo con prefijo de longitud. Los datos de testigo, cuando los hay, se sitúan cerca del final, y los últimos cuatro bytes son siempre el locktime.
Los números se almacenan en little endian, con el byte menos significativo primero, y por eso un monto de 100.000 satoshis aparece en la cadena hexadecimal como a0 86 01 00 00 00 00 00. Los hash se almacenan en orden de bytes interno, el inverso del que le muestra un explorador de bloques, así que los ID de transacción dentro de una cadena de bytes en bruto parecen estar al revés.
De esta única estructura salen dos hash. El ID de transacción es un doble SHA-256 calculado sobre la serialización sin el byte marcador, el byte indicador ni el testigo, y eso es lo que hace a las firmas inmunes a una alteración posterior. El ID de transacción de testigo, definido en BIP141, se calcula sobre todo el conjunto, testigo incluido, y los nodos lo usan para la contabilidad de la retransmisión. Un pago SegWit nativo de una entrada y dos salidas se serializa en alrededor de 222 bytes en bruto y cuenta como aproximadamente 141 bytes virtuales, porque la parte del testigo va con descuento.
Dónde aparece
La forma en bruto aparece en cuanto se sale de una sola aplicación, lo que para la mayoría de la gente significa firmar sin conexión o rescatar un pago.
Las billeteras de hardware y las configuraciones aisladas de la red exportan una transacción terminada en hexadecimal o como un código QR que contiene los mismos bytes, y para enviarla se pega en el formulario de difusión de un explorador de bloques. La línea de comandos de Bitcoin Core la usa en ambos sentidos: las llamadas RPC createrawtransaction y signrawtransactionwithwallet producen una cadena hexadecimal, decoderawtransaction vuelve a convertir esa cadena hexadecimal en JSON legible, y sendrawtransaction la pone en la red. Las solicitudes de soporte a menudo piden el hexadecimal en bruto en lugar del ID de transacción, porque el hexadecimal demuestra lo que contiene la transacción en lugar de limitarse a nombrarla.
Una advertencia de seguridad. Una transacción en bruto firmada es información al portador: cualquiera que tenga el hexadecimal puede difundirla, y nada en ella es confidencial. No pegue una en un foro público al pedir ayuda, a menos que le parezca bien que el pago se realice.
Transacción serializada frente a ID de transacción
La transacción serializada es el documento; el ID de transacción es su nombre de archivo. Una ocupa unos cientos de bytes en hexadecimal, que en pantalla pueden llegar a quinientos caracteres, y el otro tiene siempre exactamente 64 caracteres hexadecimales.
La gente los confunde porque ambos parecen largas cadenas hexadecimales. La comprobación se basa en la longitud y en lo que puede hacer la cadena de caracteres. Una cadena de 64 caracteres puede buscarse en un explorador y nada más. Una cadena de caracteres más larga puede decodificarse en campos y, si está completamente firmada, puede difundirla cualquiera que la tenga, incluido un desconocido al que usted se la haya enviado.