Chainlink外部适配器调用时encode_tx incorrect length错误排查
问题根因定位
你配置的encode_data任务ABI(uint256[] winners)是uint256动态数组的正确ABI定义,对应输出的编码结果也符合以太坊ABI规范,不存在错误。
报错的核心原因是参数类型不匹配:你encode_tx任务中fulfillOracleRequest方法的入参data被定义为bytes32(固定32字节长度),但你传入的是uint256数组编码后的变长bytes,长度远大于32字节,导致类型校验失败。
排查与修复步骤
- 第一步:调整Oracle方法参数类型
检查你使用的Oracle合约的fulfillOracleRequest方法定义,因为你需要传递动态长度的uint256数组,需要将方法最后一个入参的类型从bytes32修改为bytes,同时同步修改jobSpec中encode_tx任务的ABI定义,将data字段的类型改为bytes即可解决当前报错。 - 第二步:同步调整消费合约逻辑
同步修改你的业务消费合约的callback方法,接收bytes类型的返回值后,在合约内通过abi.decode(data, (uint256[]))解码得到winner数组即可正常使用。 - 第三步:临时验证排除其他干扰
可以将encode_tx的data字段临时替换为固定32字节测试值,比如0x0000000000000000000000000000000000000000000000000000000000000001,如果encode_tx步骤不再报错,即可确认是参数类型不匹配导致的问题,无需调整encode_data的现有配置。
内容的提问来源于stack exchange,提问作者Daniel Aguilar López
相关产品推荐
相关产品推荐

