
预言机:区块链如何得知外部世界发生了什么
智能合约可以完美地核对余额、签名和自身状态。它做不到的是去查询任何信息。它不知道 ETH 值多少美元,不知道一场比赛谁赢了,也不知道昨天马德里有没有下雨。区块链是刻意封闭的:每个节点都必须从相同的数据得出相同的结果,而外部世界无法提供这种保证。
然而,借贷协议需要价格,稳定币需要汇率,保险合约需要现实世界的事件。连接封闭链与外部世界的这座桥梁被称为预言机,它也是去中心化金融中最常遭受攻击的部分之一。
预言机做什么
预言机是任何把外部数据放到链上、让合约能够读取的机制。通常:
- 一个或多个数据提供者收集信息,例如来自众多交易所的 ETH/USD 价格。
- 他们对信息签名,并定期或在数值变化足够大时提交给链上的预言机合约。
- 其他合约从该预言机合约读取最新数值,并据此执行操作。
合约完全信任预言机。如果预言机说 ETH 值 10 美元,读取它的借贷协议就会把 ETH 当作值 10 美元,并据此进行清算或放贷。
预言机问题
这就是核心难题:一个协议即使代码完美,其可信程度也只能与它的数据相当。如果只有单一来源为合约提供价格,那么把合约去中心化也帮不了多少忙。
各种预言机设计用不同方式来降低这种依赖:
- 多个独立的报告者,其答案经过聚合,单个出错或被攻破的来源无法左右结果。
- 众多底层数据来源,单个被操纵的交易所无法扭曲价格。
- 链上时间加权平均价格,取自去中心化交易所,较难被长时间推动。
- 经济惩罚,针对提交错误数据的报告者。
预言机如何被利用
DeFi 中许多最大的损失并不是通常意义上的合约漏洞,而是预言机失效:
- 现货价格操纵。某个协议从单个小型交易池读取当前价格。攻击者在一笔交易中借入巨额资金,推高或压低该池的价格,按虚假价格借款或清算,然后撤回交易,这一切都在交易结束前完成。闪电贷让攻击者无需任何自有资本就能做到这一点。
- 流动性稀薄的市场。主要在一个小池中交易的代币很容易被低成本操纵,任何接受它作为抵押品的协议都会继承这一弱点。
- 过时的数据。在行情剧烈波动时停止更新的预言机,可能让人们以已经不存在的价格借款。
- 被攻破的报告者或管理员密钥,可以更改预言机获取数据的来源。
同样的道理也适用于跨链桥:一个系统的安全程度,取决于告诉它别处发生了什么的那个组件。
为什么这与你有关
你不会直接与预言机交互,但在许多协议中,它们决定着你的资金会发生什么:
- 借贷:你的抵押品价值,以及你是否会被清算,都来自预言机。
- 稳定币:有几种设计依赖价格数据源来维持锚定。
- 衍生品和合成资产:结算价格来自预言机。
在用真金白银使用某个协议之前,值得弄清楚:它从哪里获取价格?是成熟的多来源数据源,还是单个池子?如果数据源停止更新会怎样?一个无法清楚回答这些问题的协议,是在要求你承担一种你看不见的风险。
预言机与 SSP
SSP 本身并不依赖预言机来保护你的资金。你的币存放在 2/2 多签金库中,能否转移只取决于你两台设备的签名,而不取决于任何外部价格。
你在 SSP 中看到的价格,也就是以所选货币计价的资产组合价值,仅用于显示。它们不会影响交易的执行内容,也不会影响交易是否有效。
当你通过 WalletConnect 把资金投入 DeFi 协议时,预言机就成了你需要关心的问题。在那里,SSP 会向你展示你正在签署的内容,并需要两台设备共同批准,但它无法评估协议的价格数据源是否可靠。这项尽职调查由你自己负责,而核实合约以及由谁控制它们正是其中的一部分。
坦诚的总结
区块链看不到自身之外的世界,所以由预言机把数据带进来,而每个依赖这些数据的合约都会继承预言机的弱点。许多大型 DeFi 攻击操纵的是价格数据源,而不是攻破代码。
当你使用依赖价格的协议时,问一问这些价格从何而来。聚合良好的多来源预言机远比单个池子难以欺骗;而只有单一数据点的「去中心化」代码,并不像看上去那样去中心化。


