2个版本 (1个稳定版)

1.0.0 2024年3月22日
0.1.1 2024年2月15日

加密学类别中排名536

Download history 1/week @ 2024-05-06 21/week @ 2024-05-20 24/week @ 2024-05-27 28/week @ 2024-06-03 21/week @ 2024-06-10 37/week @ 2024-06-17 24/week @ 2024-06-24 13/week @ 2024-07-01 60/week @ 2024-07-08 109/week @ 2024-07-15 52/week @ 2024-07-22 51/week @ 2024-07-29

每月下载量272
5个crate中使用(通过roles_logic_sv2

MIT/Apache

140KB
2.5K SLoC

挖矿协议

通道

该协议设计为下游设备(或代理)在建立的连接内与上游stratum节点打开通信通道。上游stratum端点可以是实际的挖矿服务器或进一步向上传递消息的代理。每个通道标识与授权用户关联的专用挖矿会话。上游stratum节点接受工作提交,并按通道指定挖矿目标。

理论上,在单个物理连接到上游stratum节点的连接中可以存在高达2^32个打开的通道。所有通道相互独立,但共享服务器广播的一些消息以提高效率(例如,关于新prevhash的信息)。每个通道由其channel_id(U32)标识,在整个连接的生命周期中保持一致。

代理可以透明地允许其客户端与服务器分别建立连接(推荐行为),或者将下游设备打开的连接聚合到与服务器自己的连接中,并相应地转换消息(主要用于允许v1代理)。这两种选项都有一些实际的应用场景。在任何情况下,代理都应该将客户端的通道聚合到更少的TCP连接中。这样可以节省由服务器发送的广播消息的网络流量,因为总共需要发送的消息更少,从而降低延迟。此外,它还通过允许发送更大的数据包来提高效率。

该协议定义了三种类型的通道:标准通道扩展通道(挖矿会话)和组通道(组织),它们适用于不同的目的。标准通道和扩展通道之间的主要区别在于,标准通道无法操作coinbase交易/Merkle路径,因为它们仅操作提供的Merkle根。我们称之为仅头挖掘。另一方面,扩展通道在搜索空间上具有广泛的控制权,因此可以实现各种高级用例,例如v1和v2协议之间的翻译、难度聚合、自定义搜索空间分割等。

这种分离大大简化了不支持扩展通道的客户端的协议实现,因为它们只需要实现与标准通道相关的协议消息的子集(有关详细信息,请参阅挖矿协议消息)。

标准通道

标准通道旨在由终端挖矿设备使用。一个标准通道(仅头挖掘)对于nTime字段中特定值的搜索空间大小为2^(NONCE_BITS + VERSION_ROLLING_BITS) = ~280Th,其中NONCE_BITS = 32,VERSION_ROLLING_BITS = 16。这是在nTime滚动(或更改Merkle根)之前的保证空间。协议将所有可直接修改的位(版本、nonce和nTime)从区块头分配给一个挖矿通道。这是协议可分配的最小搜索空间单位。打开特定通道的客户端拥有整个分配的空间,并在必要时可以进一步分割它(例如,用于多个哈希板和单个芯片等)。

扩展通道

扩展通道旨在由代理使用。接受连接并提供工作的上游服务器必须支持扩展通道。另一方面,客户端不必支持扩展通道,因为它们可以在终端设备级别仅使用标准通道更简单地实现。因此,提供工作的上游服务器也必须支持标准通道。扩展通道的搜索空间大小为每个nTime值2^(NONCE_BITS+VERSION_ROLLING_BITS+extranonce_size*8)。

组通道

在特定连接中打开的标准通道可以分组在一起,以便通过一个公共通信组通道进行寻址。每当创建一个标准通道时,它总是会放入一个由其group_channel_id标识的通道组中。组通道ID命名空间与特定连接上的通道ID命名空间相同,但为组通道ID选择的价值必须不同。

未来工作

可以提前发送一个空的未来区块工作或预测的非空工作,以加快新的挖矿工作分配。关键是挖矿服务器可能会预先计算这样的工作,并能够预先为所有活动通道分发它。开始挖掘新区块唯一缺少的信息是新的prevhash。这项信息可以独立提供。这种方法提高了协议的效率,其中上游节点在网络中发现新块后不会浪费宝贵的时间。

哈希空间分配

每个挖矿设备必须在整个搜索空间的一个独特部分上工作。整个搜索空间部分由以下区块头字段中的有效值定义

  • nonce头字段(32位),
  • 版本头字段(16位,如BIP 320指定),
  • 时间戳头字段。

用于定义完整搜索空间的块头另一部分是区块中所有交易的默克尔根哈希值,投影到块头中的最后一个可变字段。

  • 默克尔根,通过以下方式确定性计算:
    • 创世交易:通常是4-8字节,可能更多。
    • 交易集:空间几乎无限。Stratum v2中所有角色都必须不使用交易选择/排序来扩展额外的哈希空间。这既源于矿工/池应该能够自由选择其交易集而不受协议干扰的概念,也为了使比特币的未来协议修改成为可能。换句话说,本文件其余部分未描述的矿工对交易选择/排序施加的任何规则都可能产生无效的工作/区块。

挖掘服务器必须频繁且快速地为每个连接/频道(因此每个挖掘设备)分配搜索空间的一个唯一子集,以确保挖掘设备不会耗尽搜索空间。可以通过以下方式定期生成独特的作业:

  • 将独特的数据放入每个连接/频道的创世交易中,和/或
  • 使用来自工作提供者的唯一工作,例如前一个工作更新(请注意,这可能更难实现,特别是在交易选择/排序不用于额外哈希空间分配的要求下)。

该协议明确期望上游服务器软件能够正确管理其客户端的哈希空间大小,并能够快速提供新作业。

依赖关系

~8MB
~101K SLoC