Большое спасибо за пример! Очень легко запутаться в этих обратных байтах и двойном хешировании.
Вот полностью рабочий код для MainNet:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
from hashlib import sha256
import json
import requests
DEFAULT_RPC_REGTEST_PORT = "18443"
DEFAULT_RPC_TEST_PORT = "18332"
DEFAULT_RPC_MAIN_PORT = "8332"
rpcAddress = "127.0.0.1"
rpcPort = DEFAULT_RPC_MAIN_PORT
rpcUser = "rpcuser"
rpcPassword = "rpcpassword"
rpcUrl = "http://" + rpcAddress + ":" + rpcPort
headers = {'content-type': 'application/json'}
# Double HASH SHA256
def double_sha256(data): return sha256(sha256(data).digest()).digest()
# Reverse
def r(data): return data[::-1]
def request_rpc(method, params):
payload = json.dumps(
{
"method": method,
"params": params
}
)
return requests.request("POST", rpcUrl, data=payload, headers=headers,
auth=(rpcUser, rpcPassword))
if __name__ == "__main__":
res = request_rpc(method="getblock", params=["00000000000000000000bd684e36789d16da2cf5b08b47deb72d1448a73eae5c"])
tx = res.json()["result"]["tx"]
hashes = [bytes.fromhex(x) for x in tx]
while len(hashes) > 1:
if len(hashes) % 2 == 1:
hashes.append(hashes[-1])
parent_level = []
for i in range(0, len(hashes), 2):
x = r(double_sha256(r(hashes[i]) + r(hashes[i + 1])))
parent_level.append(x)
hashes = parent_level
merkleroot = hashes[0].hex()
print(merkleroot)