我目前正在尝试使用pyblockchain解析区块链。我的问题是我无法正确编码scriptPubKey
- 虽然我不知道我可能做错了什么。
下面你可以看到我如何遍历区块链:
from blockchain.reader import BlockchainFileReader
import hashlib
import base58
block_reader = BlockchainFileReader('/media/Data/btc/blocks/blk00325.dat')
count = 0
for block in block_reader:
count +=1
for t in block.transactions:
for outp in t.outputs:
addr = base58.b58encode(outp.script_pub_key)
if addr.startswith('1'):
print(addr)
if count >= 5:
break
如果我,在我的Jupyter笔记本中,看看outp
,我会找到
outp.script_pub_key
>> b'v\xa9\x14\x1e\xbev\x83\xceJd\xad\xc9\x17\xe9\xb1\x93\x7f\x12&Q\xcb\xab\xa1\x88\xac'
这样:
base58.b58encode(outp.script_pub_key)
>> 'pkJBVCg6k54E7ZiP7cvxbCvtN9aY9zEcgK'
显然,比特币地址应该被编码为Base58Check - 然而,这也不起作用:
base58.b58encode_check(outp.script_pub_key)
>> '6PSJQapdQn8VeG9SBuZdH8q2ysyP4ND6dmspzLZb'
那我在这里做错了什么?
答案 0 :(得分:-1)
对于C ++,有
bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
直接在这里的代码中
https://github.com/bitcoin/bitcoin/blob/0cda5573405d75d695aba417e8f22f1301ded001/src/script/standard.cpp#L156
因此,解决方案看起来非常简单
const CScript & scriptPublicKey = block.vtx[ i ]->vout[ j ].scriptPubKey ;
CTxDestination destination ;
std::string address = "unknown" ;
if ( ExtractDestination( scriptPublicKey, destination ) )
address = CBitcoinAddress( destination ).ToString() ;
关于Python。我敢打赌,问题是首先将ExtractDestination
逻辑转换为Python的语言