跳到正文

预言机价格陈旧

当预言机价格记录的更新时间早于特定操作允许的最大期限时,该价格对该消费者而言即属陈旧;安全处理还须验证数据源、排序器、备用机制及受控恢复。

更新于

仅供教育参考,不构成投资建议;投资可能产生损失。

直接答案

age = consumerClock - sourceTimestamp 超过该操作配置的 maxAge 时,预言机数值对特定消费者操作而言即属陈旧。价格没有变化仍可能是新鲜的,而刚发布的数值仍可能在经济上错误。消费者必须先拒绝缺失或未来的时间戳及无效答案,再应用针对数据源、资产、链、市场时段和操作的验收政策。

心跳与偏差阈值是发布触发条件,并非新鲜度保证或服务等级协议。触发后报告仍可能延迟,市场变动也可能低于偏差阈值,而某项操作要求更严格的最大期限。拉取式预言机还有另一项边界:调用者可能须先提交经过认证的更新再读取,合约则必须拒绝早于其规定期限的更新。

在 L2 上,排序器状态与恢复宽限期构成独立门槛。通过该门槛并不能证明资产价格新鲜、L2 已最终确认或所有用户均有平等访问机会。备用价格和最后有效价格是受控降级模式,不是真相;每个来源与恢复路径都需要明确单位、时间戳、独立性、权限、允许操作及对账规则。

运作机制

  1. 固定链、区块与时钟、消费者合约与操作、数据源代理与聚合器、资产对与小数位、接口版本、备用配置及升级状态。
  2. 通过已部署接口读取精确响应,并处理回退或无数据状态。先验证答案、状态或适用的置信度,以及 sourceTimestamp != 0sourceTimestamp <= consumerClock,然后再做减法。
  3. 记录心跳、偏差、市场时段与发布配置,再为每项操作独立设置 maxAge。明确规定边界,例如接受 age <= maxAge,拒绝 age > maxAge
  4. 在支持的 L2 部署上,验证排序器数据源的初始化和状态,依据文档规定的字段计算恢复后经过时间,执行配置的宽限期,再单独检查价格新鲜度。
  5. 追踪复合价格、比率价格和备用价格的每个必要组成部分。统一方向与单位,并以最陈旧的必要依赖项限制有效新鲜度,而非采用最新时间戳。
  6. 按操作定义正常、降级和暂停状态。新增借款、铸造或杠杆可以安全关闭,同时允许还款或增加抵押品;以陈旧价、备用价和恢复价测试风险敞口、流动性及清算执行者容量。
  7. 监控来源与代理变更、更新延迟、拒绝率、排序器状态、跨来源偏差及市场时段;演练中断、备用失败、跳价恢复、集中清算、MEV、坏账核算及恢复正常模式。

对于 Chainlink 风格的接口,latestRoundData() 可以提供轮次标识符、带符号答案、开始时间、更新时间和旧版轮次字段。当前 API 将 answeredInRound 标为已弃用,因此不能把历史上的不等式检查表述为当前通用规则;必须检查具体代理、聚合器和实现。时间戳表示文档所述数据源状态的更新时间,并不说明该数值可按任意规模成交。Solidity 的 block.timestamp 是共识约束下的当前区块时间戳,不是外部挂钟预言机。

计算示例

  • 最大期限边界。consumerClock = 1,800,000,000sourceTimestamp = 1,799,999,100,则 age = 900 seconds = 15 minutesmaxAge = 600 seconds 的政策会因超出 300 seconds 而拒绝;maxAge = 1,200 seconds 的政策则接受,并留有 300 seconds 余量。因此,同一数据源数值可对一项操作有效,对另一项操作陈旧。
  • 触发条件并非新鲜度。 上次发布价格为 100.00,偏差触发值为 1%,心跳为 3,600 seconds。经过 2,700 seconds 后,市场观察价 100.80 仅偏离 0.8%,两个教学触发条件均未触发。价格达到 101.20 时偏差为 1.2%,可能启动发布,但在有效新报告上链前,消费者仍会读到 100.00
  • L2 双重门槛。 排序器数据源报告正常,startedAt = 1,799,996,400consumerClock = 1,800,000,000grace = 3,600 seconds,所以经过时间恰为 3,600 seconds。若政策在 elapsed <= grace 时阻止操作,该操作仍被阻止,到 3,601 seconds 才符合条件。是否最终可执行仍取决于独立的价格时间戳、答案及消费者的其他检查。
  • 恢复断崖。 抵押品为 10 ETH、债务为 12,000 USD、清算阈值为 75% 时,陈旧的 2,000 USD/ETH 价格给出 healthFactor = 10 * 2,000 * 0.75 / 12,000 = 1.25。恢复后的 1,400 USD/ETH 价格给出 0.875。按这些教学输入,该账户变为符合清算条件,但实际执行仍取决于协议规则、流动性、清算执行者、燃料费、排序及链可用性。

风险

  • 链、数据源、代理、聚合器、资产对或接口版本错误。
  • 消费者读取不带时间戳或文档所述状态的答案。
  • 未拒绝缺失的零时间戳、未来时间戳或减法下溢。
  • 对资产、操作、市场时段或波动性而言,最大期限过于宽松。
  • 最大期限过严,造成拒绝服务或阻止降低风险。
  • 把心跳视为保证的发布时间期限或服务等级协议。
  • 未触发偏差阈值时,低于阈值的漂移或基差持续累积。
  • 已触发的报告因来源、签名者、网络、燃料费、中继或链故障而延迟。
  • 把已弃用或特定实现的轮次检查普遍应用。
  • 数据源、代理、聚合器、心跳、偏差或接口配置变化未被发现。
  • 忽略休市、假日、暂停交易或结转数据的语义。
  • 复合或比率价格看似新鲜,但必要组成部分之一已陈旧。
  • L2 排序器状态被忽略、未初始化、延迟或从错误网络读取。
  • 恢复宽限期缺失、配置错误或存在差一边界错误。
  • 排序器状态通过,但资产价格仍陈旧或不可用。
  • 混淆 L1 时间、L2 区块时间、来源观察时间、发布时间与挂钟时间。
  • 拉取式更新缺失、过旧、被选择性提交、格式错误或资金不足。
  • 备用价或最后有效价格陈旧、高度相关、尺度不同或形成循环依赖。
  • 开放式失败允许不安全操作,而一律关闭会阻止还款、增加抵押品或有序恢复。
  • 恢复跳价、清算聚集、MEV、流动性不足、暂停竞态或坏账对账导致次生损失。

常见误区

  • “心跳保证每个间隔都有新鲜更新。” 它只是更新触发配置,来源或链故障仍会延迟发布。
  • “近期时间戳证明价格正确且可成交。” 它只证明文档所述更新时间;来源质量、单位、置信度、市场深度及消费者逻辑仍是独立问题。
  • “一个最大期限适用于所有数据源和操作。” 资产、市场时段、链,以及借款、清算、交易与结算操作有不同延迟和活性需求。
  • “排序器恢复就能立即恢复所有操作。” 恢复宽限期和价格新鲜度是独立门槛,协议或链安全政策还可能增加更多条件。
  • “备用机制或让所有函数回退总是最安全。” 薄弱的备用机制会错误定价风险,而无差别失败会阻止用户还款或改善抵押率。

相关主题

来源

导航

搜索知识库...