Skip to content

Latest commit

 

History

History
186 lines (103 loc) · 25.3 KB

File metadata and controls

186 lines (103 loc) · 25.3 KB

预言机(Oracles)

区块链是一个具有确定性、封闭的系统环境,本书到目前为止所有的操作都是基于区块链系统本身的数据,但是这样会割裂区块链本身与外部世界的交流,极大的限制区块链的应用场景。

对于智能合约来说不允许不确定的事情或因素,不管何时何地运行都必须是一致的结果。一旦合约的执行需要触发条件,而这些条件是外信息时,就必须依赖预言机提供服务,通过预言机将现实世界的数据输入到区块链上,因为智能合约不支持对外请求。

允许智能合约从区块链系统外部获取数据是一把双刃剑,在极大地拓展区块链应用场景,赋能区块链与外部世界交互的同时,它也引入了一定的信任难题。无许可链中的矿工没有把握能验证所有的外部输入,因此只能无差别地执行任何符合智能合约预置条件的操作。

举个简单的例子: Alice 和 Bob 对以太币在北京时间 2019 年 1 月 3 日下午 2 时的价格打赌。他们用智能合约设立赌局,各自向合约中存入 1 个以太币,如果以太币价格高于 $300 ,那么 Alice 赢得 2 个以太币,否则 Bob 获得 2 个以太币。智能合约不懂以太币的价格,并且赌局的结果一旦确定就无法逆转,因此我们一定要保证只向合约上报正确的以太币价格。这时候,我们就需要所谓的预言机(用来提供数据的组件)。

预言机是对世界状态的声明进行签名的实体,或者可以这样说预言机扮演着将外部信息写入链上的角色,是整个写入机制的总体。举例来说,预言机可以报告 1 月 3 号 Coinbase 的 BTC/USD 价格,也可以报告欧冠联赛的冠军。最终信息是通过一个或多个预言机所采信的一个或多个可信信源消息进行聚合重整得到的。

这就是区块链为什么需要预言机,因为智能合约无法主动去获取链外的数据,只能被动接受数据。

预言机的起源与发展

根据商业组织形式分类,预言机可以是中心化的单一预言者的机制(如 Oraclize)——中心化预言机,同样也可以是去中心化的多个预言者的机制(如 Chainlink、DOS Network 等)——去中心化预言机。

中心化预言机由单一预言者(Oracle)为服务请求方提供数据,对某一特定的数据服务请求,在请求方指定 n 个数据来源并向中心化预言者发送合约请求后,服务商从 1 个或多个数据来源的接口调用数据,最终反馈给请求方的数据可以是 1 个数据来源的,也可以是从多个数据来源的结果进行汇总。

一般来说,由于单一数据来源的成本远低于从多个数据来源汇总的成本,中心化预言机仅有从最可信的一个数据源调用数据,以实现整个预言机系统的高效运行。去中心化预言机由多个预言者共同提供数据获取服务,利用纠删码(Erasure encoding)技术实现答案冗余,增强整个预言机系统的容错能力。当所有的预言者的规定时间内提交的答案汇总(汇总的方法包括加权平均、中位数或众数的方法,按具体调用的数据而定)后,将汇总后的答案反馈给请求方。

可信预言机

区块链在构建时故意隔离了外部世界和需要额外信任的第三方。然而,大部分的事件还是在链外发生,因此我们要在不损害抗审查性的前提下桥接区块链与链外世界。事实上,dApp 的免信任性取决于链内链外世界纽带中最脆弱的那一条,因此仅仅一个可能会被污染的信源是远远不够的。

接入多条信源能在概率上取得更高的安全性,不过相应会增加很多成本。具体运用场景所需的信源数量可能有多有少,实际应用中我们应当采取一种基于风险的设计思路来决定不同应用程序需要多少条信源。

