下载
关闭菜单 -

RSK:比特币合并挖矿将持续发展下去

作者:Sergio Demian Lerner,RSK 首席科学家

比特币挖矿简介

比特币挖矿是比特币用来抵抗 Sybil 攻击和为 Nakamoto 共识奠定基础的过程。该过程涉及在选择一系列应用于分类账的有效交易的同时解决计算难题。大部分比特币挖矿现今通过矿池进行。矿池可以缩小矿工的支付差异,但也可以降低其维护成本和带宽要求。矿池遵循客户端-服务器架构,其中矿工或“工人”(客户端) 会连接至 poolserver(服务器)。poolserver 会运行其中一个矿池服务器软件。常见的一些软件有 Ckpool、Btcpool 和 Eloipool。

poolserver 通常通过基于未加密 TCP/IP 的 RPC 渠道与 bitcoind 实例通信。该渠道用于获取有关当前最佳分支的信息以及要挖矿的块的父块哈希。poolserver 还会获取一系列有效的预选交易。这是利用 bitcoind RPC 命令 getblocktemplate 执行的。poolserver 将选择这些交易的子集,从而将它们包含在新的块中。此外,poolserver 通常每隔几秒轮询一次 bitcoind,以检测父块中的变更。为了减少检测新块时的延迟,某些 poolserver 实现通过 p2p 协议连接至 bitcoind,或在块到达时使用 bitcoind blocknotify 命令行选项尽快通知。poolserver 可以利用一个或多个与比特币网络的标准 p2p 连接来提交新创建的块,并且可以与 FALCON 或 FIBRE 等快速块传输主干网通信。

合并挖矿

合并挖矿是一种使用相同挖矿哈希率来保护一级区块链从而保护二级区块链的技术。域名币是第一个与比特币进行合并挖矿的加密货币。合并挖矿通过从二级区块链(最近构建的新块的加密哈希) 嵌入块 id 来执行,同时在一级区块链块的某处正在挖矿。这个二级哈希以一些简短的描述文本或 magic 字节作为前缀,称为合并挖矿“标签”。前缀可以使二级区块链找到该标签。但是,标签位置不得含糊不清:来自一级区块链的块最多只能与二级区块链的一个块关联或不关联。  虽然将加密哈希用于链接可以防止作弊,但链接安全要求远低于传统加密学中的要求。通俗地说,合并挖矿的唯一安全要求是在二级区块链的难度下,创建可以与同一二级区块链中的两个块关联的一级区块链块必须比挖掘两个不同的一级区块链块(每个关联关系一个块)更难。对于 RSK,一级区块链当然是比特币,而二级区块链是 RSK。目前,RSK 块难度相当于 70 位的安全性,而比特币难度相当于 74 位的安全性。 

工作证明代理 

在合并挖矿中,比特币标头仅用作工作证明代理。RSK 区块链必须解释比特币块标头的 PoW 并搜索比特币块中唯一与 RSK 块标头建立关系的标签。因此,它以可传递的方式将比特币块 PoW 转换成 RSK 块 PoW。如上所述,RSK 区块链的难度低于比特币区块链的难度,因此许多没有解决比特币 PoW 难题的比特币块标头将成为 RSK PoW 难题的有效解决方案。让我们深入分析一下这种差别。每个区块链会计算每个块的预期难度。该难度由之前的所有块来定义,从而使块之间的平均时间大致保持不变。从内部而言,难度会转换为“目标”,而“目标”与难度成反比。目标为 256 位无符号整数。

区块链目标
比特币000000000000000000165exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RSK00000000000000000db5a4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
域名币00000000000000000019xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

同一天合并挖矿区块链的近似目标。RSK 具有更高的目标,因为块的频率高出了 20 倍

由于加密哈希摘要不可预测,假设作为块标头内容的加密哈希摘要的块标头 id 表示均匀随机变量。虽然这在理论上可能不正确,但在实际情况中却有效,因为并没有已知的实际方法用于反转比特币(double SHA256) 或 RSK(Keccak) 中使用的哈希函数。若解释为无符号数字,该哈希摘要则必须低于目标,块才能作为 PoW 难题的解决方案。因此,目标越低,解决 PoW 难题的难度就越大。  

