Litecoin (LTC) 算法

跟之前分析过的 BTC 算法类似,Litecon (LTC) 的算法也是寻找一个整数(nonce),以满足某个要求。它使用了 Scrypt 哈希算法,而不再是两次 sha256。以下考察这个算法:

1. 输入:

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

其中前五个由网络决定,第六个输入 nonce 是需要尝试的整数。

2. 计算过程:

  1. 输入字段按小端格式化;
  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)。

同样的,这个算法也是验算容易,但要找到这样一个能满足要求的整数,需要进行大量的计算。

Read More: