Ejemplo de datos que se codifican en el árbol merkle para una transacción

Así que estoy leyendo esto (excelente recurso) en el árbol Merkle de Bitcoin para una transacción.

El árbol Merkle se construye de abajo hacia arriba. En el siguiente ejemplo, comenzamos con cuatro transacciones, A, B, C y D, que forman las hojas del árbol merkle, como se muestra en Cálculo de los nodos en un árbol merkle. Las transacciones no se almacenan en el árbol merkle; más bien, sus datos se procesan y el hash resultante se almacena en cada nodo hoja como HA, HB, HC y HD:

HA = SHA256(SHA256(Transaction A))

Luego, los pares consecutivos de nodos de hoja se resumen en un nodo padre, concatenando los dos hash y combinándolos. Por ejemplo, para construir el HAB del nodo principal, los dos valores hash de 32 bytes de los hijos se concatenan para crear una cadena de 64 bytes. A esa cadena se le asigna un hash doble para producir el hash del nodo principal:

HAB = SHA256(SHA256(HA + HB))

El proceso continúa hasta que solo hay un nodo en la parte superior, el nodo conocido como raíz de merkle. Ese hash de 32 bytes se almacena en el encabezado del bloque y resume todos los datos en las cuatro transacciones.

Eso tiene sentido, pero tengo algunas preguntas. En primer lugar, se explica cómo se aplica el hash a una transacción como la transacción A y qué se incluye en una transacción en la práctica. Por ejemplo, si es un objeto JSON en cadena, o un byteArray en JavaScript, o si los datos deben estar en un formato específico, etc. Me gustaría ver, por ejemplo, cómo se codificaría un registro, como o algo así{ a: 'foo', b: 'bar', c: 123, ... } .

En segundo lugar, si aquí es donde entra la idea de Patricia Merkle Tree (o tal vez incluso Merkle DAG, que he visto en alguna parte), para acortar la cantidad de cosas que tiene que almacenar en la memoria porque los hash no se superponen por completo. y así tendría muchos nodos de árbol vacíos.

Finalmente, cómo se vería un conjunto de transacciones de ejemplo en un solo bloque donde dicen que en promedio tienen 1900 transacciones. Este sería un árbol merkle bastante profundo, y me gustaría ver cómo se llaman realmente las transacciones y más información sobre su estructura de datos. Por ejemplo, si van hasta las operaciones ISA (Arquitectura del conjunto de instrucciones), o si son de un nivel mucho más alto. Eso es básicamente todo lo que me gustaría saber. Todavía no vi eso en el libro vinculado anteriormente, pero lo miraré más de cerca .

Respuestas (2)

Las hojas del árbol merkle son los identificadores de transacción ( txid) de la transacción, que a su vez es el doble-SHA256 de la transacción serializada completa en su forma binaria (little-endian), que es el mismo formato en que se recibe a través de la red. .

Ch06 del mismo libro describe la serialización de las estructuras txiny txout. No estoy seguro de por qué el formato de transacción en sí parece estar ausente del libro. Una transacción es una serialización de la secuencia de txinestructuras txoutcon una versión adicional y un tiempo de bloqueo.

tx {
    version : int32
    txin_count : VarInt
    txins : txin[]
    txout_count : VarInt
    txouts : txout[]
    nLockTime : uint32
}

Es VarIntel mismo que se usa en el libro. En el código fuente del núcleo de Bitcoin se llama CompactSize.

Existe un formato alternativo para las transacciones testigo que utilizan los clientes que admiten el formato, que utiliza un truco que txin_countgeneralmente debe ser >= 1porque todas las transacciones deben gastar una entrada existente (excepto el coinbase tx). Así, si el byte donde txin_countse espera arriba tiene el valor 0, esto indica la presencia de una transacción testigo, donde hay algunos campos adicionales.

witness_tx {
    version : int32
    witness_marker : byte //always 0
    witness_flag : byte
    txin_count : VarInt
    txins : txin[]
    txout_count : VarInt
    txouts : txout[]
    witnesses : witness[] //list always has the same length of txin_count
    nLockTime : uint32
}

Incluso cuando una transacción es una transacción testigo, el txformato se usa para generar el txidpara que esa transacción se use en el cálculo de la raíz Merkle. Esto es para garantizar que las transacciones testigo sean compatibles con versiones anteriores del formato de transacción anterior. Un cliente compatible con SegWit que se comunica con un cliente que no lo admite enviará el txformato a su par para transacciones testigo, en lugar del witness_txformato.

¿Los txid que no son de segwit no contienen el testigo [] como [0x00] y ahora usan el mismo formato? Gran explicación.
No. El indicador 0x00 se usa donde txin_countnormalmente aparece en el formato tx heredado, y simplemente indica que la transacción es una transacción testigo para que los bytes restantes se analicen con el segundo formato testigo.

1) Las transacciones no contienen hashes Merkle. Los valores hash de las transacciones anteriores a SegWit se calculan serializando la transacción (puede buscar "el formato hexadecimal") y luego aplicando hash a la matriz de bytes. Después de SegWit, las firmas se excluyen de los hash de transacciones.

2) (no puedo entender lo que estás pidiendo)

3) Las transacciones de 1900 no son tan profundas. La altura puede ser calculada por ceil(log_2(number_of_tx))+1. Conecte 1900 y la altura es 12. Si desea saber cómo se pueden usar los árboles merkle para ISA, le sugiero que busque MAST . Permite ocultar las partes no ejecutadas del Script.