以北京的气温数据为例,如果仅仅用在手机 app 上的数据展示,即使数据出了问题也不会有严重后果,那使用一个预言机(例如 API)也就足够了;而如果预言机上报的温度决定了价值 1000 万人民币的保险合约的赔付结果,我们就有必要接入很多预言机,包括卫星数据、本地传感器数据等等。

总的来说,需要根据涉及资金量的大小来平衡所建立预言机系统的成本,在实际应用中找到适合自己场景的预言机方案。

奶酪模型

要想保证第三方一直不作恶是很难的。在中心化世界里解决这个信任问题要使用多个保护层:合约、可信赖的公司、保险、法律等等。只要至少还有一个保护层没有失灵,就可以认为系统依然是诚实的。然而如果所有的保护层都被穿透了,那攻击就生效了(瑞士奶酪模型)。

所以此处我们再次强调单一(未经审计)的信源是无比脆弱的,它会影响所服务的系统的安全性。

世上没有完美的系统,但我们可以将多重屏障的概念应用到去中心化的预言机系统中,从而尽尽可能完善最小化信任机制。

A. 多重数据源 减少数据失误的最简单办法是用预言机把多重数据源聚合起来。这样以来,只有两种可能收集到离谱的数据:一是大部分数据源都污染了,二是预言机本身被攻破了(变成了一个单点故障问题)。

B. 多重预言机 当增加预言机数量时,依概率大多数预言机不会是恶意的,因此只要系统中的多数仍保持诚实,那系统就是安全的。然而无论是有意操纵还是无意为之(信息源本身失效),此时都没有排除所有预言机都传递错误信息的可能。

C. 利益共享 去中心化网络可以制定特定的激励机制,以保证网络参与者的行事准则和网络的整体利益一致。当网络参与者按照规则活动时就能获得奖励,比如说矿工挖矿可以得到区块奖励,权益证明系统需要罚没条件来抵御女巫攻击和无利害关系攻击。

让去中心化网络中的匿名参与者充当预言机十分危险,在去中心化系统中,一旦他们作恶来获取经济利益,也尚未有法律条文来追索那些不义之财。利用代币工程的设计,能强制去中心化网络中的节点质押一部分 保证金/存款,这些资产通常是系统中的原生货币。当节点好好工作时,会获取一定的酬劳,而如果节点作恶,就会按一定比例失去所质押的资产。上述机制保证了预言机系统有正向的激励机制来促进参与者生成准确数据。

D. 可信执行环境(TEE) 英特尔最近的 SGX (Software Guard eXtensions)和 ARM 的 TrustZone 都属于可信执行环境,由于二者较为相似,我们下面以英特尔的产品为例作介绍。

简而言之,SGX 允许程序在CPU强化的围圈(encalve)中或者内存中可执行的保护区域,为用户级别的代码赋予了硬件层面的保护,即使在受攻击的平台中也能提高安全性。首先,围圈避免了应用程序(数据、代码和控制流)受到其它进程的破坏。其次,围圈保护了应用程序的机密性,即程序的数据、代码和执行状态在理论上对剩下部分的操作系统不透明,但程序依然可以读写围圈区域以外的内存。

SGX 希求能在恶意操作系统上保护围圈中的程序,也因此甚至能保护应用程序不被节点上的系统管理员破坏。在围圈中运行预言机程序并分发数据能强有力地确保预言机程序的安全运行,因为可以从远端检测到系统是运行在合法的 SGX 系统之上。

不过值得留意,在 SGX 发布后已经有两个漏洞 (March-2018 & July-2018) 相继被发现,并且目前还有研究在探索一些其他的漏洞。尽管第一个漏洞已经被修复,但这警示着我们只采用 TEE 仍然会造成单点故障。当智能合约的执行依赖于来自一个或多个预言机自动生成的输入时,必须设计多重保护层来避免单点故障。

上述保护屏障单个抽离出来不能算是万无一失,但当它们联合起来共同作用时,能起到更强有力的保护效果。在下一节中,我们将介绍去中心化预言机系统中的主要攻击界面,并举例说明对应的防御措施。

