DeFi 价格预言机如何聚合并发布价格?
了解预言机如何聚合观察值、heartbeat 与偏离阈值如何触发更新、使用方如何检查单位与数据新鲜度,以及这些控制无法保证什么。
本指南内容预言机发布的是参考值,不是成交价
简短摘要
DeFi 价格预言机把链外参考值带入智能合约。在常见的推送式数据源中,多个链外观察值会合并成一份报告,报告发布到链上,协议再读取最新答案。偏离阈值与 heartbeat 设置会影响何时发送更新;`decimals`、报价单位、`updatedAt`,以及部分 L2 上的排序器状态,决定使用方是否应采用该答案。这些控制能降低特定风险,却不能证明价格真实、对每种用途都足够新,或对每笔交易都安全。
预言机发布的是参考值,不是成交价
预言机把区块链之外的信息带入只能根据链上状态执行的代码。借贷协议可以用资产/计价货币数据源估值抵押品;衍生品合约可以使用明确定义的参考值进行结算或检查风险限额。合约能读取写入链上状态的数字,却不能直接查看每个外部交易所的订单簿。
“价格”一词可能指不同度量。数据源可以描述某资产相对于计价货币的价格、协议定义的赎回比率,或其他明示数量。它不一定是大额头寸实际可卖出的价格。池子的即时兑换比率可能与中心化交易平台的最后成交价不同。DEX 兑换指南解释池中报价与最终成交为何会偏离;标记价格与最新成交价指南说明另一种市场价格区别。
预言机系统也有不同形式。推送式数据源会定期把答案写入合约,使用方读取最近发布的值。拉取式设计则可在用户或应用请求时提供签名报告。本文聚焦常见的 EVM 推送式价格数据源,并以 Chainlink 文档中的接口为例,不代表所有 DeFi 协议都使用同一提供方或更新规则。
观察值如何变成链上答案
在 Chainlink 的 Offchain Reporting 设计中,预言机节点在链下交换观察值,并就一份报告达成一致。达到法定数量的节点对报告签名;发送节点通过交易提交报告;聚合器验证签名,并提供答案、轮次标识和时间戳。文档所述设计会公开已报告观察值的中位数。这样无需把每个观察值都单独写成交易,同时仍能在链上验证报告签名。详情见 Offchain Reporting 文档。
使用方合约通常不会重做整个聚合流程,而是调用数据源代理合约的 latestRoundData() 来读取当前轮数据。Chainlink 建议对选定的数据源使用代理地址;代理背后的聚合器可能变化。EVM 读取指南和 API 参考介绍了接口,也说明了为什么数据源地址会因网络而异。
聚合只是数据质量的一部分。独立节点运营者仍可能依赖相同的交易平台、数据供应商或市场惯例。当有足够有效观察值时,中位数可以减小离群值的影响,但它不能为流动性不足的市场创造深度、纠正资产标记错误,也不能证明该参考值符合某个协议的具体用途。

