Datos de transacciones de bitcoin

Valoración: 4.25 (26 votos)

En el corazón del sistema Bitcoin se encuentran las transacciones, las cuales representan el movimiento de bitcoins entre diferentes direcciones. Estas transacciones son en realidad paquetes de datos que contienen información crucial sobre cada intercambio. En esta tutorial exhaustiva, desentrañaremos los intrincados detalles de los datos de transacciones de Bitcoin, investigando su estructura, campos clave y la importancia de comprender su funcionamiento.

Tabla de Contenido

¿Qué son los datos de transacciones de Bitcoin?

Una transacción de Bitcoin es esencialmente un conjunto de datos que desbloquea y bloquea lotes de bitcoins. Para ser más precisos, una transacción:

  • Selecciona lotes de bitcoins existentes (entradas) y los desbloquea.
  • Crea nuevos lotes de bitcoins (salidas) y les coloca nuevos bloqueos.

Es posible tener múltiples entradas y salidas en una sola transacción. Por lo tanto, puede considerar una transacción como parte de una cadena de salidas; una transacción crea una salida y luego una transacción futura selecciona esa salida (como entrada) y la desbloquea para crear nuevas salidas.

El mecanismo de bloqueo y desbloqueo implica criptografía. El bloqueo en una salida generalmente contiene una clave pública y, si desea desbloquearlo, necesitará la clave privada correspondiente a esa clave pública para crear una firma digital para ella. Una moneda digital contiene la clave pública de su propietario. Para transferirla, el propietario firma la moneda junto con la clave pública del próximo propietario. Cualquiera puede verificar las firmas para verificar el cambio de propiedad.
Satoshi Nakamoto, p2pfoundation.ning.com

Esta criptografía no fue inventada por Bitcoin; los sistemas de firma digital ya existían, y Bitcoin utiliza uno para que las personas puedan "poseer" y enviarse cantidades de bitcoins entre sí. Sin embargo, aunque es interesante, no necesitamos saber sobre esta criptografía subyacente si solo queremos poder comprender la estructura de las transacciones de Bitcoin y cómo funcionan, que es de lo que trata esta página.

Estructura de una Transacción de Bitcoin

Para comprender cómo funcionan las transacciones de Bitcoin, necesitamos examinar su estructura detallada. Cada transacción se compone de varios campos, que contienen diferentes tipos de información. Estos son los campos más importantes que encontramos en una transacción:

Versión

Tamaño: 4 bytes
Tipo: Entero
Formato: Little-endian

El campo de versión permite habilitar nuevas funciones de transacción. Las transacciones básicas (2009-actualidad) tienen un número de versión de 1, mientras que la mayoría de las transacciones de Bitcoin modernas utilizan ahora un número de versión de La versión 2 habilita funcionalidades adicionales, como BIP 68: Relative Locktime (2015-actualidad).

bitcoin transaction data - Where is bitcoin transaction data stored

Marcador y Bandera (Opcional)

Tamaño: 2 bytes

Estos dos bytes se utilizan para indicar una transacción de testigo segregado (segwit). Son necesarios solo si desbloquea entradas que tienen un bloqueo P2WPKH, P2WSH o P2TR (es decir, requieren el uso del campo de testigo al final de la transacción).

  • Marcador: 1 byte. Se establece en 00 para indicar que se trata de una transacción de testigo segregado. Siempre debe ser 00.
  • Bandera: 1 byte. Se establece en 01 para una transacción de testigo segregado. En el futuro, este byte puede incrementarse para indicar estructuras de transacciones más nuevas.

El software Bitcoin más antiguo que no se ha actualizado para usar transacciones de testigo segregado interpretará estos bytes de marcador y bandera como una indicación de que la transacción tiene 0 entradas y 1 salida, lo que haría que la transacción fuera inválida. Sin embargo, los nodos antiguos no recibirían realmente estos bytes cuando se les envía la transacción.

Conteo de Entradas