SPV 证明

二级区块链无需完整的比特币块来验证比特币标头的 PoW 并将其与 RSK 标头关联。这种关联可以通过 SPV 证明(主要包含 Merkle 树会员资格证明)来证明。下图描绘了该证明的不同部分之间的关系。蓝色方框表示 SPV 证明中包含的信息,需要在 RSK 块上传输。

比特币 SPV 证明可以压缩合并挖矿 PoW 证明

目标层次结构

RSK 目标通常高于比特币目标,因为 RSK 块比比特币块更频繁,因此 RSK 难题较容易解决。所以,解决 RSK PoW 难题的比特币块标头可能无法被比特币网络接受。注意,两个难题均涉及比特币标头的使用,并且实际解决这两个难题需要同样的尝试-错误过程。那么,当矿工希望解决更难的比特币难题时,矿池如何检测并通知更频繁解决的 RSK 难题?答案是,矿工已经在试图解决难度比比特币的要求低得多的块。这些中间块被称为“共享块”,poolsever 需要用它们来进行核算。事实上,是 poolserver 软件命令矿工尝试解决更简单的难题(指定更高的目标)。您可能认为共享块是某种帮助解决实际比特币难题的中间解决方案,但并非如此。共享块无法成为真正的块解决方案。然而,矿工越强大,她在实际解决方案之间为矿池创建的共享块就越多。因此,共享块可以为矿工贡献的核算提供更高的粒度。定期将共享块传输至 poolserver,以使该服务器可以公平地分割所有相关客户端之间的未来收益,以加权其哈希贡献。但是,由于其中一个共享块(碰巧) 可能成为当前比特币 PoW 难题的解决方案,所以也会传输共享块。因此,矿工无需从 poolserver 接收实际比特币 PoW 难题难度(或目标),而且在矿池反馈此结果之前他们通常不知道是否已解决比特币块。poolserver 检查每个收到的共享块,重构块标头;如果标头 double SHA256 哈希摘要在数值上低于与当前比特币难度有关的目标,它会将块转发给 bitcoind 守护程序,然后由 bitcoind 守护程序通过网络传播。由于每个二级区块链可能有不同的难度,具有合并挖矿能力的 poolserver 必须对它处理的每个二级区块链进行这项检查。如果比特币标头是 RSK 区块链 PoW 难题的有效解决方案,它会将比特币块标头发送给 rksj,rksj 将附加相关的 RSK 块并转发它,因为它对 RSK 网络有效。 

注意,对 RSK 而言,poolserver 可以选择仅向 rskj 传输嵌入比特币块的标签的 SPV 证明(稍后会详细介绍这一点),以降低带宽要求。 

下表显示了比特币、RSK 和共享块的近似难度(根据 2019 年 6 月之前为找到难题解决方案迭代的随机数平均数量):

解决方案目标块间隔为找到解决方案进行的随机数迭代平均次数假设
比特币10 分钟274100% 比特币哈希率
RSK30 秒26950% 合并挖矿
挖矿池共享块每个客户端 3.3 秒
25220% 哈希能力,
4000 个客户端
Ckpool 软件

RSK 标签嵌入

RSK 标签包括与二进制数据块连接的 ASCII 标识符“RSKBLOCK:”,它包括正在挖掘的 RSK 块标头的哈希摘要。如前面所述,标签的标识不得含糊不清(不得创建可与两个不同 RSK 块关联的比特币块)。虽然域名币为不同的合并挖矿区块链定义了打包标签的方案,但是提议的方案从未被标准化。因此,为了提高未来兼容性并使 minerpool 软件更加通用,RSK 标签可以位于生成交易中的任何位置(区块的第一个交易,有时也称为 coinbase)。 RSK 标签可以位于生成交易的 coinbase 字段中,或生成交易的任何输出中(通常是一个 OP_RETURN 有效负载)。下图显示了两种可能的方式。

存储在 Coinbase 字段中的 RSK 标签

