分布式账本和智能合约能消解当前人类交互协作中由信任问题带来的摩擦,为社会带来史无前例的巨大革新。不过在此之前,如果以上智能合约无法无需额外信任地获取链外输入,那么所谓的创新也不过流于纸面。
去中心化预言机是智能合约和外部世界交互的网关,旨在正常工作的同时不过分依赖单一信源。如何让去中心化预言机落地实施也将引起另一股创新的浪潮。
本文旨在引介以下几点内容:
- 为什么预言机服务是去中心化技术
- 栈中的重要组成部分对免信任型服务的需求
- 预言机面临的复杂挑战及攻击界面
- 8 个致力于解决上述难题的项目的概述
I. 我们为什么需要预言机?
无许可链(例如以太坊、Dfinity)上的智能合约运行在有敌手的环境中,其安全性是由仅在网络传播确定性交易(即被所有节点验证过的交易)保证的。
智能合约的设计思路是:接受输入 → 执行逻辑 → 更新相应的区块链状态,且这一过程是不可逆的,在区块链的世界里没有 Ctlr+Z 回撤。
允许智能合约从区块链系统外部获取数据是一把双刃剑,在极大地拓展区块链应用场景,赋能区块链与外部世界交互的同时,它也引入了一定的信任难题。无许可链中的矿工没有把握能验证所有的外部输入,因此只能无差别地执行任何符合智能合约预置条件的操作。
举个简单的例子:Alice 和 Bob 对比特币在伦敦时间 2019 年 1 月 3 日下午 2 时的价格打赌。他们用智能合约设立赌局,各自向合约中存入 1 个以太币,如果比特币价格高于 $4,200 ,那么 Alice 赢得 2 个以太币,否则 Bob 获得 2 个以太币。智能合约不懂比特币的价格,并且的赌局的结果一旦确定就无法逆转,因此我们一定要保证只向合约上报正确的比特币价格。
这时候,我们就需要所谓的预言机(用来提供数据的组件)。预言机是对世界状态的声明进行签名的实体。
举例来说,预言机可以报告 1 月 3 号 Coinbase 的 BTC/USD 价格,也可以报告欧冠联赛的冠军。最终信息是通过一个或多个预言机所采信的一个或多个可信信源消息进行聚合重整得到的。
在深入讨论免信任型预言机的诸多技术细节之前,我们先来看 5 个经预言机赋能后的智能合约关键用例。
-
金融产品
智能合约和许多金融产品天然契合:利率掉期、现金结算期权、去中心化杠杆交易等等。
上述金融产品都需要去信任的数据源来保障链上结算的正确执行。
有些项目有能力甚至已经把这样的预言机应用到了金融产品之中,包括:CDx、dYdX、MakerDAO、Vega Protocol、0x protocol 。
-
智能合约保险
在免信任且可靠的信源加持下,某些保险产品可以通过编程以智能合约的形式实现。保险业中最大的成本是欺诈,所以预言机的重要性不言自明。目前智能保险的一些项目案例包括:
- Etherisc 和 Fizzy 实现了航班延误的自动赔付。
- Nexus Mutual 让受激励驱动的本地预言机验证本地尚未发布的断言,并上报给区块链。
- FlyingCarpet 实现人工智能和地理数据的新型可编程保险。
-
货运
GPS 并不是 dApp 根据地理位置自动释放酬劳的合理数据源,因为它是个容易被欺骗的中心化系统。而利用预言机就能降低这个信任成本,以 FOAM 为例,它能降低 dApp 对原始数据源的信任门槛,将信任依赖到去中心化的网络中(在这个场景里就是一个位置预言机)来保障信源所声明位置信息的可信。
-
抵押借贷和稳定币
在抵押借贷和稳定币的场景中,需要接入判定抵押品价值的可信数据来决定是否需要清偿债务。
当稳定币币值与设计值相差过远时,也需要通过预言机获取到币值数据,来判断是否需要采取措施稳固稳定币的价值。
举例来说,Maker DAO 的 DAI 是由以太币背书的稳定币(马上会升级为多种资产背书),它在设计中使用了多个预言机来报告以太币的价格,使得当所放出的稳定币没有足够多抵押品背书时及时触发清偿操作,从而保护整个系统。
这些预言机是由 Maker 代币的持有者选择并资助运行的。在去信任点对点借贷平台 Ethlend 和 Dharma 中也有着类似的设计。
-
预测市场
去中心化预测市场( Augur,Gnosis )将人类协作带向了史无前例的一个新高度,充分利用了群体的智慧。这些市场必须依靠一个或多个预言机来判定链下事件。
II. 确保预言机的诚实
区块链在构建时故意隔离了外部世界和需要额外信任的第三方。
然而,大部分的事件还是在链外发生,因此我们要在不损害抗审查性的前提下桥接区块链与链外世界。
事实上,dApp 的免信任性取决于链内链外世界纽带中最脆弱的那一条,因此仅仅一个可能会被腐化的信源是远远不够的。
接入多条信源能在概率上取得更高的安全性,不过相应会增加很多成本。具体运用场景所需的信源数量可能有多有少,实际应用中我们应当采取一种基于风险的设计思路来决定不同应用程序需要多少条信源。
以伦敦的气温数据为例,如果仅仅用在手机 app 上的数据展示,即使数据出了问题也不会有严重后果,那使用一个预言机(例如 API)也就足够了;而如果预言机上报的温度决定了价值 1000 万美金的保险合约的赔付结果,我们就有必要接入很多预言机,包括卫星数据、本地传感器数据等等。
总的来说,需要根据涉及资金量的大小来平衡所建立预言机系统的成本,在实际应用中找到适合自己场景的预言机方案。
瑞士奶酪模型
要想保证第三方一直不作恶是很难的。在中心化世界里解决这个信任问题要使用多个保护层:合约、可信赖的公司、保险、法律等等。只要至少还有一个保护层没有失灵,就可以认为系统依然是诚实的。然而如果所有的保护层都被腐化堕落了,那攻击就生效了(瑞士奶酪模型)。-适配瑞士奶酪模型(图源)-
LIBOR 丑闻就是过度依赖中心化预言机的一次教训。伦敦同业拆借利率(简称 LIBOR )是商业和私人贷款中常用的利率参照,支撑了约 300 万亿美金的贷款。然而根据 thesources 报道,最早可以追溯到 2005年 或 2003 年,这一指数就遭到了某些掉期交易员的合谋操纵。LIBOR 同时也是评价银行运行状况是否良好的指标,因此对此利率的操纵也导致了在 2007-2008 金融危机期间某些机构看起来比他们的实际情况更健康。
所以此处我们再次强调单一(未经审计)的信源是无比脆弱的,它会影响所服务的系统的安全性。世上没有完美的系统,但我们可以将多重屏障的概念应用到去中心化的预言机系统中,从而尽尽可能完善最小化信任机制。
A. 多重数据源
减少数据失误的最简单办法是用预言机把多重数据源聚合起来。这样以来,只有两种可能收集到离谱的数据:一是大部分数据源都腐化了,二是预言机本身被攻破了(变成了一个单点故障问题)。
B. 多重预言机
当增加预言机数量时,依概率大多数预言机不会是恶意的,因此只要系统中的多数仍保持诚实,那系统就是安全的。然而无论是有意操纵还是无意为之(信息源本身失效),此时都没有排除所有预言机都传递错误信息的可能。
C. 利益共享
去中心化网络可以制定特定的激励机制,以保证网络参与者的行事准则和网络的整体利益一致。当网络参与者按照规则活动时就能获得奖励,比如说矿工挖矿可以得到区块奖励,权益证明系统需要罚没条件来抵御女巫攻击和无利害关系攻击。让去中心化网络中的匿名参与者充当预言机十分危险,在去中心化系统中,一旦他们作恶来获取经济利益,也尚未有法律条文来追索那些不义之财。利用代币工程的设计,能强制去中心化网络中的节点质押一部分 保证金/存款,这些资产通常是系统中的原生货币。当节点好好工作时,会获取一定的酬劳,而如果节点作恶,就会按一定比例失去所质押的资产。上述机制保证了预言机系统有正向的激励机制来促进参与者生成准确数据。
D. 可信执行环境(TEE)
英特尔最近的 SGX (Software Guard eXtensions)和 ARM 的 TrustZone 都属于可信执行环境,
由于二者较为相似,我们下面以英特尔的产品为例作介绍。
简而言之,SGX 允许程序在 CPU 的围圈(enclave)中执行,为用户级别的代码赋予了硬件层面的保护。首先,围圈避免了应用程序(数据、代码和控制流)受到其它进程的破坏。
其次,围圈保护了应用程序的机密性,即程序的数据、代码和执行状态在理论上对剩下部分的操作系统不透明,但程序依然可以读写围圈区域以外的内存。SGX 希求能在恶意操作系统上保护围圈中的程序,也因此甚至能保护应用程序不被节点上的系统管理员破坏。
在围圈中运行预言机程序并分发数据能强有力地确保预言机程序的安全运行,因为可以从远端检测到系统是运行在合法的 SGX 系统之上。不过值得留意,在 SGX 发布后已经有两个漏洞 (March-2018 & July-2018) 相继被发现,并且目前还有研究在探索一些其他的漏洞。尽管第一个漏洞已经被修复,但这警示着我们只采用 TEE 仍然会造成单点故障。当智能合约的执行依赖于来自一个或多个预言机自动生成的输入时,必须设计多重保护层来避免单点故障。上述保护屏障单个抽离出来不能算是万无一失,但当它们联合起来共同作用时,能起到更强有力的保护效果。在下一节中,我们将介绍去中心化预言机系统中的主要攻击界面,并举例说明对应的防御措施。
III. 女巫攻击和其它去中心化系统的弱点
造一个预言机系统并不难,难的是其中去信任成分的设计。
关键风险:依赖智能合约裁决事务的各方之间是存在利益冲突的,而匿名的预言机没有诉讼风险。当运行多重预言机系统时,各个预言机必须达成共识,因为智能合约只接受一个输入。因此为了防御攻击,需要设计机制来保证预言机满足以下要求:
- 无法互相辨认
- 无法互相通信:一个有着相当大投票权力(譬如说 40% )的预言机能广播自己的答案,而且不需要刻意说服其它节点自己的结果是主流答案。不过如果其它节点已经知道这个节点具备如此大的投票权力,那这个要求也相对没什么意义了。
- 无法向其他节点证明自己是自己答案的所有人:和上一点类似,需要设计机制来隐藏各节点提交的答案,同时只有在所有人都提交答案之后才暴露其来源节点。
以下的攻击策略或漏洞对去中心化的预言机网络是有效的。
多数人攻击:存在这样的风险,即网络中大多数的节点都是由一个实体或是一个同盟来控制的。此时网络依然是由多数人控制,但已经被恶意操纵了。在去中心化的预言机网络项目中要尤其注意此类风险,需要根据节点的信誉和节点总数来决定节点的权力。
镜像:这是去中心化预言机网络中一种特殊的女巫攻击。为了降低节点运行的成本,某个节点的控制人可以只通过一个节点收集一次数据,然后在链下将数据传递给自己控制的其它节点。当他传递的数据依然真实时,这种攻击并没有很大危害,但如果所传递的数据有问题,它会大大降低整个系统的安全性 ,因为系统通过多方查询来提炼数据准确性的机制被破坏了。
吃空饷:当一个预言机恶意复制其它预言机的答案时,我们称他为吃空饷。可以通过“提交-揭露”(commit-reveal)机制来解决这种问题,即预言机所提交的答案是加密的,只有当足够多预言机都已经提交过答案后,才解密全部人的答案。
数据腐败难以被探查,特别是当只有一个信息源(单点故障)时。此问题的解决思路通常是设立多个信息源和多个预言机,以降低数据腐败的风险。
链上数据机密性:如果数据的请求既敏感又私密,即使加密了数据请求,最终数据上报时也会不自觉地揭露该请求信息。这个问题的解决思路是强制节点在 TEE 围圈环境中执行解密,并向区块链汇报所有用户和节点都能看到的通用答案。举例来说,对于一个航班保险,用户可能不想要别人知道他要从伦敦飞到纽约。因此预言机在知道具体航班之后,只在区块链上回答“那一趟航班是否延误了?”,或者其它只需用 是/否 来回答、而无需进一步披露信息的问题。