Chainlink Node作业运行出现encode_tx和submit_tx失败错误如何解决
Chainlink Kovan网络请求Fulfillment功能报错排查与修复方案
一、排查步骤
- 检查作业配置拼写错误:作业DAG执行流最后一行存在无关文本
enter code here,会导致任务流无法正确走到submit_tx步骤,触发执行错误。 - 验证占位符替换完成度:检查作业配置中两处
YOUR_ORACLE_CONTRACT_ADDRESS都已替换为Kovan网络上实际部署的Oracle合约地址,无多余空格、大小写符合EVM地址规范。 - 确认节点授权配置:你的Chainlink节点钱包地址必须已经在Oracle合约中完成fulfillment权限配置,未授权节点无法提交回调交易。
- 检查参数类型匹配:当前encode_data输出为uint256类型,但encode_tx的abi中要求data参数为bytes32类型,类型不匹配会直接导致编码失败。
- 验证上游步骤输出合法性:检查fetch、parse、multiply步骤的输出是否为合法数值,空值、非数值结果都会导致后续编码错误。
- 确认节点网络配置:Chainlink节点连接的Kovan RPC节点运行正常,节点钱包有足够的测试网ETH支付gas费用,gas配置符合Kovan网络当前要求。
二、修复方案
- 修正作业DAG执行流配置,将最后一行错误的执行流修改为:
decode_log -> decode_cbor -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx
- 调整类型编码逻辑,新增uint256转bytes32的步骤,修改作业中encode_data到encode_tx的部分为如下配置:
encode_data [type=ethabiencode abi="(uint256 value)" data="{ \"value\": $(multiply) }"] # 新增类型转换步骤,将uint256结果转换为符合要求的bytes32类型 convert_to_bytes32 [type=ethabiencode abi="(bytes32)" data="[{\"value\": $(encode_data)}]"] encode_tx [type=ethabiencode abi="fulfillOracleRequest(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes32 data)" data="{\"requestId\": $(decode_log.requestId), \"payment\": $(decode_log.payment), \"callbackAddress\": $(decode_log.callbackAddr), \"callbackFunctionId\": $(decode_log.callbackFunctionId), \"expiration\": $(decode_log.cancelExpiration), \"data\": $(convert_to_bytes32)}" ]
- 调用Oracle合约的
setFulfillmentPermission方法给节点地址授权,调用示例如下:
// 由Oracle合约的部署地址调用,_node参数为你的Chainlink节点钱包地址,_allowed设为true function setFulfillmentPermission(address _node, bool _allowed) external
- 给Chainlink节点的Kovan钱包转入至少0.1测试网ETH,确保有足够余额支付回调交易的gas费用。
- 将修改后的作业重新部署到Chainlink节点,重新发起消费请求验证即可。
内容的提问来源于stack exchange,提问作者Ebin Thomas
相关产品推荐
相关产品推荐