存储在生成交易的一个输出中的 RSK 标签

当前 RSK 标签格式

RSK 标签的当前格式: RSKBLOCK:RskBlockHeaderHash

“RSKBLOCK:” 是 ASCII 字符串,包含字节:52 53 4b 42 4c 4f 43 4b 3a.

RskBlockHeaderHash 是二进制格式的 RSK 块标头的 Keccak哈希摘要,没有合并挖矿字段,该字段将在解决 PoW 后填写。

将 RSK 标签包含在输出脚本中时,应在 OP_RETURN OP_PUSHDATA1 操作码后包含它,以防止滥发比特币 UTXO,但这并非一致认可的强制要求。

以下额外限制适用:

  • 紧接在 RskBlockHeaderHash 后面直至 coinbase 交易末尾的字节数必须少于或等于 128 个字节。
  • 末尾的原始字节不得包含二进制字符串 “RSKBLOCK:”(52 53 4b 42 4c 4f 43 4b 3a)
  • 如果 RSK 标签位于非最后输入脚本中,RSK 标签碰巧出现在后续输出字节中的概率微乎其微。poolserver 软件不得排除生成交易中包含的流氓比特币地址嵌入标签并用作破坏合并挖矿标头有效性的攻击的可能性。对于在生成交易本身中分配收入的去中心化矿池(例如 p2pool) 而言,这可能是一个问题。因此,我们建议将最后输出脚本用于 RSK 标签。 
  • 如果 RSK 标签位于 coinbase 字段中,“RSKBLOCK:” 作为 Stratum 协议的一部分碰巧出现在内容由解决块的矿工提供的 ExtraNonce2 数据字段中的可能性微乎其微。 此外,矿工可能会恶意地将标签包含在 ExtraNonce2 中。只要 poolserver 在 ExtraNonce2 数据块后添加 RSKBLOCK: 标签,这就不是问题。

标准 P2SH 输出消耗 34 个字节,因此尾部长度限制(标签之后的最大字节数) 通常意味着标签必须位于 coinbase 字段中或在 coinbase 交易的最后 4 个输出内。 

末尾字节限制允许 RSK 全节点创建压缩 SPV 证明,其中包括:

  • 比特币标头(80 字节)
  • Coinbase 交易的 Merkle 分支(约 320 个字节)
  • 消耗 coinbase 交易头部的 SHA-256 的中间状态(32 个字节)
  • 包含 coinbase 交易尾部的 64 字节排列数据块,包括 RSK 标签(最大 169 字节)。如果使用尾部,则协议允许将尾部属于 coinbase 交易的证明用作以指定中间状态开始的自由开头哈希。
  • 目前的 SPV 合并挖矿证明最大长度为 780 字节。

poolsever 软件可以将整个块或该 SPV 证明发送至 rskj 守护程序。如果 rskj 收到一个块,它会解析该块并提取必要的字段以构建 SPV 证明。

RskBlockHeaderHash 由标准 RSK 节点(rskj 守护程序) 创建。  Rskj 公开一个包含“getwork”命令的挖矿 RPC-JSON 接口。poolserver 插件轮询 rskj 守护程序并保持最近的 RskBlockHeaderHash 值以提供给 poolserver。如果共享块哈希足够低,RSK PoW 难题将得到解决,并且 poolserver 会通知该插件,然后由插件通知 rskj 守护程序。 

即将到来的网络升级(也称为 Armadillo) 中的合并挖矿改进

即将到来的 1.0.0 版本具有网络升级功能,可改进合并挖矿标签格式。新格式由 RSKIP110 指定。  变更添加其他信息到 RSK 合并挖矿标签中,以便用户或自动化系统可以做出有关网络健康的明智决策。使用标签监控工具,RSK 网络节点也可以以保护节点免受双重支付攻击的方式自动响应异常情况,并且在未来节点中可以向网络的其他节点传播简明的异常状态加密证明。  

32 字节块标头哈希被具有以下格式的 32 字节字节数组取代:

  • 合并挖矿哈希的 20 字节前缀(前缀)
  • 7 字节承诺父块向量(CPV)
  • 最后 32 个块中的 1 字节叔叔块数量,限制为 255。
  • 4 字节块数(BN)

