区块链预言机(oracle)

0.1. 什么是预言机

2018 年 11 月 6 日,中国人民银行发布的《区块链能做什么?不能做什么?》报告中,是这样对预言机定义的:

区块链外信息写入区块链内的机制,一般被称为预言机 (oracle mechanism) 。

从定义来看,预言机的功能就是将外界信息写入到区块链内,完成区块链与现实世界的数据互通。它允许确定的智能合约对不确定的外部世界作出反应,是智能合约与外部进行数据交互的唯一途径,也是区块链与现实世界进行数据交互的接口。预言机作为区块链和现实世界之间的纽带,扮演这数据互通的角色。

0.2. 为什么需要预言机?

在说明为什么需要预言机之前,我们需要知道区块链最重要的特点:

  1. 具有确定状态的状态机

    • 区块链的本质就是一个状态机。
    • 系统中所有的节点从同一个创世状态开始,依次运行达成共识的区块内的交易,驱动各个节点的状态按照相同操作序列(增加,删除,修改)不断变化,实现所有节点在执行完相同编号区块内的交易后,状态完全一致,我们把这个状态称之为世界状态。
  2. 没有边界

    • 没有固定数量的节点,一旦达成共识,每个节点的状态必须保持一致。

如果说区块链就是一个状态机,那么改变这个状态的就是 EVM(以太坊虚拟机)。它能够在分散的网络中的任何节点上执行程序,并更新受共识规则约束的区块链状态。为了保持共识,EVM 的执行过程必须完全确定。这就产生了两个比较重要的结果:

  • EVM 和智能合约没有内在的随机性来源;

    • 节点 A 将执行命令并代表智能合约存储 3 在其存储中,而节点 B 执行相同的智能合约,将存储 7。这样会导致节点 A 和 B 的结果有两种情况,虽然执行的是相同的代码,这样就会导致节点之间无法达成共识。
  • 外部数据只能通过交易数据传入;

    • 区块链是确定性的环境,不允许不确定的事情或因素,智能合约不管何时何地运行都必须是一致的结果。所以虚拟机(VM)不能让智能合约有 network call(网络调用),从外部是获取数据,不然就会导致结果不的不确定性,从而也无法达成共识。

区块链是一个封闭的环境,链上是无法主动发起 Network call(网络调用)主动获取链外真实世界的数据,只能被交易触发,被动的通过交易接收数据。其次,智能合约最终的执行需要合约参与方的私钥签署,智能合约本身没有办法自动执行。

所以,预言机就是为了解决智能合约无法主动去获取链外的数据,只能被动接受数据的问题,能够让智能合约主动从外部获取数据。

0.2.1. 预言机的实现

oracle-implemetion

上图就是理想中预言机的工作流程,即用户的智能合约把请求给链上 Oracle 合约,通过链下的 API 接口获得外部数据,更确切的说是外部把数据给链上的 Oracle 合约,然后 Oracle 合约再把数据给用户的智能合约。

0.3. 预言机的应用场景和示例

在理想的情况下,预言机提供了一种无信任(或者至少近乎无信任)的方式来获取外在的(即“真实世界”或“链外”)信息,例如足球比赛的结果,黄金的价格或真正的随机数字,用于以太坊平台上的智能合约。

  1. 可以将预言机视为弥合链外世界与智能合约之间差距的机制;
  2. 允许智能合约基于真实世界的事件和数据来强制执行合约关系(基于智能合约实行的航空延误险);

但是,这样的模式也会给以太坊的安全模型带来外部风险

假如有一个“智能遗嘱”的合约–当一个人去世时分配资产。如果这样的合约控制的继承金额足够高,那么在所有者死亡之前攻击预言机(发出假的死讯)并触发资产分配的动机是非常强烈的。

0.3.1. 数据来源的真实性

某些预言机可以提供某些私有数据源的数据,例如学术证书和政府 ID。这些数据的来源,如大学或者政府部门,是完全可信的。

数据的真实性是主观的(真相只能通过来源的权威来确定)

0.3.2. 适用场景

预言机作为区块链与现实世界进行数据交互的桥梁,应用场景非常多,可以说一切需要与链下进行数据交互的 DApp 都需要预言机。

  • 来自物理来源的随机数/熵(例如量子/热现象):公平地选择彩票智能合约中的赢家,博彩游戏
  • 与自然灾害相关的参数触发器:触发巨灾债券智能合约(对于飓风债券来说的风速)
  • 汇率数据:将稳定币与法定货币准确挂钩
  • 资本市场数据:代币化资产/证券的定价篮子
  • 基准参考数据:将利率纳入智能金融衍生品
  • 损害赔偿:保险合约
  • 航班延误:保险合约

0.3.2.1. DeFi

目前最主要的场景就是 DeFi(Decentralized Finance,去中心化金融)

