本文简要分析了最近 Chainlink 对 Luna 的报价失误问题
近期 Luna 是圈内最热门的话题了,其价格从最高的 100 多美金,直接跌倒不到 0.000001 美金,后面又涨了 100 多倍到 0.000X 美金。
当大家都在分析 Luna 本身时,币安链上最大的借贷应用 Venus 却出事了,有人存入大量的 Luna,借走了大量资产,导致平台坏账。Venus 使用业界头部预言机 Chainlink作为价格源,当时 Luna 的价格在 0.01 美金左右,但从 Chainlink 拿到的报价却停留在了 0.107 美金。
Chainlink 的报价居然停止工作了
按照 Chainlink 官方回应,停止报价的原因是因为 Luna 的价格波动超出了正常范围,触发了内置的熔断机制,这是协议抗风险的一种措施。
只是这个抗风险的措施却带来了实实在在的损失,也是滑稽。
官方的第二个回应,是让 Luna 价格源 404(https://data.chain.link/bsc/mainnet/crypto-usd/luna-usd)了。
Chainlink 的价格都是最终由一个叫聚合器(Aggregator)的合约生成的,比如 ADA/BNB 的聚合器就是这个:https://bscscan.com/address/0x50204d36c231cd4f0de67545cd1e36c01336e46b#code 当报价节点报价时会调用这个合约的 transmit 函数,这个函数有下面的逻辑。 其实最核心的就是下面这句:
require(minAnswer <= median && median <= maxAnswer, "median is out of min-max range");
当生成的价格超过预设的一个价格范围后,报价会失败。 达到的效果就是价格会停留在上次成功报价不变。
这个价格范围是价格聚合器合约被创建时就通过构造函数设置好的。
// Lowest answer the system is allowed to report in response to transmissions
int192 immutable public minAnswer;
// Highest answer the system is allowed to report in response to transmissions
int192 immutable public maxAnswer;
这两个变量被设置成了 immutable, 意味着只能被设置一次,之后不可更改。Chainlink 要紧急手动修复这个价格范围也就不可能了。
如果价格只是短期异常波动,这个设置并没什么问题,但是当价格像 Luna 这样正常单边超大幅波动时,问题就出现了,价格再也报不上来了。这个聚合器合约我看了一下又是不可升级的,意味着必须要替换合约才能修正价格范围了。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!