BTC 算法

BTC 的算法,是求解(也可以说是寻找)一个整数(nonce),它被用于在区块链上产生新高度的区块。算法的输入是前一个区块的哈希、要求解的 nonce 以及其他一些信息,算法过程中会使用两次 sha256 哈希算法,算法的输出结果是 32 字节的内容。如果输出结果不满足以若干个连续的 0 开始的要求,那么这个 nonce 是无效的,需要换个 nonce 重新计算,直到满足要求;或者区块链上有更新、需要更新输入重新计算。以下考察这个算法:

1. 输入:

  1. version,4 个字节
  2. prev_block,32 个字节
  3. mrkl_root,32 个字节
  4. timestamp,4 个字节
  5. bits,4 个字节
  6. nonce,4 个字节

2. 计算过程:

  1. 输入字段按小端格式化;
  2. 送入 sha256 算法,得到输出;
  3. 把上述输出,再次送入 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,显然,这是不满足要求的。这个算法的特点是,要找到这样一个满足要求的整数,需要进行大量的计算。

Read More: