文章详细介绍了 Chainlink 价格预言机的工作原理、智能合约架构和价格更新的机制,并提供了相关的代码示例和 Etherscan 链接。
Chainlink 价格预言机是具有公共视图函数的智能合约,返回以美元计价的特定资产的价格。
链下节点从各个来源(如交易所)收集价格,并将价格数据写入智能合约。
以下是获取 ETH / USD 价格的智能合约:<https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419/advanced#readContract>
当我们调用latestAnswer()
函数时,我们得到以太币的价格。当我们查询decimals()
时,我们得到用于解读答案的小数位数。
因此,根据预言机,当前以太币的价格是 $2053.05552675(在撰写时为真)。
如果你只是想了解 Chainlink 预言机的工作原理,可以到此为止——这就是价格预言机的全部内容!
接下来是一些重要的实现细节,如果你打算在项目中使用它们。
我们将使用 ETH / USD 作为运行示例,但 Chainlink 支持更多资产价格。
此函数 latestAnswer()
并不告诉我们最后一次价格更新的时间。如果价格更新延迟,智能合约可能会基于过时的价格做出决策。
在下方的绿色框中,我们看到从 latestAnswer() 得到的相同价格,而在蓝色框中我们看到它的最后更新时间(以 unix 时间戳表示)。
智能合约可能希望设定一个阈值,以便它们使用替代预言机或暂停关键决策,直到 updatedAt
字段足够新。
依赖单一节点或数据来源来获取价格是危险的,因此 Chainlink 价格源拥有多个被白名单的节点来提供价格。
下方截图展示了 ETH / USD 价格源的提供者。
它们在给定时间提供的价格范围可以通过报告的价格的微小变化看到。请注意,价格的“美分”部分从 26 美分(顶行)变化到 73 美分(底行)。
链下价格通过 transmit function 进入智能合约生态系统。该函数接受(已排序的)价格列表和来自节点的签名列表。在预言机上报告的价格是价格的中位数。下面我们显示了来自 Etherscan 的相关代码行。
读者可能已经注意到 latestRoundData()
函数与 transmit()
不在同一个合约中。这里有三个智能合约在进行操作:
在价格更新期间,节点的签名和价格被批量处理并发送到聚合器合约中的 transmit()
。然后,聚合器合约调用 validate function 在验证者合约中。根据那里的规则,价格更新可能会被拒绝。以下是此类交易的 tenderly trace 的截图。紫色调用代码显示了跨合约调用。
由于查看价格涉及跨合约调用,建议通过使用 访问列表交易 来节省 200 Gas,以“预热”聚合器调用。请在这个 仓库 中查看使用访问列表与 Chainlink 价格预言机的示例。
每分钟将状态更新交易发送到区块链并不切实际。因此,Chainlink 在两种情况下更新价格:
这些参数在下方的 Chainlink ETH / USD 仪表板截图中高亮显示。
已经有很多文章讨论因为错误使用 Chainlink 预言机所带来的 智能合约安全 问题,因此我们将在这里不再赘述。我们建议读者参考 Dacian 的 文章,其中列出了这些潜在问题。
请查看我们的 solidity bootcamp,以深入学习智能合约开发。
最初发布于 2024 年 1 月 11 日
- 原文链接: rareskills.io/post/chain...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!