DeFi 领域的项目为什么需要预言机。类似 DAI 这样的稳定币系统,需要获取 ETH 的实时价格,来判断所抵押的加密货币是否达到了平仓价格进而触发平仓。假设有 1000 个节点,那就需要向交易所(比如币安)或 CoinMarketCap 的 ETH / USDT 交易对进行 1000 次的 API 数据请求 ,但是,由于 ETH 的价格是实时变动的,加上网络延迟、计算速度等原因,每个节点获取到的价格可能都不相同,这部分数据被输入到智能合约后,节点间无法达成共识,那么整个系统就会崩溃。

0.3.2.2. 博彩游戏

博彩游戏的核心是不可预测、可验证的随机数,从而决定赌注的最终结果,但是在链上是无法生成随机数的或者说在链上的随机数是可以被预测和破解的,这时候就需要预言机从外部给智能合约安全的、不可预测的随机数。

现在的大多数博彩游戏都是在链上生成随机数,所以很容易被预测和破解,导致资产被盗,大家有兴趣的可以去看一下DApp被盗的相关研究报告,很多因为随机数问题被盗的。比如 BetDice、Dice2Win。

关于智能合约中的随机数,可以参考 DOS Network 创始人@nrek jonny 关于《智能合约中的随机数》的分享。其实,早在 Fomo3D 这个游戏出来之后,以太坊的 Team Leader 就在推特上说过链上是无法生成随机数的。