Tamaño: Variable
Tipo: Entero
Formato: Tamaño compacto

El campo de conteo de entradas indica el número de entradas que se incluirán en la transacción.

bitcoin transaction data - How do I view bitcoin transaction history

Estructura de una Entrada

Cada entrada en una transacción tiene su propia estructura interna. Básicamente, selecciona una salida de una transacción anterior y proporciona el código de desbloqueo para ella. Para cada entrada, debe repetir el siguiente conjunto de campos:

  • TXID: 32 bytes. Este es el TXID de la transacción que creó la salida que desea gastar. El TXID que utiliza para hacer referencia a una transacción anterior en los datos de la transacción sin procesar está en orden de bytes natural, que es en realidad el orden inverso de bytes que ve en los exploradores de blockchain. Esto es solo una peculiaridad de Bitcoin. Un TXID se crea mediante el hash de los datos de la transacción. Cada transacción tiene su propio TXID único.
  • VOUT: 4 bytes. Este es el número de índice para la salida en la transacción a la que acaba de hacer referencia. Una transacción puede crear múltiples salidas, por lo que necesita especificar qué salida de la transacción desea gastar. Esta combinación de un TXID:VOUT se conoce como un outpoint, que crea un identificador único para cada lote individual de bitcoins dentro de la blockchain. La salida que desea gastar no debe haberse gastado en una transacción anterior. La primera salida de una transacción está en el número de índice 0. VOUT es la abreviatura de "Vector Output". Un "vector" es básicamente un término de programación para una lista numerada de elementos. Es una estructura que se utiliza comúnmente en C++, que es el lenguaje en el que se programó originalmente Bitcoin.
  • Tamaño de ScriptSig: Variable. Indica el tamaño del código de desbloqueo para esta entrada. El código de desbloqueo puede variar en longitud según el tipo de bloqueo utilizado, por lo que necesitamos especificar qué tan largo va a ser el código de desbloqueo para saber cuántos datos necesitamos leer.
  • ScriptSig: Variable. Este campo contiene el código de desbloqueo para la salida a la que acaba de hacer referencia. Cada salida tiene algún tipo de bloqueo, por lo que debe proporcionar algunos datos que satisfagan las condiciones del bloqueo. Este campo utiliza Script y generalmente contiene una firma digital. Esta firma se crea firmando los datos de la transacción actual utilizando la clave privada que creó la clave pública dentro del bloqueo. Este campo solo se utiliza ahora para desbloquear salidas con scripts de bloqueo heredados. Estos son: P2PKH (heredado), P2SH (heredado). Si está desbloqueando un script de bloqueo P2WPKH o P2WSH moderno, el código de desbloqueo debe colocarse dentro del campo de testigo que viene a continuación. Si este es el caso, debe establecer el tamaño del campo scriptsig para esta entrada en 00.
  • Secuencia: 4 bytes. Este campo permite habilitar algunas características adicionales para la entrada que está gastando: Locktime, Replace-by-Fee, Relative Locktime. Este campo se ha reutilizado varias veces desde su diseño original, por lo que es una combinación de diferentes características en una sola. Un ajuste popular es 0xFFFFFFFD, ya que habilita tanto las funciones de locktime como replace-by-fee, que generalmente son útiles en la mayoría de las transacciones.

Conteo de Salidas

Tamaño: Variable
Tipo: Entero
Formato: Tamaño compacto

El campo de conteo de salidas indica el número de salidas que se incluirán en la transacción.

Estructura de una Salida

