GitHub
深入技术
Bits

Bits

区块结构
字段大小格式描述
Version4 字节小端序区块版本号
Previous Block32 字节自然字节序前一个区块的区块哈希
Merkle Root32 字节自然字节序区块中包含的所有交易ID的默克尔根
Time4 字节小端序当前时间的 Unix 时间戳
Bits4 字节小端序目标值的紧凑表示
Nonce4 字节小端序随机数,用于尝试找到有效哈希
Transaction Count动态compact size区块中包含的交易数量
Transactions动态交易数据区块中包含的所有原始交易数据

Bits 字段当前目标值的压缩格式。原始目标值是 32 字节, 通过压缩成 4 字节的 Bits 字段, 可以节省区块头的空间。

转换

Bits 字段占据4个字节, 由指数和系数组成。指数占据一个字节, 系数占据三个字节。

Bits 转换为目标值

为方便验证, 先介绍如何将 Bits 转换为目标值。

如下是区块 860636 的区块头数据

0020ad2ae79ade0ab3910b0b0a0e0f9296eefdf653ad4422346c01000000000000000000c1f458d03e633ef9fde09996fdcfd786264467de8efe90e30a15b4f72c9b896bdf1adf665b25031743857671

Bits 字段是 0x5b250317, 转换为正常字节序为 0x1703255b

指数是 0x17 即10进制的 23, 系数是 0x03255b

一开始, 假设目标值是 32 字节的 0 构成:

0x0000000000000000000000000000000000000000000000000000000000000000

将系数左移指数个字节, 即左移23个字节, 即得到目标值:

0x000000000000000000 03255b 0000000000 0000000000 0000000000 0000000000
  —————————————————— —————— —————————— —————————— —————————— ——————————
          9字节        3字节     5字节      5字节      5字节      5字节

由此可以得到 0x5b250317 对应的目标值是:

0x00000000000000000003255b0000000000000000000000000000000000000000

目标值转换为Bits

将目标值转换为 Bits, 需要找到第一个非零字节并往后取3个字节, 然后计算其左移的字节数。

以上面的目标值为例, 第一个非零字节是 0x03, 包括其自身在内的后三个字节是 0x03255b, 左移了 23 个字节, 转换为 16 进制为 0x17

得出 Bits 字段为 0x1703255b

如果第一个非零字节值大于或等于 0x80, 则需要往前进一个字节, 以确保系数不会被解释为负数。 例如目标值是

0x000000 008004 04cb00000000 0000000000 0000000000 0000000000 0000000000
  —————— —————— ———————————— —————————— —————————— —————————— ——————————
  3字节   3字节      6字节        5字节       5字节      5字节      5字节

第一个非零字节是 0x80, 往前进一个字节后, 系数为 008004, 左移了 29 个字节, 转换为 16 进制为 0x1d

得出 Bits 字段为 0x1d008004

比特币使用自定义的 uint256 编码, 当系数大于 0x800000 时会被解释为负数。而目标值显然不能为负数。

0x800000 转换为二进制为 1000 0000 0000 0000 0000 0000 二进制的最高位是符号位, 设置为 1 表示负数。

  • 系数只取 3 个字节可能会导致无法表达完整的目标值。但总体上还是接近目标值, 只是有一些精度上的损失, 并没有太大的影响。

  • 节点内部会计算完整的目标值。

相关RPC

获取区块模板
参数列表
参数名类型必选默认值描述
template_requestjson{}控制区块模板返回的内容
相关返回值
名称类型描述
versionstring区块版本号
previousblockhashstring前一个区块的哈希
curtimenumber当前时间戳
targetstring目标值
bitsstring目标值的压缩格式
heightnumber区块高度
transactionsarray建议包含的交易列表
获取当前的难度值
返回值
名称类型描述
nnumber当前难度值
Copyright © 2024 HeapUp