Dear devs… you can`t generate random numbers on chain!

eth-random-number

0.4. 预言机的设计模式

0.4.1. 预言机的基本功能

  1. 从链外的数据源收集数据。
  2. 使用签名消息在链上传输数据。
  3. 将数据放入智能合约的存储空间,使数据可用。

一旦数据在智能合约的存储中可用,其他智能合约就可以通过调用预言机智能合约的“检索”功能来访问。

0.4.2. 预言机的设计模式

预言机有三种设计模式:

  1. 立即读取
  2. 发布与订阅
  3. 请求与相应

0.4.2.1. 立即读取

  • 在需要时即时获取
  • 比如,这个人是否满 18 岁;
  • 数据存储在合约中,其他智能合约使用对语言及合约的请求调用来查找(跟请求和响应的区别是,不涉及外部交互)

0.4.2.2. 发布与订阅

  • 链上智能合约轮询
  • 链外守护进程监视和更新
  • 比如,价格查询,天气信息,交通数据
  • 轮询可能消耗大量的 gas

0.4.2.3. 请求与相应

  • 最复杂的情况
  • 数据空间太大,无法存储在智能合约中,并且每次用户值需要整个数据集的一小部分
  • 数据提供商的业务模型

主要步骤:

  • 接受来自 DApp 的查询
  • 解析查询
  • 检查是否符合付款和数据权限/权利义务
  • 从链外数据源检索相关数据(并在必要时加密)
  • 使用包含的数据对事物进行签名
  • 将事务广播到网络
  • 安排任何进一步必要的交易,例如通知等

类似的,可以从外部所有帐户(EOA)请求数据并直接返回数据,从而无需使用oracle 智能合约。也可以向支持物联网的硬件传感器发出请求和响应。因此,oracle 可以是人,软件或硬件。

0.5. 数据认证

在“请求/响应”模式下,可能会存在多个实体的操作,如何防止数据在传输中被篡改?所以,必须要让链外方可以证明返回数据的完整性。

两种方式:

  • 真实性证明(authenticity proof)
  • 可信执行环境(Trusted Execution Environment, TEE)

0.5.1. 真实性证明

真实性证明是用密码学证据证明数据没有被篡改过,比如使用数字签名。

将信任从数据提供者转移到证明者(证明方法的提供者),通过在链上验证真实性,智能合约能够在对其进行操作之前验证数据的完整性。

0.5.1.1. Oraclize

Oraclize:为以太坊提供中心化预言机服务

Oraclize 依托亚马逊 AWS 服务和 TLSNotary 技术,是一个可证明的诚实的预言机服务,不过它是中心化的,目前只能在以太坊网络使用,而且 gas 费较高。但是不妨碍它是目前很受欢迎的预言机服务,也可能是因为还没有更好的选择吧。这里有 Oraclize 详细的使用说明:Oraclize Documentation

特点:

  • 中心化
  • 基于亚马逊 AWS 服务和 TLSNotary 技术
  • 智能在以太坊网络适用
  • gas 费用较高

基础:亚马逊不会篡改虚拟机实例。

0.5.2. 可信执行环境

基于硬件的安全区(security enclave)来验证数据的完整性。

0.5.2.1. TownCrier

TownCrier 基于英特尔的 SGX(Software Guard eXtensions)提供:

  • HTTPS 查询的响应可靠性验证

  • 完整性保证

    • 确保在安全区内运行的应用程序受到CPU的保护,防止任何其他进程被篡改
  • 机密性保证

    • 应用程序在安全区中运行时,其状态对其它进程来说是不可知的

基础:假设信任(Intel/SGX)。

0.6. 计算型的预言机

以太坊上的计算成本太高,出现了提供密集计算功能的预言机。

Oraclize 提供的服务允许去中心化应用请求输出在沙盒 AWS 虚拟机中执行的计算。

作为可验证预言机事实上的标准,“Cryptlet” 的概念已经被规范化为微软更广泛的 ESC 框架的一部分。

TrueBit 是一个可扩展和可验证的链外计算的解决方案。它引入了一个解决这和验证者系统,分别执行计算和验证。

0.7. 去中心化的预言机

大多的预言机都是中心化的预言机系统,需要依赖可信的权威:

  • Oraclize 需要假设亚马逊不会篡改虚拟机实例
  • Town Crier 需要假设 Intel/SGX 不会篡改返回的数据

所有中心化的预言机都存在单点故障。

Chainlink:以太坊上第一个去中心化预言机解决方案
chainlink-architect

ChainLink 提出了一种去中心化预言机网络,包括三个关键的智能合约:

  • 声誉合约

    • 跟踪数据提供商的绩效
  • 订单匹配合约

    • 从声誉合约的语言集中选择竞标者,并最终确定服务层级要约(Service Level Agreement, SLA),其中包含了查询参数和要求的预言机数量
  • 数据汇总合约

    • 使用“commit-reveal” 提交模式从多个预言机处收集相应,计算查询的最终总结果,然后将结果反馈回声誉合约。

0.7.2. 欧链 OracleChain

欧链 OracleChain:EOS 上的第一个去中心化预言机解决方案

oracle-chain-architect

欧链采用自主的 PoRD 机制(Proof-of-Reputation&Deposit),本质上是一种抵押代币奖惩机制的声誉系统,奖励数据节点惩罚作恶节点,可以实现 Augur、Gnosis 等预测市场应用的功能,还能支撑对链外数据有更高频率访问需求的智能合约业务。预测市场的结果本身有时也可以作为 Oracle 的输入数据源,欧链更像是预测市场,而且不足是单纯的声誉系统容易集中化。目前欧链只在 EOS 上开发,而且专注于提供随机数服务。

0.7.3. DOS Network

DOS Network:支持多条主流公链的去中心化预言机服务网络

dos-architect

DOS Network 是一个 Layer-2 的预言机解决方案,它通过在链上部署一个轻量级智能合约,链下是一个 p2p 网络,服务节点的选取和数据验证采用 VRF+阈值签名等技术,保证了去中心化和数据安全,并达到快速反应。可以适配所有主流公链,比如以太坊、EOS、Tron、ThunderCore、Ultrain 等。

0.7.4. 去中心化预言机的挑战

去中心化方案的一个重大挑战:构建数据汇总函数。

  • ChainLink
    • 通过在链上的智能合约和链下的数据节点,通过奖惩机制和聚合模型的方式,进行数据的请求和馈送。不过也有一些不足,比如链式聚合成本较高,拓展性差,基于声誉系统容易集中化。他们更关注支付场景的应用,比如帮助银行与企业之间建立智能合约。
  • SchellingCoin 协议

    • 将中位数作为“正确”答案。记录者必须先质押保证金,这些保证金会根据他与中位数的接近程度重新分配,由此激励人们记录与其他人提供的值相近的值。这些共同的数值,就是所谓的“谢林点”。
  • Jason Teutsch 方案

    • 利用一条专用的工作量证明区块链,该区块链能够正确地报告在给定时期内的注册数据是否可用。矿工尝试下载,存储和传播所有当前注册的数据,因此保证数据在本地可用。虽然这样的系统在每个挖掘节点存储和传播所有注册数据的意义上是昂贵的,但是系统允许通过在注册周期结束之后释放数据来重用存储。

0.8. 中心化和去中心化的选择

在 DeFi 领域稳定币、去中心化杠杆交易、金融衍生品交易等都需要预言机,只是短期内大多数项目选择使用自己搭建的预言机服务,但实际上这会有很多问题,比如单点故障、易受攻击等,比如知名的衍生品交易平台 Synthetix 在 19 年 6 月份遭遇了 oracle 攻击,损失超过 3700 万枚 sETH,「Synthetix平台遭Oracle攻击,攻击者篡改汇率,低价大量换购sETH - 巴比特」。

这个事件的具体原因可以在这篇文章中查看「中心化预言机有多“脆弱”?从 Synthetix 被攻击事件得到反思」,

所以,在长久的来看,去中心化预言机应该是更好的方式。

0.9. 总结

正如上面所了解的,预言机为智能合约提供了至关重要的服务:将外部的事实带入合约执行。当然,预言机也会带来很大的风险:如果他们是受信任的来源并且可能受到损害,可能导致他们提供的智能合约执行受损。

一般来说,在考虑使用预言机时要非常的小心信任模型。一旦认为预言机可以信任,那么合约的安全性就可能因为来自预言机的错误输入受到破坏。所以,需要特别注意预言机的信任机制。

去中心化的语言既可以解决一些问题,并为以太坊智能合约提供无信任的外部数据。谨慎选择,你就可以开始探索以太坊与语言及提供的“真实世界”之前的桥梁。

Just for my love !!