理想预言机

理想的预言机网络应当满足以下五个条件:

1.数据调用是基于双方相互信任的(不可篡改)。预言机在调用外部数据引入智能合约时,应当保证最终反馈给用户的数据与数据来源本身的数据一致,防止预言者中途篡改。经过服务请求方的确认和其他预言者的验证后,如果调用数据结果无误,则将调用数据写入智能合约,并将交易记录上传到区块链上;如果调用数据出现不一致,则该交易将被定义为非法交易。

2.数据调用具有高效性。预言机合约通过智能合约规定,如果预言者没有在请求发出后的规定时间内响应用户请求,或者是响应请求没在规定时间内将数据反馈给用户,就会自动取消交易,并且对服务供应商实施惩罚。

3.数据调用安全性高。预言机的设计必须有效遏制各种数据腐败行为,比如女巫攻击、镜像攻击、复制答案(吃空饷)等。并且通过强制节点在 TEE (Trusted Execution Environment)环境中执行解密,并向区块链汇报所有用户和节点都能看到的通用答案。

4.符合激励相容原则。预言机激励机制和监督机制的设立必须实现激励相容,但是无论是PoW (Proof-of-Work)还是 PoS (Proof-of-Stake)都很容易造成多数人攻击,前者体现在挖矿方面——通过矿池等组织形式发起攻击,后者则是通过超额抵押(Staking)和贿选等方式实现攻击。

因此,治理机制的设计必须充分调动其他竞争预言机的监督积极性,并且不能够将代币奖励和打包概率等决定预言者收益的指标相挂钩。否则,将不可避免的发生预言者和用户因利益不一致而产生的委托代理风险。

5.数据资产化。数据应当作为一种资产,根据其资源的重要性和稀缺性进行定价,以公允价值的形式写入智能合约。

目前,数据资产缺乏有效的定价机制,因为数据的种类千奇百怪,不同类型的数据对不同用户的作用也是存在显著差异,而目前数据定价权归数据的资源方主导,并没有实现去中心化。

女巫攻击和其它去中心化系统的弱点

造一个预言机系统并不难,难的是其中去信任成分的设计。

关键风险:依赖智能合约裁决事务的各方之间是存在利益冲突的,而匿名的预言机没有诉讼风险。当运行多重预言机系统时,各个预言机必须达成共识,因为智能合约只接受一个输入。因此为了防御攻击,需要设计机制来保证预言机满足以下要求:

  • 无法互相辨认
  • 无法互相通信:一个有着相当大投票权力(譬如说 40% )的预言机能广播自己的答案,而且不需要刻意说服其它节点自己的结果是主流答案。不过如果其它节点已经知道这个节点具备如此大的投票权力,那这个要求也相对没什么意义了。
  • 无法向其他节点证明自己是自己答案的所有人:和上一点类似,需要设计机制来隐藏各节点提交的答案,同时只有在所有人都提交答案之后才暴露其来源节点。

以下的攻击策略或漏洞对去中心化的预言机网络是有效的。

多数人攻击:存在这样的风险,即网络中大多数的节点都是由一个实体或是一个同盟来控制的。此时网络依然是由多数人控制,但已经被恶意操纵了。在去中心化的预言机网络项目中要尤其注意此类风险,需要根据节点的信誉和节点总数来决定节点的权力。

致力于去中心化预言机的项目

许多去中心化程度不同的项目都致力于解决上述问题,或是编写多种激励机制来减少对单一信任中介的依赖,或是引入成熟的攻击-抵御机制。

所有的项目可以分为两类:通过网络提供预言机服务,以及网络自带预言机服务。

1.预言机即服务

ChainLink (已上线)

