查看特定的比特币区块信息,以区块482737为例:
区块信息
从网页中可以获取该区块的信息,但是很多信息比如时间经过了处理,无法直接使用,我们需要获取原始数据,方法如下,首先复制网页中Hash的值,也就是该区块的哈希值:000000000000000000fd0c220a0a8c3bc5a7b487e8c8de0dfa2373b12894c38e
,然后打开以下网址https://blockchain.info/rawblock/000000000000000000fd0c220a0a8c3bc5a7b487e8c8de0dfa2373b12894c38e
,得到该区块所有数据,为json格式:
知道如何获取json数据后,进行以下几步:
- 解析json数据,得到区块版本号,前一个区块哈希值,默克尔根,时间戳,目标难度,随机数
- 进行数据预处理,将数据转化为字节流并改为小端序
- 进行数据拼接,顺序为版本号+上一区块哈希值+默克尔根+utc时间戳+目标难度+随机数
- 进行两次sha256运算
代码如下:
import requests
from json import dumps
import binascii
from hashlib import sha256 as s
#字节翻转函数,用于将字符串转为小端序
def strchange(a):
return bytes().fromhex(a)[::-1]
# 获取区块482737json数据,命名为data
url = 'https://blockchain.info/rawblock/000000000000000000fd0c220a0a8c3bc5a7b487e8c8de0dfa2373b12894c38e'
response = requests.get(url)
data = response.json()
#区块482737的原始数据
#版本号,整形
ver = data['ver']
#区块哈希值,字符串格式
hash = data['hash']
#上一区块哈希值,字符串格式
prev_block = data['prev_block']
#默克尔根,字符串格式
mrkl_root = data['mrkl_root']
#utc时间戳,整形
time = data['time']
#目标难度,字符串格式
bits = data['bits']
#随机数,字符串格式
nonce = data['nonce']
# 数据预处理,将数据转化为字节流并改为小端序
ver = bytes.fromhex(str(hex(ver))[2:])[::-1]
prev_block = strchange(prev_block)
mrkl_root = strchange(mrkl_root)
time = bytes.fromhex(str(hex(time))[2:])[::-1]
bits = bytes.fromhex(str(hex(bits))[2:])[::-1]
nonce = bytes.fromhex(str(hex(nonce))[2:])[::-1]
# 进行数据拼接,顺序为版本号+上一区块哈希值+默克尔根+utc时间戳+目标难度+随机数
k = ver+prev_block+mrkl_root+time+bits+nonce
# 两次sha256运算,结果转成大端序,方便显示
res = binascii.hexlify(s(s(k).digest()).digest()[::-1])
# bytes解码为str
res = res.decode()
# 经验证,与区块数据中的哈希值一致
print(res == hash)
# True
网友评论