Chainlink多参数请求调用fulfillMultipleParameters报arrayify无效值错误排查
问题原因
- 多返回值请求参数配置缺失
你当前的请求逻辑仅添加了times参数,没有告知Chainlink节点需要返回3个对应汇率值的取值路径,也没有配置多值返回的声明,导致节点仅返回空值或单值,回调函数需要3个uint256参数,拿到空值后做字节编码时触发了你碰到的错误。
Chainlink多值请求需要调用addMultiPath方法指定每个返回值对应的数据源字段路径,比如你要取usd、eur、jpy三个汇率,需要在请求中添加对应配置:
req.addMultiPath("usd,eur,jpy");
如果节点返回的是嵌套结构,也可以分别指定每个值的路径:
req.add("path", "rates,usd"); req.add("path", "rates,eur"); req.add("path", "rates,jpy");
- Job ID配置不匹配
你在函数内部硬编码覆盖了传入的specId,首先要确认这个硬编码的specId对应的Chainlink节点Job是支持多值返回的,Job的任务流水线必须配置为输出3个uint256类型的结果,要是Job本身仅支持单值返回,也会返回无效空值触发错误。 - 参数类型不匹配
要确认节点返回的三个值确实是uint256类型,如果节点返回的是int256或者其他类型,和回调函数的参数类型不匹配,解码失败也会抛出类似错误。
修正后的请求代码示例
function requestMultipleParameters( bytes32 specId, uint256 payment) public{ // 注意:硬编码specId仅用于测试,生产环境建议从参数传入 specId = 0x3934636531316335393937643432336338646331383761653431306536653163; payment = 100000000000000; Chainlink.Request memory req = buildChainlinkRequest(specId, address(this), this.fulfillMultipleParameters.selector); req.addUint("times", 10000); // 新增多返回值路径配置,对应你需要的三个汇率字段 req.addMultiPath("usd,eur,jpy"); requestOracleData(req, payment); }
内容的提问来源于stack exchange,提问作者Daniel Vieira
相关产品推荐
相关产品推荐