Cada salida crea un nuevo lote de bitcoins con su propio bloqueo. Las llamo "lotes" de bitcoins, pero el término técnico es salida. Al igual que una entrada, una salida tiene su propia estructura interna. Para cada salida, debe repetir el siguiente conjunto de campos:

  • Cantidad: 8 bytes. Este es el valor de la salida en satoshis (1 satoshi = 0.00000001 BTC). Este campo tiene un tamaño de 8 bytes, lo que significa que puede poner hasta 0xFFFFFFFFFFFFFFFF o 18446744073709551615 satoshis en una salida. Esto equivale a 184,467,440,7309551615 BTC, que es más BTC del que existe. El valor total de sus salidas no puede exceder el valor total de sus entradas. Cualquier cantidad restante de bitcoin que no se utilice será reclamada por un minero como tarifa de transacción.
  • Tamaño de ScriptPubKey: Variable. Indica el tamaño del código de bloqueo para esta salida. Puede colocar diferentes tipos de bloqueos en su salida, por lo que necesitamos especificar qué tan largo va a ser el código de bloqueo para saber cuántos datos necesitamos leer.
  • ScriptPubKey: Variable. Este es el código de bloqueo real que se coloca en la salida. Hay varios patrones de código de bloqueo diferentes que puede utilizar. Estos son los ejemplos más comunes: P2PKH (heredado) - Bloquea la salida al hash de una clave pública. Para desbloquear, necesita proporcionar la clave pública original y una firma válida. P2SH (heredado) - Bloquea la salida al hash de un script personalizado. Para desbloquear, necesita proporcionar el script original junto con el script que lo satisface. P2WPKH - Bloquea la salida al hash de una clave pública. Funciona igual que un P2PKH, pero el código de desbloqueo va en el campo de testigo en lugar del campo scriptsig. P2WSH - Bloquea la salida al hash de un script personalizado. Funciona igual que un P2SH, pero el código de desbloqueo va en el campo de testigo en lugar del campo scriptsig. P2TR - Bloquea la salida a una clave pública raíz. Utiliza firmas Schnorr y funciona con el sistema de bloqueo Taproot. OP_RETURN (Datos) - Bloquea la salida para almacenar datos que no se pueden gastar, como una URL o texto, utilizado para fines como metadatos.
  • Campo de testigo: Variable. El testigo es el área para el código de desbloqueo cuando desbloquea entradas con scripts de bloqueo P2WPKH, P2WSH o P2TR. Puede considerarlo como la nueva ubicación de los campos ScriptSig en las transacciones segwit. La principal diferencia es que no utiliza ningún código de operación, ya que es solo un montón de inserciones de datos. Por ejemplo, para desbloquear un script de bloqueo P2WPKH típico, utilizaría el siguiente campo de testigo: P2WPKH: 0247{firma}21{clave pública} El campo de testigo para cada entrada comienza con un campo de elementos de pila que indica el número de elementos en el campo de testigo, seguido del tamaño de cada elemento y el elemento real en sí. Usando el ejemplo anterior: Elementos de pila: 02 Tamaño: 47, Elemento: {firma} Tamaño: 21, Elemento: {clave pública} Esto se repite para cada entrada en la transacción. Como puede ver, es más básico que usar Script. Sin embargo, aunque parece bastante similar y generalmente contiene el mismo tipo de datos (por ejemplo, claves públicas y firmas), los datos del testigo no son Script.
  • Tiempo Unix: 4 bytes. El campo de locktime le permite especificar una altura de bloque o un tiempo Unix después del cual se puede minar una transacción. 499,999,999 o menos = Altura del bloque 500,000,000 o más = Tiempo Unix Una transacción con un locktime establecido en el futuro no se puede minar en un bloque, ni se aceptará en los mempools de los nodos en la red. Entonces, si crea una transacción con un locktime en el futuro, puede compartirla con otras personas, pero no podrá enviarla correctamente a la red hasta que se haya superado el tiempo o la altura del bloque específico. En otras palabras, agregar un locktime a una transacción es como poner una fecha posterior a un cheque. Al menos uno de los campos de secuencia debe configurarse en 0xFFFFFFE o menos para que se habilite el locktime. Si todas las secuencias están en su máximo de 0xFFFFFFFF, entonces la transacción se considera "final" y la función de locktime está desactivada.

TXID y wTXID

