用途
该技能用于在 Hedera 网络上读取 Chainlink Data Feeds(价格馈送),适用于智能合约中对 AggregatorV3 价格馈送进行读取与校验的场景,尤其是 Hedera 测试网(链 ID 296)与主网(链 ID 295)。
工作模式
采用 push feed 模式:Chainlink 聚合器在链下更新,链上读取方调用 latestRoundData(),并且必须拒绝不完整、非正数或过期的轮次。
数据流向为:Chainlink DON → AggregatorV3Interface feed → 消费者调用 latestRoundData()。
消费者可以选择将 feed 包装在本地接口之后,这是可选项。不要假定某个项目特定的适配器名称。
主要能力与校验要点
快速参考中的各部分角色:
- AggregatorV3Interface:latestRoundData() 与 decimals()。
- 轮次完整性:answeredInRound >= roundId 且 updatedAt != 0。
- 价格:answer > 0(feed 通常是有符号 int256)。
- 新鲜度:将 block.timestamp - updatedAt 与最大过期时间比较。
- 精度:将 feed 的 decimals 归一化到消费者使用的精度(常见为 18)。
- 交易对标识:若对交易对键做哈希,优先使用规范的大写符号(HBAR、USD)。
Hedera 链 ID:测试网 296,主网 295。
参见 references/hedera-feeds.md 了解 Hedera feed 地址的来源,参见 references/examples.md 了解读取与归一化示例。
关键原则:先完整性,再新鲜度
绝不要从未缺失或未完成的轮次返回价格。以下条件应 revert:
- answeredInRound < roundId:聚合器尚未完成该轮次。
- updatedAt == 0:没有成功的更新。
- answer <= 0:无效或非正数价格。
- block.timestamp - updatedAt > maxStaleness:对本消费者而言已过期。
示例代码(保持原样):
(uint80 roundId, int256 answer,, uint256 updatedAt, uint80 answeredInRound) =
feed.latestRoundData();
if (answeredInRound < roundId || updatedAt == 0) revert IncompleteRound();
if (answer <= 0) revert InvalidPrice();
if (block.timestamp - updatedAt > maxStaleness) revert StalePrice(updatedAt, maxStaleness);
关键原则:使用 Hedera feed,而非以太坊地址
不要将以太坊主网的聚合器地址复制到 Hedera。应查找链 295 / 296 的 Hedera 专属 Data Feed 地址,并在上主网前重新核对文档。
若使用交易对映射,应为仅构造函数(constructor-only)设置,除非项目明确支持部署后更新。
精度归一化
feed.decimals() 通常为 8。在做算术运算前,转换为应用使用的精度:
uint256 price = normalizeToScale(uint256(answer), feed.decimals(), /* target */ 18);
保持转换舍入方式明确(通常向下取整)。不要将原始聚合器单位与 18 位小数金额混用。
清单
在 Hedera 上实现或审查 Chainlink 读取时:
- feed 地址取自 Hedera Data Feeds 文档(而非以太坊)。
- 在使用 answer 之前进行 latestRoundData 完整性检查。
- 非正数价格应 revert。
- 强制实施过期时间上限。
- 将 decimals 归一化到消费者精度。
- 链 ID 为 295 或 296(或项目文档记录的 Hedera 网络)。
参考
- references/examples.md — latestRoundData 与归一化示例。
- references/hedera-feeds.md — Hedera 聚合器地址的来源。
限制
资料未提供 Hedera 具体 feed 地址、各项目的收费或价格信息、除上述校验外的其他功能,以及具体网络部署步骤。