Chainlink 的目标是构建一个完全去中心化的预言机网络,网络节点兼容以太坊、比特币和 Hyperledger,并支持模块化:系统的每个部分都支持升级。其主要的想法是为预言机打造一个可信的市场。有良好行为的预言机节点会受到激励,其表现和声誉会公之于众,反之有恶意行为的节点会受到惩罚。Chainlink 一开始是在链上对预言机的数据进行聚合,后续将通过一个有趣的设计转而在链下进行数据聚合。

任何系统的安全性都是由其最短板决定。去中心化保证了每时每刻的可用性,但存在失效节点传递错误数据的风险,为此 ChainLink 提供了 2 种解决方案。

初始解决方案:链上聚合 合约在链上聚合所有节点的数据(可被公开审计),并使用 commit-reveal 的方式避免节点获取其它预言机的结果和互相抄袭。聚合后的最终结果将在足够多的结果在链上公布后被确定,但这会带来不小的计算成本:每个节点都会发起一次交易、每次交易都需要达成共识、还需要在以太坊部署一个或多个聚合合约。

中期策略:链下聚合 链下聚合能提高达成共识的经济性,但无法解决上文所说的吃空饷问题。

链下聚合方案利用了 Schnorr 签名:每一个参与任务的预言机会收到一个针对此任务的 [公钥,私钥]组合。预言机使用私钥为(被请求的)数据结果(已加密)生成部分签名。单一的部分签名无法直接使用,但当有足够数量的的部分签名合在一起时(如下图所示),会形成一个集体 签名,该过程等价于一个链上交易对数据结果进行聚合。

这里的关键词是足够数量的部分签名,这也意味着该方案提供了(当部分节点无法响应时的)容错机制。这个方法的缺点在于,即便是诚实节点,如果消息传播花了太长时间,他们也无法获得奖励 —— 这使得节点对响应时间有依赖。这个方案也解决了抄袭问题,因为结果揭晓之时,已无法再提交新答案了。

Witnet

Witnet 是一个基于信誉的去中心化预言机网络:运行 Witnet 软件的节点是否正确地响应了数据请求决定了它是获得还是失去信誉值,而正确性是由共识算法分析节点的结果集后确定的。与共识不一致的的节点会失去信誉值(比如它们因节点下线或尝试做恶而产生了不一致),从而与正常节点区隔开来。当达成共识的过程超时时,只要最后节点结果和共识一致,它就不会受到惩罚。

被称作目击者(witness)的预言机节点,基于它们的网络信誉,被随机分配任务并开挖区块,使其不易受“多数人攻击” 的影响。行为良好的节点可以迅速增加信誉值,并在网络中承担更多的责任;相反,失效的和恶意的节点将迅速失去其在网络中的信誉,进而无法再对网络作出贡献,最终变得无足轻重。

因为 Witnet 中的信誉值如此重要,所以除了(在完成一个任务后)在好坏节点间有信誉值的转移变化外,系统还设计了一个在所有节点间进行固定的信誉值重分配的机制,重分配的间隔为一个区块一次(90 秒),从而避免:A. 由信誉值集中在最老的那些诚信节点而导致的中心化;B.尸位素餐(节点不再响应任务,只是获取挖矿收益)。

每次区块生产中,会使用滞纳金函数实现信誉值的重分配:生效节点的信誉值每次以对数函数方式减少,减少的信誉值由所有行为良好节点共享。换句话说,所有节点的信誉值都会不断减少,而那些信誉值最多的节点则损失最大。因此,为了在 Witnet 中保持名列前茅,必须时刻保持良好的行为。

Witnet 拥有自己的区块链网络,因此可以通过桥接节点提供去中心化的预言机服务。有了互操作性解决方案之后,可能(桥接节点)这种模式就不是那么有用了,但在互操作性方案开发出来之前,,但它提供了一个可扩展的方案,降低了链上操作的费用,并有助解决关键漏洞。

