作者:Nadav Kohen
谨慎日志合约(Discreet Log Contract,DLC)是兼容比特币的非托管型信息断言机合约。该合约会根据某个“现实世界”发生的事件结果对参与者锁定的比特币进行结算,事件结果由一组信息断言机(oracle)声明。在本文中,我们将深入分析 DLC 用户应该警惕的信息断言机失败案例以及缓解措施。
如果你想要了解 DLC 是什么,它是如何运作的,以及如何在单个 DLC 合约中使用多个信息断言机,欢迎阅读我们之前发布的相关博客文章。
对于依赖“现实”事件执行合约的数字合约机制来说,信任是最基本的需求,DLC 也不例外。该需求通常被称为“信息断言机难题(The Oracle Problem)”,但是我发现这个名称具有误导性。信息断言机难题不是一个“可解”的问题,但这个名称听起来像是能够找到某种免信任的方式来使用信息断言机。无论如何,如果信息断言机无法或没有提供与实情一致的数字声明(digital attestations),则依赖于这些信息断言机的数字合约将无法正确执行。
目前有很多旨在减轻信息断言机信任问题的提案。其中最简单、最常见的提案是使用多个信息断言机来避免单点故障问题。我们可能会在之后的博客文章中探索基于激励、质押和追索等概念的缓解措施。但是,在本文中,我想要聚焦于在最严重的信息断言机故障发生时,DLC 会受到什么影响。
我们先来介绍信息断言机故障是什么,再以使用多个断言机的 DLC 为例,探究 DLC 是如何应对断言机故障的。总的来说,信息断言机故障有三类:错误声明、无声明和多重声明。了解这些故障场景对于理解 DLC 断言机需要何种信任来说至关重要。对于断言机运营者来说,断言机故障也是必备知识。
错误声明
所谓错误声明,就是信息断言机为某个未发生的事件做了数字声明。例如,比特币价格达到 6 万美元时却发布其只有 6000 美元的数字声明;某队在球赛中明明输了,断言机却说其赢了;明明是晴天,断言机的数字声明却说是雨天。
假设某个 DLC 只使用一个信息断言机,且该断言机为事件结果发布了错误声明,该 DLC 就会将错就错,从而造成资金损失。在上述例子中,DLC 会按照比特币价格是 6000 美元、落败队伍获胜和下雨天的结果执行。在单一断言机案例中,DLC 将该断言机的声明当作唯一事实来源。
错误声明有可能是断言机作恶的结果。例如,断言机因为想要伤害某些 DLC 参与者,或收受贿赂,或成为毫无防备的用户的对手方 而采取欺诈手段,以便卷款跑路。
错误声明也有可能是多种形式的人为错误造成的。例如,手动输入数据时出错(可能出现在断言机本身或断言机的数据源)、断言机软件(或硬件)出现漏洞、事件结果模棱两可或存在争议。
最后,错误声明可能是由针对断言机的攻击导致的。例如,任何盗取断言机私钥的攻击、断言机受到其数据源的欺骗或操控,或者像是攻击者劫持断言机及其数据源之间的通信信道这样的中间方攻击。
无声明
假设某个 DLC 只使用一个信息断言机,且该断言机没有生成任何有效的事件结果声明,该 DLC 就会在合约到期时退还用户的质押物。如果断言机没有生成声明,或为某个不包含在该断言机的承诺结果集内的结果生成了声明,则视该断言机为没有生成有效声明。由于 DLC 不会区分这两种故障情况,我将它们统称为“无声明”。
就像上文提到的错误声明那样,如果某个断言机怀有恶意,意图伤害某些用户,或收受贿赂,或悄悄成为 DLC 中的对手方从而敲诈对手,它可能会拒绝生成声明。
如果某个断言机因丢失私钥或 DoS 攻击而无法生成声明,同样会导致无声明故障。针对断言机的 DoS 攻击包括 DLC 用户试图在现实事件结果不利的情况下关闭断言机服务器以获得退款,或受到断言机信任的第三方(例如,云计算提供商)发起审查攻击。最后还有针对特定 DLC 客户端的 DoS 攻击,旨在防止 DLC 收到已经生成的断言机声明,但是我们可以从客户端软件内部和外部(例如,使用瞭望塔)采取措施来防范这种攻击。
多重声明(歧义)
多重声明指断言机模棱两可地声明多个事件结果同时存在。例如,声明比特币的价格既是 6000 美元,又是 6 万美元,或声明两支对垒的球队都赢得了篮球比赛。这类断言机故障又叫歧义。
大多数 DLC 断言机产生歧义的情况都是因为断言机的私钥通过一个叫作 nonce 重用的流程遭到泄露。在这类情况下,断言机不只为两种不同的结果提供了声明,从功能上来说更是为所有可能的事件结果提供了声明,因为用户可以使用该断言机的私钥生成任意声明。
假设某个 DLC 只使用一个断言机,且该断言机生成了多重事件结果声明,该 DLC 可以使用任意一个事件结果声明进行结算。这实际上会引发 DLC 参与者之间的竞争(假设他们不愿意合作的话),他们会试图使用对自己最有利的结果进行结算,而首个实现交易上链的参与者就是胜出者。
虽然从技术上来说断言机确实能够恶意生成多重声明,但是在大多数情况下这么做不是很合理,因为生成错误声明对断言机来说更为有利,这样就不用泄露私钥,从而避免自己或共谋者陷入激烈竞争之中。
多重声明故障更有可能发生在断言机私钥遭到泄露,或断言机在手动输入、软硬件方面出错之时。
示例:使用 2/3 多断言机设置
在仅使用单个断言机的 DLC 中,一旦断言机发生故障,合约就会发生故障,因为使用虚假的事件结果而失去(本该得到的)资金,或因为退款而失去(本该得到的)资金,或因为在竞赛中失败而失去(本该得到的)资金。使用多个断言机执行 DLC 能够避免单点故障。
现在,以一个(可以说是)最简单的多断言机设置(共有 3 个断言机,其中任意 2 个断言机一致认同的结果会被认定为事实)为例,我们来探索所有可能的故障情况:
- 成功场景
- 无断言机故障:3 个断言机达成共识!
- 单一断言机故障(任意一种)
- 2 个断言机达成共识,出故障的断言机被忽略
- 退款场景
- 3 个相互矛盾的断言机声明
- 至少有 2 个断言机提供互相矛盾的错误声明
- 2 个互相矛盾的断言机声明和 1 个沉默的断言机
- 存在 1 个非声明和至少 1 个错误声明
- 存在 2 或 3 个沉默的断言机
- 3 个相互矛盾的断言机声明
- (本该得到的)资金损失场景
- 2 个一致的虚假断言机声明
- 这导致 DLC 将获得共识的谎言当作事实执行
- 1 个错误声明和 1 个歧义。
- 如果产生歧义的断言机的私钥泄露,就会引发 DLC 参与者之间的竞争,最终会按照真实结果或被错误声明的结果结算。如果私钥没有泄露,就只会执行错误声明的结果,这必然会造成损失。
- 如果第 3 个断言机沉默不语,即使产生歧义的断言机的私钥泄露,也只会执行错误声明的结果,这必然会造成损失。
- 2 个产生歧义的断言机
- 如果 2 个断言机的私钥泄露,就会引发 DLC 参与者之间的竞争,任何结算交易都是有效的。
- 如果只有 1 个断言机的私钥泄露,就会引发 DLC 参与者之间的竞争,最终只会按照真实结果或经由私钥未泄露的断言机声明的虚假结果结算。
- 如果 2 个断言机的私钥均未泄露,有可能出现 3 种情况:1、二者就同一个结果达成共识并根据该结果进行结算(将错就错);2、二者就多个结果达成共识,引发 DLC 参与者之间的竞争;3、二者没有就任何结果达成共识,最终导致退款。
- 2 个一致的虚假断言机声明
这一示例告诉我们,使用多个断言机能够有效避免单点故障,并在一定程度上防范多点故障问题。使用的断言机越多(例如,3/5、4/7 等),DLC 就越健壮,因为只有当更多断言机出故障时才会影响 DLC 结算。(请注意,只有当新增断言机可信时才会如此,例如,随机添加断言机并不会提高安全性。)
敬请期待更多关于 DLC 和信息断言机的内容!如果你想要了解更多信息,欢迎阅读以下资料。
(完)
Nadav Kohen 2022-03-18
https://www.btcstudy.org/2022/03/18/dlc-oracle-failure-cases/