Transactions

用 python 解析原始比特幣塊的最佳方法是什麼?

  • December 5, 2019

假設一個連接到 zmq 套接字並監聽 rawblock。你如何解析塊頭如下:

block_header = raw[:80]
version = block_header[:4]
prev_merkle_root = block_header[4:36]
merkle_root = block_header[36:68]
timestamp = block_header[68:72]
bits = block_header[72:76]
nonce = blockheader[76:80]

但是,解析區塊中所有交易的最佳方式是什麼?將 rawtx 轉換為 tx 對像很容易,很多庫都可以做到。但是解析可變長度的 txs 塊的最佳方法是什麼?

我們將比較現代庫與 segwit 和 bech32 的支持。

首先是來自bitaps.com的 pybtc,其次是來自chainside.net的 btcpy

我們的測試程式碼:

import time
import pybtc

f = open('raw_block.txt')
fc = f.readline()
qt = time.time()
block_hex = fc[:-1]
bt = pybtc.Block(block_hex, format="decoded")
print("pybtc library parsed block in decoded format", time.time() - qt )

qt = time.time()
bt = pybtc.Block(block_hex, format="raw")
print("pybtc library parsed block in raw format", time.time() - qt )

from btcpy.structs.block import Block as btcpy_block

qt = time.time()
block = btcpy_block.unhexlify(block_hex)
print("btcpy library parsed block", time.time() - qt )

您可以在此處下載使用的原始塊

測試結果:

pybtc library parsed block in decoded format 0.3380300998687744
pybtc library parsed block in raw format 0.0953378677368164
btcpy library parsed block 0.6518878936767578

可以看到 pybtc 塊解析性能更好。解碼模式意味著將所有字節轉換為十六進制,並將地址轉換為 base58 或 bech32。原始模式更快,但所有對像都以原始字節、地址儲存為雜湊值。

檢查這個庫pybtc

解碼原始塊的類 <https://github.com/bitaps-com/pybtc/blob/master/pybtc/block.py#L5>

引用自:https://bitcoin.stackexchange.com/questions/84325