去中心化网络不可篡改特性所带来的机遇和挑战可以概括为一个词:激励机制。通过良好设计的经济激励机制,使得去中心化网络能进行空前的全球协作,并保证理性的参与者的行为符合网络的利益。消除对可信第三方的依赖是一项挑战,任何事和任何人理论上都可能变坏,必须将风险降到可容忍的水平。的确,短期攻击的风险一直存在,但不应削弱网络维护者们的长期激励,他们可以从中获得巨大的利润。

比特币矿工作为一个整体被视为可信的 “实体” 被雇佣和信任,以保证比特币账本的安全。曾经出现过矿工利用漏洞进行短期获利的事件,但他们更愿意进行理性地长期博弈,以保证自己的 ASIC 矿机投资和区块奖励不会大幅贬值。进一步说,以太坊因过度依赖像 Infura 或 Metamask 这样的服务(它们确实通过 Consensys 变得中心化)而饱受批评,但因为这些服务在以太坊中有巨大利益,因此能够保持不作恶。这些中间方案的风险在进一步的去中心化过程中是可容忍的。

与外部世界进行交互,是智能合约顺理成章的下一步目标,这同样也需要部署正确设计的激励机制来避免攻击。这里主要的挑战是强大经济刺激导致的不端行为。随着网络的发展,这些激励将变成网络贡献者们巨大的收入来源。日积月累,网络中会有足够的预言机服务提供商并保有巨大利益,使其减少对单个(预言机)节点的依赖却同时能充分保证服务质量。

萝卜加大棒的激励是强大的,我们期望看到所有这些项目的发展。ChainLink 通过使用 代币 和 信誉机制,已经能较好地获得可靠的预言机服务。当我们拥有可真正工作的预言机时,将会涌现众多的使用场景,其中最令我们兴奋的包括去中心化保险产品、金融产品、预测市场。

预言机面临的挑战

当前,预言机网络发展面临着以下六大挑战:

1)预言机无法保证数据来源本身数据的准确性

预言机只是解决数据在传输过程中可能会被篡改的风险,从而在预言者和用户之间建立可信的机制,让不可信任的双方可以实现价值交换。但是,一旦数据来源本身出现问题,反馈给用户的数据同样是失真的。例如,黑客攻击采用两种不同方式攻击GPS系统,第一种攻击方式是通过在地位数据的传输渠道中篡改了目标定位的数据,第二种是直接攻击GPS系统的数据存储系统。

假设预言机中大多数节点是诚实的,显而易见,第一种攻击方式采用去中心化预言机的模式,只要GPS系统更新数据,将不同预言者调用数据的结果进行对比,就可以解决该问题;第二种攻击方式导致GPS系统本身数据来源的数据被篡改,即便GPS系统后期更新数据,它存储数据库的错误数据仍然没有被修正,从而导致定位数据失真,进而造成航运交割的违约。对冲数据来源出错数据失真的方法是保持数据来源的多样性,从而降低因数据源本身的问题导致数据失真的可能性。但是,在数据来源单一(如 GPS 定位数据、IoT 设备传感器记录的数据)的情况下,这种缺陷则会更大概率造成数据的失真。

2)因不可篡改性导致难以修复安全漏洞

区块链的数据不可篡改是一把双刃剑。不可篡改性的优势在于任何人都不能篡改已发生的智能合约,规则制度实现了去中心化(前提是大多数节点是诚实的),但是也存在较大的弊端。一方面,安全漏洞修复代价较高。如果调用数据的智能合约一旦出现安全漏洞或错误,因合约本身的不可篡改性会导致漏洞无法被修复,除非社区更新软件版本并且以硬分叉的方式(如 ETC 和 ETH 的分叉)。而且,很多项目因出现类似问题没有及时修复而导致代币价值归零。

另一方面,如果数据源在发现错误后更新,则智能合约的不可篡改性导致记录在链上的仍然是更新前的数据。尽管在实际情况下,一切都可以篡改,但如果造成的后果不严重(仅仅少部分数据失真),则项目方或社区不至于以硬分叉的高代价来篡改数据。

