如何实现点击按钮更新ChainLink聚合器价格及uint256转int256问题
价格冻结的原因
Chainlink喂价的更新逻辑不由用户调用触发,节点网络会按照预设的两个条件更新链上喂价数据:
- 价格波动达到预设偏差阈值(比如BTC/USD喂价的触发阈值是波动0.5%)
- 达到预设的最大更新间隔(比如至少每小时更新一次)
你调用getThePrice方法只是读取链上聚合合约已经存储的最新喂价,只要节点还没推送新的价格到链上,你每次调用拿到的都是同一个值,这是正常机制,不需要修改现有合约代码。如果要测试价格变化,可以等待喂价触发更新后再调用,或在测试网使用自定义的模拟喂价合约手动更新数值。
返回时间戳的解决方法
你遇到的报错有两个原因:
- 你的函数声明是
function getThePrice() public view returns (int),仅支持返回1个int类型的值,你在return price;之后再加return timeStamp;本身就不符合语法,执行到第一个return的时候函数就已经终止了 timeStamp是uint256类型,和函数声明的返回值类型int256不匹配,编译器无法自动隐式转换
如果你需要同时返回价格和时间戳,直接修改函数的返回值声明即可,不需要强制转换类型:
// 修改后的返回方法,同时返回价格和时间戳 function getThePrice() public view returns (int price, uint timeStamp) { ( uint80 roundID, int price, uint startedAt, uint timeStamp, uint80 answeredInRound ) = priceFeed.latestRoundData(); return (price, timeStamp); }
如果你确实需要把uint256转换成int256,可以用显式强制转换的语法,注意uint256的取值范围大于int256,如果原始值超过2^255 - 1会出现溢出问题,不过时间戳数值远小于这个阈值,正常使用不会有问题:
int256 convertedTimestamp = int256(timeStamp);
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

