有两个疑惑。
第一个,chainlink的返回的这5个字段分别代表什么意思,在文档中没找到解释:
(
uint80 roundID,
int price,
uint startedAt,
uint timeStamp,
uint80 answeredInRound
) = priceFeed.latestRoundData();
第二个,chainlink我看了下相应的交易对信息,如果我想要将100cny计算出需要多少ETH的话,那么就需要经过:
首先,查询 CNY / USD 的价格,然后再查询 USD / ETH 的价格。然后才能给出100CNY能兑换多少ETH。这样的前后依赖的情况下,该怎么确保一次交易的成功呢?
目前我的想法是,前端用户提交了100CNY,且提交有预言机给的CNY/USD的roundId,和 USD/ETH的roundId,然后在合约中进行验证。结合预言机给的startedAt做一个时间范围限制,比如说超过10分钟的roundId就视作无效。不知道这个思路是否可行?这个思路是否太复杂了,是否有跟简单的方法?
第一个问题中的字段解释,首先需要知道这个函数的定义是下面这个:
function latestRoundData() external view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
所以问题中提到的几个字段有几个不一样,本质是一样的。
roundID
,表示当前的更新轮次编号,每个价格对的更新由两个因素决定,心跳时间和价格偏差阈值,两个任意一个达成就会触发下一轮的更新price
: 资产对的价格数据,在函数定义中用的是answer
startedAt
:轮次开始的时间戳timestamp
: 该轮次更新时间,对应updatedAt
answeredInRound
: 答案计算出来的轮次编号关于第二个问题,连续发出两个请求,写在一个合约函数中,作为一个原子交易是可行的。
CNY / USD price today | Chainlink
ETH / USD price today | Chainlink
查看这两个价格对的信息可以看出,用roundId不一定可行的,不同的价格对的信息是不同的。如心跳时间和价格的偏移都有不同的参数。