3)程序代码开源导致更容易被黑客攻击

从理论上来说,程序代码开源有利于让更多人对代码Bug起到修复的作用,进而对智能合约本身进行完善。但实际上,智能合约开源代码导致黑客或恶意节点更容易发起攻击。因为绝大多数人没有足够的时间或精力去检查代码智能合约代码本身的问题,而且存在较大的技术壁垒,所以群众对智能合约代码的监督作用有限。

同时由于合约代码的不可篡改性,虽然使任何都不能任意更改交易规则,但是一旦代码出现漏洞再进行纠错的阻力较大,目前处理大规模漏洞的最好的方法是硬分叉(如 ETH 社区处理 The DAO),轻则让去中心化本身失去意义,重则导致项目破产。而大多数项目方不具备足够的人力物力和财力(如 ETH 社区),使项目的收益远远小于风险。

4)高效性与冗余容错设计的冲突

高效性和冗余容错存在不可避免的冲突。如果预言机网络采用中心化的商业模式(如 Oraclize),数据反馈速度就会比去中心化预言机网络更快,即便可以证明自己的诚实,并通过分布式服务器规避单点故障的风险,也可以也难以分散因无法验证数据源致使数据失真的风险;

反之,如果预言机网络采用去中心化的商业模式(如 Chainlink),则冗余容错将不可避免的导致数据反馈的低效,但是又可以通过共识机制和信誉评级等机制充分证明预言者(Oracle)的诚实,并且可以有效分散数据源失真的风险。

5)预言机对低时延的数据服务应当降低其交易时间

预言机应当尽可能降低服务时延。DeFi 产品大部分以智能合约的形式实现日常的交割,以 The DAO 为代表等产品需要通过预言机网络频繁的获取 ETH 等数字货币的实时价格数据,使其有效的执行。

毫无疑问,当前价格信息实时获取是是 Oraclize 和 Chainlink 等预言机网络中最频繁的数据服务请求,然而,数字货币资产价格波动的速度很快而且波动的幅度较大,从而导致预言机反馈给客户的价格与当前实际价格产生严重的偏离。

6)数据壁垒加剧导致预言机网络引流困难

预言机网络本质上是一种数据资源整合平台,从而实现数据共享,需要通过引流扩大网络规模,但是数据壁垒让引流难度极高,使预言机网络规模受限。

目前,大多数数据掌握在以 Facebook、Google、腾讯等极少数互联网巨头或 Swift 等行业寡头手中,他们不愿意共享自己的数据,使得核心数据获取的难度较高,导致预言机网络的规模受到制约。

但是一旦获得数据资源的引入将会使预言机网络规模快速扩大。

比如 Chainlink 与 Google、甲骨文、Swift 等以数据为主导的网络巨头达成战略合作,Google 的 BigQuery 数据仓库等作为数据源为 Chainlink 提供大量的数据流量支持,使 Chainlink 网络的活跃度大幅提升。

随着现代产权制度的逐步完善,数据壁垒将成为未来数据交互的巨大挑战,而数据资产化的大趋势将成为必然,能够获得数据资源的预言机网络将获得更多的数据流量。

目前,预言机项目处于初创期,数据壁垒将会导致当前预言机项目风险大于收益,掌握数据资源的组织倾向于自己控制数据资产的定价权,这会从数据真实性和预言机网络规模两个维度形成掣肘。

一方面,数据来源的多样性是分散数据来源出错的唯一方法,但是实际上在绝大多数情况下,数据来源往往是单一的,因数据来源出错导致最终反馈给用户的数据失真的风险仍然无法得到有效分散。

另一方面,预言机网络的流量是决定其项目价值的决定性因素,如果掌握数据的巨擘(特别是 Google 等以数据为主导的公司)自行发展预言机项目将会带来巨大的冲击。因此,未来预言机项目的流量取决于掌控数据资源的一方是以什么形式参与到预言机市场。