Bru*_*ghe 3 blockchain ethereum solidity thegraph chainlink
我需要获取代币从特定时间到最近一轮的 Chainlink 价格。该时间根据用户输入而变化,但根据令牌的心跳,窗口期相对较短(最多 1 天到 2 周)。这用于计算智能合约和应用程序主页上的支付价格。
为了获取历史价格数据,Chainlink 需要一个“roundId”,它是一个非增量值。
从 Chainlink 获取给定时间窗口的所有 roundId 或以开放、去中心化且可在 Solidity 智能合约中访问的方式记录它们的最佳方法是什么?
Chainlink Price Feed 的每个代理合约都可以有多个基础聚合器合约,其中一个在任何给定情况下都被设置为“活动”合约。即,每当 Chainlink Labs 团队部署新版本的聚合器时,他们都会更新代理合约,将当前的聚合器版本设置为新版本,并且所有新的价格数据开始写入新的聚合器。
基于此,如果您想要过去几周左右的代理合约/价格对的历史价格数据,您需要转到代理合约的当前聚合器,然后获取当前回合信息(包括时间戳) ,然后循环返回聚合器轮次,直到到达小于搜索参数时间戳的轮次。
要查找代理合约当前的聚合合约地址,您可以调用aggregator代理合约中的 getter 函数。
阶段 ID 可以被认为是一个递增的 ID 号,代理合约在将每个聚合器添加到代理时使用它来识别每个聚合器,因此第一个是 1,第二个是 2 等等。要找出当前的阶段 ID 是什么对于当前聚合器,您可以使用代理合约中的phaseId getter函数。
聚合器回合 ID 从 1 开始,每次加 1。例如,您可以使用聚合器latestRoundgetter 函数查找它存储的最后一轮,然后从该数字开始作为 的输入参数getRoundData,然后将数字减一并循环,直到到达时间点。
与聚合器回合 ID 不同,代理回合 ID 是那些又大又长的数字36893488147419113293,例如 、 和 实际上只是基于聚合器阶段 ID 和聚合器回合 ID 的派生值。这样做是为了确保代理回合 ID 的值始终增加,并且不同聚合器的相同回合之间永远不会有任何重叠,例如来自阶段 ID 1 的聚合器的第 5000 回合的代理回合 ID 应该低于第 5000 回合的代理回合 ID来自阶段 ID 2 的聚合器
在 Solidity 中,您可以使用以下公式轻松复制代理回合 ID 派生值,传入聚合器的阶段 ID 和聚合器回合 ID
return uint80(uint256(_phaseId) << 64 | _aggregatorRoundId);
Run Code Online (Sandbox Code Playgroud)
您甚至可以获取该派生值并将其传递到代理合约函数中,并获得与在聚合器合约中getRoundData调用给定聚合器回合 ID 相同的数据结果。getRoundData
我发现使用这些的一个好方法是直接与 etherescan 上的函数交互,并查看返回的数据。即,这是 Kovan ETH/USD 代理及其最新聚合器
关于第二个问题的答案,最好的方法是从“现在”开始,即获取最新的聚合器,获取聚合器中的最新一轮,然后通过将聚合器回合ID减1来及时返回,并继续获取定价信息,直到回合时间戳<您的搜索时间戳。
最后,Solidity 中的循环并不是非常高效。您可以采取的另一种方法是将外部计算卸载到预言机,预言机可以为您提供正确的回合 ID,然后您可以使用它并在链上验证结果。以下是该设计模式的示例,其形式为外部适配器,该适配器根据时间戳检索历史价格数据。Kovan 上也有一个实时版本,请查看自述文件以获取更多信息
| 归档时间: |
|
| 查看次数: |
1554 次 |
| 最近记录: |