四个字段必须进行一致检查。简而言之,CPV、NU 和 BN 字段可以使任何监控比特币区块链的节点创建正在构建的 RSK 块并行竞争链图,即使没有传播至 RSK 网络。  RSK 标头的哈希被截短为 20 个字节,因此标签仍占有 32 个字节,以便保持与 poolserver 软件的兼容性。

RSK 合并挖矿安全性

使用工作证明的 Nakamoto 共识理论基于热力学和博弈理论安全性,而不是加密安全性。RSK 合并挖矿对任何可以在不到 30 秒的时间内计算 2^80 次哈希操作的非理性攻击者而言都是安全的。理性攻击者更愿意正当行事,并对仅需要约 2^69 次操作(RSK 块的当前难度)  并且完全由比特币补贴的 RSK 块进行合并挖矿,而不是发起其他攻击。不考虑此攻击与其他合并挖矿系统的远程组合可能性,试图执行 2^80 次哈希操作的非理性攻击者需要投入比理性矿工多 2000 倍的硬件,并且他的电力消耗不会得到补贴。假设他使用类似于最先进比特币 ASIC 的硬件,投资金额将达到约 5 万亿美元(5e12)。但是,对非理性攻击者而言情况更加糟糕,因为他只能产生一个或多个共享同一 RSK 块高工作证明的块,并且我们之后将看到这通常不会为攻击者带来任何金钱收益(1)。因此,这 5 万亿美元将被浪费掉。所以 80 位安全性将在所有组件上达到良好平衡,并且安全性非常弱的组件不会成为攻击目标。为了证明这一点,我们将以简单通俗的方式来评估一下可能的攻击目标。 

首先,RSK 通过非标准加密技巧压缩生成交易。它没有提供完整的生成交易,而只是传输尾部。为了始终能够产生此消息的正确加密哈希,它从 Merkle–Damgård 结构的中间状态而非初始状态开始进行哈希操作。这个 64 字节中间状态沿着尾部传输。安全地使用此技巧需要假设 SHA256 具有更强的属性,称为“ 自由开始碰撞攻击”抵抗力,而且我们需要它至少和暴力破解 80 位一样安全,这是我们的目标安全阈值。SHA-1(已破坏哈希函数) 具有最著名的自由开始攻击,需要约 80 位的暴力攻击。在 SHA256 中没有发现自由开始碰撞攻击,并且最佳结果(2) 对应于 SHA256 减少轮数版本(38/64 轮,需要 2^65 次操作) 中的 fiding 半自由开始碰撞,因此我们可以得出结论,RSK 合并挖矿是安全的。必须注意,在 SHA256 上进行需要 2^80 次操作的假定自由开始攻击对 SHA256 而言是毁灭性的, 而且这使其无法用作安全标准哈希函数,总之比特币会遇到麻烦。但是,若发现此类攻击,RSK 平台可以通过网络升级轻松得到保护,即不用这种加密机巧进行 SPV 压缩,但代价是块大小会略微增加。  然而,如我们之前所述,即使从位安全性的角度而言攻击比合并挖矿成本更低,但其成本效益并不高。

其次,对于即将到来的 1.0.0 版本中哈希摘要的截断,新方案为标签碰撞提供相当于 80 位的安全性。然而,该攻击从理论、经济和计算方面而言均不合理。从计算复杂度的角度来看,80 位碰撞攻击所需使用的内存量是不切实际的(3)。此外,碰撞攻击的 CPU 成本比解决 RSK PoW 难题的成本高 2000 倍(69 与 80 位)。  

从理论的角度以及 RSK 中使用的 DECOR+ 共识的方面而言,由于碰撞只能发生在相同的 RSK 块高上,碰撞块会共享块奖励,因此,如果过去的块奖励约等于新块的奖励,则找到过去块的新兄弟块没有任何好处。攻击者主要在跟自己竞争。出于相同的原因,发现新块的碰撞没有好处;随着难度增加,必须在平均 30 秒的时间内执行,而不是参考叔叔块的 5 分钟。