Heartbeat 与偏离阈值控制发布节奏
许多推送式数据源同时使用偏离阈值和 heartbeat。偏离阈值是相对于上次发布答案的百分比变化,可触发新报告;heartbeat 是时间条件,即使价格变动未超过偏离阈值,也可能要求更新。每条数据源的资产、网络、偏离阈值和 heartbeat 等设置,可在当前 Data Feeds 目录及数据源地址页查询。
这些参数因数据源而异,并不等于“每 N 秒一定更新”。价格只小幅变动时,可能要等到 heartbeat 条件满足才有更新。若波动越过阈值,系统可能更早请求报告,但数据收集、报告发送和区块收录仍需经过运维与网络环节。Heartbeat 描述的是触发规则,不能保证市场参考值永不陈旧,也不能保证某一时刻一定上链。
阈值也不会替协议决定可安全承受多少价格变动。抵押品变化快的借贷市场,可能需要更严格的数据年龄限制或不同的风险处理方式;使用缓慢变化参考值的应用则可能不同。协议应自行设定可接受的数据年龄与应对方式,而不是把数据源触发参数当作安全政策。
解读答案、精度位数与报价单位
latestRoundData() 返回 roundId、answer、startedAt、updatedAt 和 answeredInRound。API 参考标注 answeredInRound 已弃用。answer 是定点格式的整数,不一定能直接读成美元金额。应读取数据源的 decimals() 与描述,并按照对应网络和资产对解释答案。例如,假设 BTC/USD 数据源返回 6,725,000,000,000,精度为 8 位,则换算后是每 BTC 67,250.00000000 美元。
数据源精度与代币精度代表不同数量。ERC-20 余额可能采用 18 位代币精度,而价格答案可能采用 8 位数据源精度。合约相乘前必须按各自单位正确缩放。如果假设所有数据源都是 8 位,或把代币精度用到预言机答案上,估值可能相差多个数量级。
资产对方向与精度同样重要。BTC/USD 表示每 BTC 对应多少美元;用 1 BTC 乘答案才能得到美元价值。USD/BTC 的单位相反。计算衍生资产对时,两个数据源都要按精度缩放,并按正确顺序相除;Chainlink 的价格计价示例用 BTC/USD 和 EUR/USD 推导 BTC/EUR。还要核实地址、资产对、链以及资产都符合预期抵押品或负债。
过期数据检查是应用自己的规则
updatedAt 记录最近一轮更新的时间。使用方可以将其与当前区块时间比较,拒绝超过应用自定最大年龄的答案。根据数据源和协议,还可检查更新时间非零、正价格资产的答案为正数,或答案落在预期范围内。有效范围取决于具体产品;写死的边界也可能随市场变化而变得不安全。
设想一个假设的借贷市场接受 4 个单位的抵押代币,并采用 75% 的抵押系数。数据源精度为 8 位,最近答案为 200,000,000,000,即每个代币 2,000 美元。显示的借款上限是 4 × $2,000 × 75% = $6,000。假设市场已跌至 $1,820,跌幅 9%;示例数据源的偏离阈值设为 10%,heartbeat 设为 60 分钟。此时两个假设条件都不一定触发新报告。按 $1,820 重新计算,上限是 $5,460,因此旧答案会让本例的借款上限高估 $540。
如果应用拒绝超过 5 分钟的价格,而当前轮数据在 20 分钟前更新,它可以暂停新增借款,不采用 $2,000 的答案。该检查不会更新数据源,只会改变数据超过应用年龄限制时允许的操作。借款、提款、清算和还款可以采用不同处理方式,因为暂停全部操作也可能造成伤害。这里的数字与触发设置都是为说明关系而假设的,并非当前数据源参数或风险建议。
L2 排序器检查针对另一种中断风险
在 L2 上,用户通常通过排序器提交交易。排序器停机或恢复时,用户可能无法正常交易,交易可能延迟,并在市场情况变化后才执行。一个看起来很新的 L2 预言机答案,并不能说明应用的执行路径正常,也不能说明所有用户都有同等的行动机会。
Chainlink 将 L2 Sequencer Uptime Feed 文档化为独立状态数据源。在其文档接口中,answer == 0 表示排序器正在运行,answer == 1 表示排序器已停机。startedAt 记录状态变化时间;示例使用方会先检查状态,并在恢复后等待由应用定义的宽限期,再读取价格数据源。应核实具体 L2 的地址和网络行为。详情见 L2 Sequencer Uptime Feed 指南。
宽限期让用户和系统有时间恢复操作,但不保证市场数据已经刷新。它不表示所有待处理交易都已完成、价格现在准确,或应用可以同时安全地重新开放所有操作。不同 L2 在排序器、强制交易、消息转发和恢复机制上各不相同,协议应根据实际网络的文档行为处理,而不是假设所有 Rollup 的中断过程相同。
这些控制无法保证价格正确或结果公平
法定数量、中位数、偏离触发、heartbeat、年龄限制和排序器状态检查分别回答不同且有限的问题。它们不能保证来源市场流动性充足、观察值对应正确资产、数据提供方相互独立,也不能保证中位数适用于某个具体交易规模。时间戳很新仍可能伴随错误或被操纵的数值;市场平静时,旧值也可能暂时接近市场水平。
任何更新触发机制都无法消除市场跳空。两次发布之间价格可能大幅变化,数据源可能不可用,链可能拥堵,合约也可能在单位换算、资产对选择、过期检查或清算规则上出错。某些数据源对特定数据可能依赖单一来源或提供方。Chainlink 的数据源质量选择指南要求集成者评估来源流动性与依赖,并为陈旧、延迟、缺失或异常值设计处理逻辑。
断路器和边界可以限制某些操作,却无法预测每一种有效的市场状态。边界过紧会拒绝正常行情;边界过宽则可能挡不住危险变化。预言机控制不能消除智能合约、治理、流动性、跨链桥、抵押品或清算风险。稳定币的预言机价格也不等同于持有人能否按面值赎回;稳定币脱锚指南介绍了相关机制。
依赖价格前先追踪完整的数据路径
对一个协议,应确认具体链、数据源代理、资产对、报价货币、答案精度和合约地址。核对数据源描述与目标资产,查询受支持地址列表,避免复制另一条链的地址。若用途需要更密切监测,应检查数据源模型、近期观察值或更新历史。Chainlink 提醒,聚合器可能因网络不同而异,也应检查合约源码与配置。
接着追踪答案如何被使用:正确换算代币数量和价格单位,查看 updatedAt,确认过期界限,并找出无效答案会被拒绝、触发暂停,还是只改变特定操作。在 L2 上,查明 uptime 数据源、状态含义、恢复时间、宽限期,以及排序器延迟交易的处理方式。针对实际合约逻辑检查过期数据和停机/恢复两种情形。
评估借贷或交易协议的用户,应查看文档与已部署合约的行为,而不能因为看到熟悉的预言机名称就认为风险都已覆盖。要问清哪个价格会影响估值、借款、清算或结算;数据源过期或不可用时会发生什么;谁能修改风险参数。真正决定预言机观察值如何影响账户的是协议的价格数据路径,而不只是仪表板标签。
常见问题
Q1Heartbeat 是否意味着价格始终在该时间范围内更新?
不是。Heartbeat 是数据源更新设计中的时间触发条件,并不保证报告发布或区块收录在精确时刻完成,也不代表答案始终匹配实时市场。应检查 updatedAt,并按具体用途制定新鲜度规则。
Q2使用中位数的预言机数据源仍可能出错吗?
会。中位数能降低部分离群观察值的影响,但不能修复共同来源问题、流动性不足或遭操纵的市场、错误资产对或有缺陷的使用方逻辑。聚合只是整体风险设计中的一种控制。
Q3L2 排序器 uptime 数据源等同于价格过期检查吗?
不等同。Uptime 数据源报告排序器状态与状态变化时间;价格过期检查则把价格轮次的 updatedAt 与当前时间比较。应用可能需要两者以及恢复后的宽限期。
资料来源与延伸阅读
报告问题
我们会准备一封包含本文链接的邮件。发送后,Mark 才会收到你的反馈
快速检查
读完指南后,用 3 道题检查一下
问题 01
BTC/USD 数据源返回 `6,725,000,000,000`,精度为 8 位。换算后的价格是多少?
选择答案即可查看解释