Chainlink节点运行含ethabiencode的Job时崩溃无法提交链上交易
问题现象
每次运行包含ethabiencode的函数时,Chainlink节点都会发生崩溃。
当前节点Job部署在Polygon Mumbai测试网,direct requests、bridges等其他类型请求均可正常运行,异常Job配置如下:
type = "directrequest" schemaVersion = 1 name = "Veri-Test-2" contractAddress = "ORACLE_ADDRESS" maxTaskDuration = "0s" observationSource = """ decode_log [type="ethabidecodelog" abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" data="$(jobRun.logData)" topics="$(jobRun.logTopics)"] decode_cbor [type="cborparse" data="$(decode_log.data)"] encode_tx [type="ethabiencode" abi="fulfillTestingFunction(bytes32 requestID, bytes32 resulttt)" data="{ \"requestID\": $(jobSpec.externalJobID),\"resulttt\": 48692043686164000000000000000000000000000000000000000000000000}"] submit_tx [type="ethtx" to="ORACLE_ADDRESS" data="$(encode_tx)"] decode_log -> decode_cbor -> encode_tx -> submit_tx """
对应链上回调函数定义如下:
function fulfillTestingFunction(bytes32 requestID, bytes32 resulttt) public recordChainlinkFulfillment(requestID) { _result = bytes32ToString(resulttt); }
触发该Job后节点输出报错日志,随后节点崩溃需要手动重启,报错日志如下:
已完成的前置检查与配置:
- 已部署Oracle合约,并在合约上完成对应节点的激活操作
- 已向Oracle合约转入Polygon测试网代币用于支付Gas费
- 已向业务请求合约转入LINK代币用于支付预言机请求费用
- 其他类型请求均可正常运行,仅涉及向链上回传交易的步骤无法执行
根因与解决方案
1. 核心问题:ethabiencode参数格式非法,触发节点panic
当前配置中encode_tx任务的data字段存在两个格式错误,会直接导致ethabiencode解析参数时抛出空指针异常,打崩节点进程:
- 字符串类型的参数值未加双引号包裹,
$(jobSpec.externalJobID)插值后是字符串,直接放在JSON结构中会导致JSON解析失败 - bytes32类型的
resulttt参数传入了无引号、无0x前缀的裸大整数,既不符合JSON语法,也不符合ABI编码的参数类型要求
修正后的encode_tx配置如下:
encode_tx [type="ethabiencode" abi="fulfillTestingFunction(bytes32 requestID, bytes32 resulttt)" data="{ \"requestID\": \"$(jobSpec.externalJobID)\",\"resulttt\": \"0x48692043686164000000000000000000000000000000000000000000000000\"}"]
修改要点:
- 所有字符串类型参数、变量插值结果均用双引号包裹,保证传入的data是合法JSON结构
- bytes32类型的十六进制值补全
0x前缀,符合EVM参数传值规范
2. 配置错误:ethtx目标地址填写错误
当前submit_tx任务的to字段硬编码为ORACLE_ADDRESS,但fulfillTestingFunction是业务合约的回调方法,不属于Oracle合约,交易发送到Oracle地址会因为方法不存在执行失败。
正确配置需要使用decode_log步骤解析出来的callbackAddr作为交易目标地址,同时匹配对应的callbackFunctionId,如果是本地测试直接调用回调,也需要填写业务合约的部署地址,不能填Oracle合约地址。
3. 版本问题:旧版本节点存在已知崩溃bug
如果修正参数格式后仍然出现崩溃问题,检查Chainlink节点版本:v1.1.0及更早版本存在已知缺陷,ethabiencode接收到非法格式参数时会直接触发panic导致进程退出,该问题在v1.2.0及之后版本已修复,升级节点版本即可避免非法输入直接打崩节点的问题。
验证建议
修改配置后可以先在本地用ABI编码工具单独校验参数编码结果,确认calldata的函数选择器、参数值和预期一致后,再部署到节点运行,减少反复触发崩溃的调试成本。
内容的提问来源于stack exchange,提问作者Chad Blanchard

