merkle raíz 2 códigos

Al tratar de calcular la raíz de merkle en python a partir de los datos que obtuve del grupo de minería... encontré que hay 2 códigos diferentes.

código 1:

def build_merkle_root(coinbase_hash_bin, merkle_branch):
    merkle_root = coinbase_hash_bin
    for h in merkle_branch:
        merkle_root = hashlib.sha256(hashlib.sha256(merkle_root + binascii.unhexlify(h)).digest()).digest()
    return binascii.hexlify(merkle_root).decode('utf-8')

Esto se explica en el documento de estrato de shlushpool aquí y también en un protocolo de minería de altcoin sia aquí . Así que creo que debería ser correcto. Pero hay otra pieza de código a continuación,

código 2:

def build_merkle_root(hash_list):
if len(hash_list) < 2:
    return hash_list[0]
new_hash_list = []

# Process pairs. For odd length, the last is skipped
for i in range(0, len(hash_list) - 1, 2):
    new_hash_list.append(hash2(hash_list[i], hash_list[i + 1]))

# odd, hash last item twice
if len(hash_list) % 2 == 1:
    new_hash_list.append(hash2(hash_list[-1], hash_list[-1]))

return build_merkle_root(new_hash_list)
#==========================================================================
def hash2(a, b):
     # Reverse inputs before and after hashing due to big-endian / little-endian nonsense
     a1 = binascii.unhexlify(a)[::-1]
     b1 = binascii.unhexlify(b)[::-1]
     h = hashlib.sha256(hashlib.sha256(a1 + b1).digest()).digest()

     return binascii.hexlify(h[::-1])

Este parece más lógico desde el punto de vista de la estructura del árbol merkle, que consiste en dividir cada par por separado.

Para probarlos, tome a continuación como ejemplo del trabajo obtenido de un grupo....

[{'id': None,
  'method': 'mining.notify',
  'params': ['59bc8dfc00003829',
   'ceeefd1381f491d9a0ba90b26a495a225e8bfc9f00ecc4250000000000000000',
   '01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff3503226b07000455abc259040bf12d090c',
   '0a636b706f6f6c112f736f6c6f2e636b706f6f6c2e6f72672fffffffff035976a953000000001976a914fc6123f4bfd3a840b4387ab90e9801e98fb17cf888ac8756d800000000001976a914f4cbe6c6bb3a8535c963169c22963d3a20e7686988ac0000000000000000266a24aa21a9edc963e012cb380138e3d16283a094454782879557714d3b0d73fecfe612d01f0600000000',
   ['b32abe89497354ceaa2dff35cc41995d58c19893d517e92e30b4ead75a66970c',
    'ca93a597a29860178f4cd01326f43b080f516f3f81ba6b86b0ff35f5cb206b7f',
    '213f7e41a5b228ec554c1a2e3fe18b1f3e1c23821b1b2b3aa1319d3d616044ca',
    '0941052c2e5864e57a18bfc82d1e7ab15740d4ed7b852cda92bffd3ff622e59d',
    '7ad5af30a3daa89c1244016227cde139d5d54232a673cbf7954f6a1aa26bbc05',
    'e24a96489d5782c6bcde209952a12826cd225b97b9a3ad3142c87dd062136d0b',
    '383a433dc503c8ab4b7beb9dc4a3e07811a1cb9681e2da019cec16966fc727be',
    'f10804628f630bcead6cd1b667d4352cdfb93aea382662456c2caadda3e1b0c9',
    '03e9bf5b6053fe86d272dac8c2a32f08ace6d045799ae499ed7087af21c737c6',
    '3cf338c75d7ef47b0c029d16b5b02340a62ce0a7846910175b021d919dcccc6f',
    '40319623d80cae8a5b1a3e319a962110a08ff40daf40ebf421b9454f20e54dcc',
    'c29e3826153dfc1d10e9e173281d21ad2103bba86bc2930440e7258afca2b957'],
   '20000000',
   '1800ff18',
   '59c2ab55',
   False]}]

El Código 1 me da la raíz Merkle mientras 7cbd55a748aa8e778e0795e33d5bd5a07c9f465cd3de1fef3bf36ea3ac4d56f9que el Código 2 da como 6681ae1409685d71a51ced80ae0c7eacb78d5facb401ece2287543b6cc17e4cfDado que ambos no son iguales, entonces, ¿cuál está mal ? Necesitaba la raíz de Merkle para el encabezado del bloque.

En los dos casos anteriores, tomé extranonce2 todos los ceros como 0000000000000000y construí coinbase como 01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff3503226b07000455abc259040bf12d090cff47c35900000000000000000a636b706f6f6c112f736f6c6f2e636b706f6f6c2e6f72672fffffffff035976a953000000001976a914fc6123f4bfd3a840b4387ab90e9801e98fb17cf888ac8756d800000000001976a914f4cbe6c6bb3a8535c963169c22963d3a20e7686988ac0000000000000000266a24aa21a9edc963e012cb380138e3d16283a094454782879557714d3b0d73fecfe612d01f0600000000lo que da un hash de coinbase de20d0b9a72f1e940e29b064e428f5e037f948c9ede27dfb7e77b1df7d289d1861

Respuestas (1)

El protocolo de estrato le brinda algunos hashes de ramas específicas en el árbol merkle. Es posible que no estén a la misma profundidad en el árbol (y no creo que lo estén). Solo se proporcionan para que el minero pueda cambiar la transacción de la base de monedas incrementando la extranonce y luego incorporándola a la raíz de merkle. La raíz Merkle del Código 1 debería ser la correcta, ya que ese es el método que los documentos del protocolo Stratum le indican que haga. El otro código es para crear la raíz de merkle a partir de una lista de transacciones, no una lista de hash de rama como proporciona Stratum.

Entonces, el merkle_root obtenido del Código 1 "7cbd55a748aa8e778e0795e33d5bd5a07c9f465cd3de1fef3bf36ea3ac4d56f9" se usará directamente en el encabezado del bloque o tiene el mismo formato de visualización que blockchain.info y tendré que invertir los bytes para colocarlo en el encabezado del bloque.
Debería poder usarse directamente en el encabezado del bloque.