Cada transacción tiene su propio número de referencia único. Esto se conoce como ID de transacción (TXID).

Un TXID se crea mediante el doble hash SHA256 de los siguientes campos en los datos de la transacción sin procesar:

TXID = HASH256([versión][entradas][salidas][locktime])

Esto crea un resultado de hash de 32 bytes completamente único para cada transacción. Se utilizan estos TXID al buscar una transacción en un explorador de blockchain o cuando desea gastar la salida de una transacción en una nueva transacción. Los TXID de las transacciones también se combinan para crear una raíz merkle para el encabezado del bloque. Esto básicamente crea una "huella digital" para las transacciones que se han incluido en el bloque, por lo que si alguna de las transacciones cambia, también lo hará la huella digital.

Cada transacción también tiene un TXID de testigo (wTXID). Un wTXID se crea mediante el doble hash SHA256 de los datos de la transacción, pero esta vez incluye los campos adicionales en una transacción segwit:

wTXID = HASH256([versión][marcador][bandera][entradas][salidas][locktime][testigo])

Este wTXID no se utiliza para buscar o hacer referencia a transacciones. Solo se crea para que podamos incluir una "huella digital" de todos los campos adicionales de datos de las transacciones de testigo segregado (que van al campo de testigo de la transacción coinbase). Una transacción heredada tendrá el mismo wTXID y TXID porque no tiene los campos [marcador], [bandera] o [testigo].

Tamaño de una Transacción

Una transacción tiene 3 medidas de tamaño:

  • Bytes: Es simplemente el número de bytes sin procesar en la transacción. Se utiliza para calcular cuánto espacio ocupa una transacción en el disco.
  • Peso: Es el número de bytes en la transacción multiplicado por 4, excepto para el tamaño de los campos marcador, bandera y testigo. Esta medida de peso se utiliza para calcular cuántas transacciones pueden caber dentro de un bloque y básicamente se utiliza para que podamos dar un descuento a los datos del testigo.
  • Bytes virtuales: Es el peso dividido por Se utiliza en los exploradores de blockchain para comparar las tarifas de las transacciones entre las transacciones heredadas (bytes) y las transacciones segwit (peso). Es probable que encuentre la medida de bytes virtuales (vBytes) al inspeccionar transacciones en los exploradores de blockchain. Es básicamente el tamaño de la transacción en bytes, excepto que cada byte de datos del testigo se cuenta como 0.25 de un byte. Es la forma más práctica y universal de medir el "tamaño" de las transacciones en términos de cuántas transacciones pueden caber en un bloque.

Tarifas de Transacción

Una tarifa de transacción es el resto de una transacción. En otras palabras, es la suma de las entradas menos la suma de las salidas. Por ejemplo:

  • Entrada = 600 satoshis
  • Salida = 300 satoshis
  • Salida = 200 satoshis
  • Tarifa = 100 satoshis

Por lo tanto, establece una tarifa en una transacción al no "utilizar" el valor total de las entradas que ha seleccionado. Las tarifas de transacción son cobradas por los mineros si pueden minar un bloque. Por lo tanto, la tarifa de transacción actúa como un incentivo para que los mineros incluyan su transacción en su bloque candidato. El resto de una transacción siempre es la tarifa. Por lo tanto, si dimensiona incorrectamente sus salidas al construir una transacción, podría accidentalmente dar una tarifa masiva al minero. Así que tenga cuidado.

Los datos de transacciones de Bitcoin, aunque pueden parecer complejos, son el núcleo de la red Bitcoin. Al comprender su estructura y los campos que los componen, podemos obtener una comprensión profunda de cómo se mueven los bitcoins entre diferentes direcciones. Desde la identificación de transacciones hasta el cálculo de tarifas, los datos de transacciones desempeñan un papel crucial en el funcionamiento del ecosistema Bitcoin.

Si quieres conocer otros artículos parecidos a Datos de transacciones de bitcoin puedes visitar la categoría Finanzas / Inversiones.

Subir