BTC 算法
BTC 的算法,是求解(也可以说是寻找)一个整数(nonce),它被用于在区块链上产生新高度的区块。算法的输入是前一个区块的哈希、要求解的 nonce 以及其他一些信息,算法过程中会使用两次 sha256 哈希算法,算法的输出结果是 32 字节的内容。如果输出结果不满足以若干个连续的 0 开始的要求,那么这个 nonce 是无效的,需要换个 nonce 重新计算,直到满足要求;或者区块链上有更新、需要更新输入重新计算。以下考察这个算法:
1. 输入:
- version,4 个字节
- prev_block,32 个字节
- mrkl_root,32 个字节
- timestamp,4 个字节
- bits,4 个字节
- nonce,4 个字节
2. 计算过程:
- 输入字段按小端格式化;
- 送入 sha256 算法,得到输出;
- 把上述输出,再次送入 sha256 算法,得到输出、逆序并作为计算结果
以 Python 代码举例:
import hashlib
import struct
def btc_hash(version, prev_block, mrkl_root, timestamp, bits, nonce):
chunk = struct.pack('<I32s32s3I', version,
bytes.fromhex(prev_block)[::-1],
bytes.fromhex(mrkl_root)[::-1],
timestamp, bits, nonce)
m = hashlib.sha256()
m.update(chunk)
hash1 = m.digest()
m = hashlib.sha256()
m.update(hash1)
hash2 = m.digest()
return hash2[::-1].hex()
3. 输出:
输出 32 个字节的结果
4. 计算举例:
以区块高度 123456 举例(具体信息可以从 这个网页 看到);
def main():
version = 1
prev_hash = '0000000000000b60bc96a44724fd72daf9b92cf8ad00510b5224c6253ac40095'
merkle_root = '0e60651a9934e8f0decd1c5fde39309e48fca0cd1c84a21ddfde95033762d86c'
ntime = 1305200806
nbits = 443192243
nonce = 2436437219
hash_golden = '0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682ff6cd83c3ca'
result = btc_hash(version, prev_hash, merkle_root, ntime, nbits, nonce)
assert(result == hash_golden)
print(result)
观察上述输出的结果,是的,BTC 算法的要求是,所求解出来的这个 nonce,必要能让输出的结果满足以若干个 0 开始。
当然,如果换一个数,比如刚才那个整数的下一个 2436437220,同样的过程,根据算法会得到的结果是 543e92e30d751be243c185d117498be4098106657e661509fff4cf5001ae441e
,显然,这是不满足要求的。这个算法的特点是,要找到这样一个满足要求的整数,需要进行大量的计算。