# 预言机（一）：a general idea

By [tom_ni](https://paragraph.com/@tom-ni) · 2022-04-15

---

`“预言机（oracle），起着连接区块链与外部世界数据的接口作用，将不确定的外部数据转换为确定的链上可使用数据。故在这个角度上，我其实更愿称它为’确定机’。”`

### 为何需要预言机

试想一个场景，我们正在使用一个web3版的机票订购软件d-ticket，我们的合约可能是这样执行的：

1）d-ticket合约向各个供应商发送询价请求；

2）比较后选出最便宜的交易返回给我们。

就像下图这样，供应商2凭借1.066eth的最低价在本次询价中胜出！so far so good。

![d-ticket执行流程](https://storage.googleapis.com/papyrus_images/65358424fef3597c84a3f6ac2190217716f76a330003cfe9ed96426af7d8ec67.png)

d-ticket执行流程

但当区块链中的节点们，试图对这次执行进行验证并打包上链时，问题出现了：

**由于机票价格是实时变动的变量，节点们因网络延迟进行验证的时点各不相同，变动的机票价格使得节点们无法完成共识**。

![因机票价格变动，节点们无法达成共识](https://storage.googleapis.com/papyrus_images/2bc41b766f9afd8d48d6050fed78b6f19f24daed28736b4f5886dcff370e11df.jpg)

因机票价格变动，节点们无法达成共识

由此，我们的d-ticket无法完成数据的上链，这笔机票交易将以失败而告终。

这个例子背后，共性的问题是：**区块链是一个确定性的系统，无法直接处理外部的变量数据**。买机票仅是一个简单的场景，诸如deFi等金融场景下，外部数据的维度将更加复杂，变化更快，影响也更大。

预言机正是为处理这样的一个困境而诞生。

### 借助预言机的解决方案

还是回到d-ticket的例子，现在我们试图对它加以改进：如果有一个中间件，帮助我们将瞬时的机票价格加以锁定，上述的问题将迎刃而解。

![借助oracle询价并锁定](https://storage.googleapis.com/papyrus_images/db64a294aa7a2c06cf76283ff1b39a27cf0585a92b58483b75fb3530ee2da3da.jpg)

借助oracle询价并锁定

与原来相比：

1）d-ticket委托了中间件oracle进行询价；

2）oracle除获取最低价外，还将状态锁定。

当区块链中的节点们，试图对这次执行进行验证时，也将与锁定后的oracle交互：

![借助oracle，共识得以达成](https://storage.googleapis.com/papyrus_images/4866d983507fb3120173801aa825f363361278ea07a648e3ff69ba10a79bbd1b.jpg)

借助oracle，共识得以达成

最终，在oracle的帮助下节点间得以形成共识，交易数据得以上链，一次web3版的机票购买得以完成。

可见，在这个系统里：

**预言机（oracle），起着连接区块链与外部世界数据的接口作用，将不确定的外部数据转换为确定的链上可使用数据。故在这个角度上，我其实更愿称它为“确定机”**。

### 预言机的中心化-Not a perfect solution

然而遗憾的是，预言机的引入解决了共识的问题，却带来了中心化，成了系统中的薄弱点。“2019年06月Synthetix 遭遇 oracle 攻击，损失超过 3700 万枚 sETH”是个比较典型的例子。

据悉，当时的Synthetix通过2个接口向外获取汇率等信息，取平均后作为预言机的数据。但其中一个api频繁出错，导致预言机锁定的数据与实际数据偏差很大。

最终这个问题被发现且被用以套利，导致了大量的损失。

_一句题外话，看到了不少web3中的安全事件都和系统中的中心化组件相关，某种角度也说明了去中心化确有其价值所在。_

### chainlink-预言机的去中心化解决方案

针对上述问题，chainlink提供了一个去中心化的预言机解决方案。以获取BTC/USD的汇率为例，chainlink的运行模式可概括为（informal）：

1）多达21个节点会同时给出答案，chainlink取其中值；

2）如果有某几个少数节点造假（例如和最终答案偏差超过1%以上），则这些造假节点会失去预先存放在chainlink的质押币作为惩罚；

3）如果大多数节点共同参与造假，则某节点可以选择向第二层的监督节点汇报，这么做的好处是它可获得其他所有节点因造假而损失的质押币。

毫无疑问，比起中心化的oracle：

1）chainlink前进了一步，其目前也是oracle赛道的头部项目；

2）但亦存在对其机制的质疑声：如大多数一层节点与第二层的监督节点共同造假如何解决？毕竟，理想的机制下，系统的安全是由**造假的成本>造假的收益**来保证，deFi场景下造假的收益大于质押成本的情况很可能发生。

后续会有篇章对chainlink详细分析，此处想借着chainlink的例子，最终串起本文的：**预言机的需求与诞生→中心化出现问题→提出去中心化方案**，这一技术演变的过程。

这或是web3现在或未来许多优秀项目诞生的所谓“范式”。

### 写在最后的话

如果真实世界逐渐上链，预言机是否会失去它的价值？我认为会。

只是在这之前，我相信会有相当漫长的岁月，世界都处于web2.5的状态中。而在这段漫长的岁月里，预言机将持续扮演着链与外界接口的重要角色。

---

*Originally published on [tom_ni](https://paragraph.com/@tom-ni/a-general-idea)*
