SynFutures 提出了一个完全透明且无需信任的比特币挖矿难度预言机,任何人都可以提交新生成的比特币区块头来更新 BTCHASH 现货指数。

撰文:SynFutures
编译:PerryWang

SynFutures 推出 BTC 哈希率期货的去信任预言机,简述其工作原理
SynFutures 团队推出的 BTC 哈希率期货(BTCHASH),与给定难度级别下每 PH/s 哈希率在难度重置期(大约 14 天)的预期 BTC 区块奖励挂钩。矿工可以用 BTCHASH 对冲比特币挖矿难度的波动,以锁定未来的挖矿奖励。

根据比特币网络的激励模型,给定每个 BTC 区块头中的当前挖矿难度,可以轻松计算出 1PH/s 哈希率的预期挖矿奖励。比特币挖矿难度仅在 2016 的倍数区块高度重置,在中间区块保持不变。

这种不活跃的现货指数对链上衍生产品没有指示意义——BTCHASH 更喜欢连续且接近实时的现货指数。要实现这一目标的简单方法是让 SynFutures 团队定期上传链下计算的现货指数。但如果这样做,团队将在个生态系统中取得中心化控制,与 BTCHASH 的无需信任特色背道而驰。

在对比特币的区块链结构和中本聪共识的完整规则进行深入研究后,我们确信构建一个为 BTCHASH 提供所有必要信息的链上预言机是可行的,同时保留其无需信任的特质。其设计原理必须确保没有人可以操纵现货指数。

这个想法很简单——所有需要的信息都可以从 80 字节的比特币区块头中推导出来。只有满足中本聪共识的区块头才会被考虑。使用智能合约实现验证逻辑,我们提出了一个完全透明且无需信任的比特币挖矿难度预言机,任何人都可以提交新生成的比特币区块头来更新 BTCHASH 现货指数。

虽然想法很简单,但由于比特币区块链存在潜在重组,以及中本聪共识所允许的巨大时间戳漂移,其中的工程工作可能非常复杂。为了处理重组,我们在安全性假设下构建了预言机,即 10 个区块后被认为是最终确定。因此,预言机始终跟踪最近 12 个区块头。

当提交新区块头时,预言机要求交易中第一个区块头 hashPrevBlock 必须指向预言机已知的最新 10 个区块之一。此外,交易中最后一个头部的区块高度必须大于最新头部的区块高度。另外还执行其他检查,以根据中本聪共识验证区块头,包括哈希链验证、针对挖矿难度目标的区块头验证,以及链重组的累积工作处理。

为了充分理解时间戳漂移问题,让我们回顾一下比特币区块头的结构。80 字节的比特币区块头由表中列出的 6 个字段组成。
SynFutures 推出 BTC 哈希率期货的去信任预言机,简述其工作原理
请注意,Version 字段最初用于指示区块版本,但区块验证过程不会对该字段执行严格的规则。如今,矿工在进行繁重的挖矿工作时倾向于循环访问 Version 和 Nonce 字段。hashPrevBlock 构成了比特币区块链,hashMerkleRoot 则是该区块中所有交易的数字指纹。

nBits 字段是以紧凑格式表示的当前挖矿难度目标,并将在难度重置期间保持不变。时间戳(Timestamp) 字段用于记录区块创建时间,因此自然会随着区块高度的增加而简单增加。不过,由于缺乏全球网络时钟和不同节点之间可能存在时间漂移,中本聪共识在这个字段只执行了一个松散的规则。

这种松散的规则导致了巨大的 Timestamp 间隔(数千秒),即使在两个相邻区块之间也会出现这种情况。Timestamp 字段的这种不可靠性对预言机的构建提出了重大挑战。但我们相信,可以以一种高效而优雅的方式解决这一问题。

nBits 字段所代表的挖矿难度目标仅在 2016 倍数的区块高度处重置,根据上一阶段(之前的 2016 个区块)的开始和结束区块的 Timestamp 差异。为了获得实时的挖矿难度目标,我们可以很容易地在每个区块高度遵循相同的难度目标重置规则。也就是说,我们使用过去 2016 个区块的移动窗口来计算出一个区块加权难度目标,作为现货难度指数。

