You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chainlink节点运行含ethabiencode的Job时崩溃无法提交链上交易

Chainlink节点运行ethabiencode任务崩溃排查

问题现象

每次运行包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.15 16:16:03