# 大菠萝的区块链干货（1）区块链预言机（BlockChain Oracle）

By [0xBigPineapple](https://paragraph.com/@0xpineapple) · 2022-03-10

---

今后决定每天闲了就更新一节区块链的干货知识，大多数整理自各路大神的文章，文尾会有原文链接，我算是学习的过程中，看到不错的文章搬过来，加上一些自己的理解，算作某种形式的学习笔记。

因为我是学计算机的，所以很多时候的一些概念可能会理解起来比较容易，或许也会默认你对计算机的结构和组成，分布式，密码学方面的知识有初步了解。

文章没有什么重要性的顺序，只是看到一个感兴趣的专题，就会扩展性的进行搜索和学习，然后整理出来。

正文开始。

预言机（Oracle）是区块链中非常重要的一个功能，而且其名字也是比较容易让新手误解的，但我发现讨论并不多，可能多数人对此并不了解。

预言机（Oracle）是什么？
---------------

> 预言机是将以太坊连接到链外、真实世界信息的数据源，以便您可以在智能合约中查询数据。  
> \--以太坊官网定义

预言机的功能就是将外界信息写入到区块链内，完成区块链与现实世界的数据互通。它允许确定的智能合约对不确定的外部世界作出反应，是智能合约与外部进行数据交互的唯一途径，也是区块链与现实世界进行数据交互的接口。

听到预言机，很多人的第一反应是预测市场，对未来进行预测，其实并不如此。**区块链领域的预言机像一个黑盒子，用来解决区块链与现实世界中间的特定数据问题。**

举个例子，有一个天气预报预警的DApp，用户可以通过链上智能合约进行天气预报的查询。天气预报的数据不是在链上自行生成的，而是需要智能合约向气象服务网站的接口发起请求获取数据。这时预言机就起作用了，智能合约可以向预言机发起请求，由预言机执行气象服务网站接口的调用，返回一致性的响应数据给智能合约，供智能合约处理。

区块链为什么需要预言机？
------------

区块链是一个确定性的、封闭的系统环境，目前区块链只能获取到链内的数据，而不能获取到链外真实世界的数据，区块链与现实世界是割裂的。

区块链是确定性的环境，它不允许不确定的事情或因素，智能合约不管何时何地运行都必须是一致的结果，所以虚拟机（VM）不能让智能合约有 network call（网络调用），不然结果就是不确定的。

也就是说智能合约不能进行 I/O（Input/Output，即输入/输出），所以它是无法主动获取外部数据的，只能通过预言机将数据给到智能合约，也就是只能被动的接受外部的数据。

预言机如何解决此问题
----------

![](https://storage.googleapis.com/papyrus_images/32dfbb3d69d5d4ce1392f2d8f0440abccd6ab459356d4c9fefd99b1c1b4ae6c4.png)

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

或许很难理解，因为在互联网中，调用数据是非常容易的，只需要在程序中写调用的代码就可以了。但是区块链与外部世界的数据交互，确实不能进行这样的操作。

预言机合约就类似于一个中间件，或者一个“桥”，将外部数据和区块链连接起来。

如何设计预言机
-------

如果仅仅是对于非区块链应用，预言机几乎可以完全简化为一个简单的程序调用。在需要数据时，去数据源取数据即可。但是对于分布式的区块链智能合约来说，同样的输入跑在不同的机器上要有完全相同的输出结果，那问题就来了：

如何保证数据源的数据不会做恶？如果一个数据源给预言机节点A的答案是“是”，而给预言机节点B的答案是“否”，该怎么办？这里就需要**引入多数据源请求来保证数据源的数据真实性**。而事实上我们是不能保证用户请求的数据一定存在多个真实可信的数据源的，因为预言机节点并不能防止外界信息源作恶，而且“多个”和“真实可信”并不是在所有数据中都容易满足。

诸如此类的问题还有很多，为了预防这些问题的出现，去中心化预言机需要进行缜密、全面的设计：

### A. 多预言机节点

为了防止单节点预言机的信任问题，需要多个节点共同执行预言机数据的请求处理。多节点会带来的数据不一致问题，这时数据的聚合一定是需要的。（常用的聚合算法有BFT共识算法或者门限签名算法等。）

### B. “提交-揭露” (Commit-Reveal)机制

预言机节点之间的数据广播会带来Free-loading（吃空饷）问题，即一个预言机不是通过访问数据源来获取数据，而是复制其它预言机的答案。当吃空饷的节点占据大多数时，如果这些节点复制了一个错误的答案，这将变成一次大多数攻击，危害系统安全。我们可以通过“提交-揭露”机制解决此问题，预言机节点分两阶段提交数据答案，第一阶段提交的答案是加密的，在收到足够多的预言机答案之后，才解密全部答案。

### C. 多数据源或可信单数据源

数据源的诚信问题是很难解决的，因为这不是预言机的问题，而是一个外部问题。当然，通过使用多数据源访问数据可以在一定程度上防止少数数据源的作恶，但是这种做法不具通用性，因为并不是每一条数据都具备多个外部数据源供应。

### D. 利益分配

去中心化预言机需要设计一套激励机制，以给与预言机节点行为对应的奖励和惩罚。预言机节点在加入去中心化网络时需要支付一定的保证金，以防止节点的作恶（这就类似淘宝天猫卖家在开店时需要支付保证金，来保证其不会出售假货）。理论上获取到与共识结果相同答案的预言机都应该获得相同的奖励，因为他们都是达成共识结论的贡献者。在惩罚规则方面，我们不能因为某个预言机节点的答案与共识结果不同，或者不能即时返回请求结果就惩罚他，因为我们不能辨别是预言机节点在作恶还是数据源在作恶。而对于Free-loading的问题，一旦在“揭露-提交”阶段发现节点在吃空饷，则需要按一定比例扣除其质押的保证金。

预言机的应用场景有哪些？
------------

预言机作为区块链与现实世界进行数据交互的桥梁，应用场景非常多，可以说一切需要与链下进行数据交互的 DApp 都需要预言机。**比如金融衍生品交易平台、借贷平台、快递追踪/IoT、稳定币、博彩游戏、保险、预测市场等，目前最主要的场景就是 DeFi。**

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

所以在 DeFi 领域稳定币、去中心化杠杆交易、金融衍生品交易等都需要预言机，只是短期内大多数项目选择使用自己搭建的**中心化预言机服务**，但实际上这会有很多问题，比如单点故障、易受攻击等，比如知名的衍生品交易平台 Synthetix 在 19 年 6 月份遭遇了预言机攻击，损失超过 3700 万枚 sETH，[Synthetix平台遭Oracle攻击，攻击者篡改汇率，低价大量换购sETH - 巴比特](https://link.zhihu.com/?target=https%3A//www.8btc.com/article/433457)。所以长久来看，在Defi领域去中心化预言机是更好的方式。

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

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

以太坊的 Team Leader 就在推特上说过链上是无法生成随机数的。**Dear devs... you can\`t generate random numbers on chain！**

![](https://storage.googleapis.com/papyrus_images/7747a88b2ba433c99dadfe3df94ab0954a576ee8481a3bce8b22d9b4b78eb156.png)

当前市场的预言机项目
----------

### ChainLink

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

![](https://storage.googleapis.com/papyrus_images/f287b3dc362fd3a46eb75cf540f442b75b5c2f0f15818785b549d80632c2878d.png)

### DOS Network

DOS Network是一种可扩展的 layer2 协议，它为主流区块链提供分散的数据馈送 oracle 和分散的可验证计算 oracle。它将链上智能合约与链下互联网数据连接起来，为区块链提供无限可验证的计算能力，使更多的商业应用能够与真实世界的用例相结合。

![](https://storage.googleapis.com/papyrus_images/c95ca381f1ffaada57a91537ed13c0d610ecf2a1f6fa527ca2122528cb12b3cb.png)

参考原文链接：

[详解预言机：连接区块链与现实世界的桥梁.](https://medium.com/neo-smart-economy/%E8%AF%A6%E8%A7%A3%E9%A2%84%E8%A8%80%E6%9C%BA-%E8%BF%9E%E6%8E%A5%E5%8C%BA%E5%9D%97%E9%93%BE%E4%B8%8E%E7%8E%B0%E5%AE%9E%E4%B8%96%E7%95%8C%E7%9A%84%E6%A1%A5%E6%A2%81-bb64291ca8bf#:~:text=%E5%9C%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E9%A2%86%E5%9F%9F%EF%BC%8C%E9%A2%84%E8%A8%80%E6%9C%BA,%E5%A4%96%E7%95%8C%E8%8E%B7%E5%8F%96%E9%97%AE%E9%A2%98%E7%9A%84%E7%AD%94%E6%A1%88%E3%80%82)

[什么是区块链预言机（BlockChain Oracle）](https://zhuanlan.zhihu.com/p/52369816)

感谢原作者！

---

*Originally published on [0xBigPineapple](https://paragraph.com/@0xpineapple/1-blockchain-oracle)*