请注意,过去 2016 个区块可能属于 2 个阶段。假设难度目标用 Target0 表示,Target1-288 个区块属于上一阶段,1728 个区块属于当前阶段。如果是这种情况,则当前难度目标计算方式如下:

当前难度目标 = Target0 * 288/2016 + Target1 * 1728/2016。

如果 Timestamp 差异是实际时间跨度,则下一个区块的新目标计算如下:

新难度目标 = 当前难度目标 * 实际时间跨度 / 目标时间跨度

这种方法的美妙之处在于,这种区块加权难度目标在重置区块时可以确定地汇合成实际难度目标。

现货难度指数与 BTCHASH 现货指数价格直接挂钩,进而影响 BTCHASH 的标记价格。由于标记价格是用来判断账户是否有足够的保证金,因此我们必须尽最大努力消除异常价格跳动,以保护我们的用户。

仔细观察新难度目标(newTarget)的计算方式,人们会注意到实际时间跨度是根据比特币区块头中上述不可靠的 Timestamp 字段计算的。这意味着矿工可能会滥用有关 Timestamp 字段的宽松规则,来操纵现货难度指数。

关于时间戳的宽松规则规定:如果时间戳大于前 11 个区块的时间戳中值,并且小于网络调整时间 + 2 小时,则该被接受为有效。「网络调整时间」是所有连接节点返回时间戳的中位数。因此区块时间戳并不完全准确,也不需要准确。区块时间只能精确到一两个小时之内。(请注意,用合约来表达网络调整时间限制部分是不可行的,因为在全网层面对网络调整时间没有达成共识。)

如前所述,我们采用移动窗口方法,仅使用区块头来推断实时难度目标。直观地说,我们预计开始和结束区块的时间戳会随着区块高度的增长而单调增加。不过从 Timestamp 字段的松散规则来看,两端都没有这样的保证。在这种情况下,我们如何降低时间戳漂移风险?另一方面,计算实际时间跨度需要合约存储和维护最新的 2016 个区块的时间戳,意味着初始化预言机和提交区块头时会消耗相当多的 Gas 费用。

为了解决我们讨论的所有问题,SynFutures 针对移动窗口的两侧构建了不同的解决方案。在结束端,我们只遵循中位数时间戳——也就是说,点难度目标不是根据最新的区块头计算的,而是根据具有中位数时间戳的区块头计算的。这是可行的,因为预言机总是存储最近的 12 个区块头。这样我们得到中本聪共识的保证,移动窗口的结束侧永远不会过时。在开始端,我们不是存储所有 2016 个区块的时间戳,而是每 144 个区块存储一个区块的时间戳。其他区块头被视为均匀分布。

由于没有时间戳漂移会大于 24 * 60 * 60 (秒),我们可以保证移动窗口的左侧将始终延伸到未来。更妙的是,单个区块头的时间戳漂移以这种方式被 144 个区块分摊。我们用大约 300 行 Solidity 代码实现了这个完整的逻辑。提交 12 个区块头所产生的 Gas 费用约为 27 万单位。现货难度目标平稳移动,并始终如预期的那样,汇合到到中本聪共识指定的值。


SynFutures 简介

SynFutures 是一个即将推出的金融衍生品协议,目前处于 V1 封闭 Alpha 阶段。该团队融合了加密原生族与华尔街顶级大咖,其理念是为以太坊和其他第二层(L2)/ 侧链上的未来 DeFi 衍生品构建坚实的基础设施。2021 年 6 月,SynFutures 宣布获得 1400 万美元的 A 轮融资,由 Polychain Capital 领投,Framework、Pantera Capital、Bybit、Wintermute、CMS、Kronos 和 IOSG Ventures 参投。2021 年初,SynFutures 宣布了由 Dragonfly Capital 和 Standard Crypto 支持的种子轮融资。

您可以访问该 项目网站,以 注册 V1 封闭 Alpha 抢先体验。或在 Medium / Twitter / Telegram / Discord 上参与讨论。

如果您想了解更多信息,我们还有一个关于哈希率期货的常见问题解答。敬请在 Telegram 或 Discord 上联系我们的管理员。

请点击我们的 官网 或在 Medium / Twitter / Telegram 和 Discord 加入讨论。

请加入我们的社区 !👪

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4 × 2 =