请教一下,VRF 在接收结果的函数中,对数组进行赋值会无法成功执行,测试过在其他函数中执行循环和数组赋值没问题,放到 VRF 的回调函数中就不行。
后来发现,VRF 在回调函数中做了一个小型的循环,花费的 gas 费高,如果我有较大的循环和处理,有没比较好的方法能减少 gas 费?
举个例子,我外部有个 10000 个值的 mapping,想在回调里循环并给对应的赋值,现在需要循环 10000 次并对应赋值,这样的话就会超出 Chainlink 回调函数的 gaslimit 上限。
Chainlink VRF 节点在收到随机数的 request 之后,会通过执行 fulfillRandomWords()
函数来给用户的合约写入随机数。
然而为了避免合约错误,在 fulfillRandomWords()
函数中会有一个 gaslimit 的限制,这个限制主要是为了防止 VRF subscription 中的余额被一个错误的交易消耗光。你最开始遇到的问题大概率是 fulfillment 函数消耗的 gas 费用超过了gaslimit。
如果说在 fullfillRandomWords()
中要使用多个随机数的话,可以一次申请多个随机数写入数组,这样比在 fullfillRandomWords()
通过算法计算出多个随机数要节省 gas。