无法从ETH/USD喂价获取Phase 1和2的phaseId数据求助
我正从ETH/USD喂价合约0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419获取历史数据,当前合约共有6个phase,但仅能从phase 3开始获取数据。调用phase 1和2时仅返回执行回退,我期望获取前两个phase的数据,想确认是这两个phase无数据还是我的实现有误?我参考了Chainlink官方离线历史数据文档,实现代码如下:
//this will iterate from the start of a given aggregator phase func (ca *ChainlinkAggregatorV3Provider) iterateOverGivenPhase(phaseId int64 )error{ roundId := ca.getPhaseStartRoundId(big.NewInt(phaseId),big.NewInt(1)) err := ca.iterateRounds(roundId) return err }
确认Phase 1/2是否存在有效数据
Chainlink喂价合约的早期Phase可能因合约升级、迁移或初始部署配置问题,本身未存储历史数据。你可以直接在链上查询合约的getPhaseData方法,传入phaseId 1和2,查看返回的起始/结束roundId以及价格字段。若起始round大于结束round,或价格字段为空,说明这两个Phase确实无数据。检查
getPhaseStartRoundId的实现逻辑
你的代码依赖getPhaseStartRoundId计算对应Phase的起始roundId,Chainlink的Phase起始roundId规则是phaseId << 64 | 1(每个Phase的roundId由64位phase前缀+64位round序号组成)。如果该方法未按此逻辑拼接,生成的roundId会无效,导致调用回退。验证
iterateRounds的错误处理逻辑
即便起始roundId正确,iterateRounds遍历过程中若遇到不存在的round,也会触发回退。你需要确保该方法包含错误处理,比如通过latestRoundData判断round是否存在,或调用getRoundData时捕获回退异常,避免硬遍历导致的执行失败。排查合约历史迁移情况
该ETH/USD喂价合约可能是从旧版本迁移而来,Phase 1和2的历史数据可能保留在旧合约地址,而非当前的0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419。你需要确认是否存在对应的旧合约地址,用于查询早期Phase的数据。
内容的提问来源于stack exchange,提问作者El Sitar

