gpt4 book ai didi

blockchain - 以去中心化方式从 Chainlink 获取代币历史价格数据的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-05 01:55:04 27 4
gpt4 key购买 nike

我需要获取代币从特定时间到最近一轮的 Chainlink 价格。此时间因用户输入而异,但会根据 token 的心跳相对较短的窗口(最多 1 天到 2 周)。这用于计算智能合约和应用程序主页上的支出价格。

要获取历史价格数据,Chainlink 需要一个“roundId”,它是一个非增量值。

从 Chainlink 获取给定时间窗口的所有 roundId 或以开放、去中心化且可在 solidity 智能合约中访问的方式记录它们的最佳方式是什么?

最佳答案

Chainlink 喂价的每个代理合约都可以有多个基础聚合器合约,其中一个在任何给定实例中都被设置为“事件”合约。即,每当 Chainlink Labs 团队部署新版本的聚合器时,他们都会更新代理合约以将当前聚合器版本设置为新版本,并且所有新价格数据开始写入新聚合器。

基于此,如果您想要过去几周左右的代理合约/价格对的历史价格数据,您需要转到代理合约的当前聚合器,然后获取当前回合信息 (包括时间戳),然后返回到循环中的聚合器回合,直到您到达小于搜索参数时间戳的回合。

要查找代理合约的当前聚合器合约地址,您可以调用代理合约中的aggregator getter 函数。

阶段 ID 可以被认为是一个递增的 ID 号,代理合约使用它来识别每个聚合器,因为它被添加到代理,所以第一个是 1,第二个是 2 等等。找出当前的是什么phase ID 是当前聚合器的,您可以在代理合约中使用 phaseId getter 函数。

Aggregator 轮次 ID 从 1 开始,每次增加 1。例如,您可以使用聚合器 latestRound getter 函数找到它存储的最后一轮,然后从该数字开始作为 getRoundData 的输入参数,然后减少数字逐一循环,直到到达您的时间点。

与聚合器轮次 ID 不同,代理轮次 ID 是那些非常长的大数字,例如 36893488147419113293,实际上只是基于聚合器阶段 ID 和聚合器轮次 ID 的派生值。这样做是为了确保代理轮 ID 的值始终在增加,并且不同聚合器的相同轮之间永远不会有任何重叠,例如,来自阶段 ID 1 的聚合器的第 5000 轮应该具有比第 5000 轮更低的代理轮 ID来自具有阶段 ID 2 的聚合器

在 Solidity 中,您可以使用以下公式轻松复制代理轮 ID 派生值,传入聚合器的阶段 ID 和聚合器轮 ID

return uint80(uint256(_phaseId) << 64 | _aggregatorRoundId);

您甚至可以获取该派生值并将其传递给代理合约 getRoundData 函数,并获得与在聚合器合约中调用 getRoundData 相同的数据结果给定聚合器回合 ID。

我发现一个玩转这些的好方法是直接在 etherescan 上与函数交互,并查看返回的数据。即这里是 Kovan ETH/USD proxy及其 latest aggregator

关于第二个问题的答案,最好的方法是从“现在”开始,即获取最新的聚合器,获取聚合器中的最新一轮,然后通过将聚合器轮 ID 减 1 来及时返回,并且继续获取定价信息,直到回合时间戳为<您的搜索时间戳。

最后,Solidity 中的循环不是很省油。您可以采用的另一种方法是将外部计算卸载到预言机,预言机可以为您提供正确的回合 ID,然后您可以使用它并在链上验证结果。 Here's an example该设计模式以外部适配器的形式出现,可根据时间戳检索历史价格数据。在 Kovan 上也有一个实时版本,查看自述文件以获取更多信息

关于blockchain - 以去中心化方式从 Chainlink 获取代币历史价格数据的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70377502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com