Litecoin (LTC) 算法
跟之前分析过的 BTC 算法类似,Litecon (LTC) 的算法也是寻找一个整数(nonce),以满足某个要求。它使用了 Scrypt 哈希算法,而不再是两次 sha256。以下考察这个算法:
1. 输入:
- version,4 个字节
- prev_block,32 个字节
- mrkl_root,32 个字节
- timestamp,4 个字节
- bits,4 个字节
- nonce,4 个字节
其中前五个由网络决定,第六个输入 nonce 是需要尝试的整数。
2. 计算过程:
- 输入字段按小端格式化;
- 送入 Scrypt 算法,得到输出、逆序并作为计算结果
以 Python 代码举例(因为 Python 标准库里还没有包含 Scrypt 的实现,所以这里使用了第三方的模块)
import scrypt
import struct
def bits_to_target(bits):
return (bits & 0xFFFFFF) * (256 ** ((bits >> 24) - 3))
def bits_to_diff(bits):
return (2**208) * 65535 / bits_to_target(bits)
def ltc_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)
result = scrypt.hash(chunk, chunk, 1024, 1, 1, 32)
return result[::-1]
3. 输出:
输出 32 个字节的结果
4. 计算举例:
以区块高度 123456 的真实数据举例(具体信息可以从 这个网页 看到);
>>> version = 1
>>> prev_block = '4db8730cf48ef656e834b8b87085e0f1b3acd51bcf2d51cb0d7e82060eb219f3'
>>> mrkl_root = '96f43925c25013f7266e271bad8eca1a3797c82ce08859b428d7e2f7fcf6c2b6'
>>> timestamp = 1335278279
>>> bits = 0x1d00ac0c
>>> nonce = 2701658624
>>> hash_golden = '000000007001e74b2bd5f4038a5c7557485cc23db8977017a32d59b236bf5c1e'
>>>
>>> result = ltc_hash(version, prev_block, mrkl_root, timestamp, bits, nonce)
>>>
>>> assert int.from_bytes(result, 'big') < bits_to_target(bits)
>>> assert result.hex() == hash_golden
>>>
>>> print(f'result: {result.hex()}')
result: 000000007001e74b2bd5f4038a5c7557485cc23db8977017a32d59b236bf5c1e
>>> print(f'target: {bits_to_target(bits):064x}')
target: 00000000ac0c0000000000000000000000000000000000000000000000000000
>>> print(f'diff: {bits_to_diff(bits)}')
diff: 1.4879438743075106
从上述代码及输出的结果可以观察到,LTC 算法的要求是,所求解出来的这个 nonce,必须要能够让 Scrypt 输出的结果(以大端来看)必须小于由 bits
决定的一个数(上面代码里的 target
)。
同样的,这个算法也是验算容易,但要找到这样一个能满足要求的整数,需要进行大量的计算。