从经济的角度而言,诚实合并矿工会赚取比特币交易费,因此比特币会补贴合并挖矿,而攻击者必须支付碰撞攻击的全部费用。因此,几乎对 PoW 链接的任何攻击都不具有经济效益。这对 RSK 块哈希上的哈希摘要碰撞和 coinbase 交易哈希上的自由开始碰撞均有效。 

因此,即使考虑到计算效率的突破,我们仍认为标签对于未来 20 年都是安全的。但是,如果计算趋势完全改变,未来网络升级可以轻松地将哈希大小扩展回全部 32 个字节。 

RSK 合并挖矿插件开发

下图显示了标准 poolserver 架构,包括 RSK 合并挖矿插件:

具有与不同网络连接的 RSK 合并挖矿插件的 Poolserver

Poolserver RSK 插件使用两种 JSON-RPC 方法(mnr_getwork 和 mnr_submitBitcoinBlock)与 rskj 守护程序通信。  其他提交方法可以发送较少信息至 rskj 节点,以减少带宽消耗。可以配置 rskj 守护程序的  JSON-RPC 连接端口,并且默认值为 4242。关于方法和数据交换格式的描述,请访问: https://github.com/rsksmart/rskj/wiki/JSON-RPC-API。这些方法将与很多属于 Web3 接口的其他方法一起实现,Web3 接口是连接至 rskj 节点的标准接口。 

RSK 团队开发了几个对 CoiniumServ、Ckpool、Btcpool 和 Eloipool 等多个矿池实现完全有效的插件。其他矿池已实现其自身的插件。我们建议使用 Ckpool 而不是其他矿池软件,因为它经过了优化,并且我们通过大量验证证明合并挖矿不会影响比特币的挖矿性能。 

很快,我们将开设针对合并挖矿插件开发的指导课程,以提供帮助矿池构建有效和可靠的合并挖矿模块的其他提示。

必须注意,由于 RSK 使用 DECOR+ 协议,poolserver 软件可以不断处理矿池客户端发现的所有 RSK PoW 解决方案,即使 RSK 父块已经改变。所有竞争块(称为叔叔块) 都会获得奖励。

结语

40% 到 51% 的比特币矿工目前正在对 RSK 进行合并挖矿,从“热力学”安全性的角度而言,这使得 RSK 成为了世界上最安全的智能合约平台(4)。合并挖矿 RSK 很简单,但必须注意,即使在最恶劣的条件下(例如直接攻击 RSK 网络),也不要改变 poolserver 软件的正常功能。RSK 实验室开发了几个插件,这些插件已针对故障条件进行大量测试,以验证挖矿操作的连续性。此外,还在矿池软件上执行了效率措施,以证明挖矿软件效率未被改变。我们鼓励成群和单独的矿工对 RSK 进行合并挖矿,并参与比特币智能合约革命。如果您需要我们来帮助您设置合并挖矿操作,请在 RSK gitter 社区论坛上联系我们。


(1) 还有一个有趣的攻击是利用标签碰撞为全部具有相同累积难度的几个并行竞争链创建块,并为矿工提供彼此不同的“最佳链”,以防他们同一最佳链中工作。这需要与其他矿工建立直接的点对点连接。如果该攻击者的哈希能力比剩余矿工加起来小,但比每个单独的剩余矿工的哈希能力大得多,则可能有效。然而,此攻击仍比仅执行 51% 攻击以忽略其他矿工块的成本高得多。

(2) https://eprint.iacr.org/2015/350.pdf

(3) 简单碰撞攻击所需的 RAM 内存为  2^80 个哈希摘要(3200 万艾字节)。使用  Oorschot/Wiener 算法,并假设单个处理器可以在 30 秒内执行 2^40 次连续的哈希操作,RAM 内存需求可降低至 32 兆兆字节。

(4)  一旦在块中确认交易,如果没有人消耗一点能源来重写该链,则无法反转。这种能源称为基于 PoW 的区块链的“热力学”安全性。