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

Arbitrum上Chainlink节点无法捕获OracleRequest事件,请求未执行排查

我们正尝试让Chainlink AnyAPI栈在Arbitrum Chainlink节点上运行,该栈在以太坊、Polygon和Avalanche网络均能正常工作。Chainlink AnyAPI为DSLA Protocol的部分用例提供支持,DSLA是一种中间件,可通过点对点服务水平协议(SLA)为可监控市场(如OpenSea)添加消费者保护功能。

请求生命周期

以下是使用Chainlink验证SLA合约是否被遵守的步骤:

  1. 用户调用实现Chainlink的Messenger智能合约中的验证函数。
  2. Messenger智能合约将请求发送至PreCoordinator智能合约。
  3. PreCoordinator将请求转发至服务协议中定义的Oracles(Oracle代理)。
  4. 收到LINK后,每个Oracle通过触发带有待执行任务ID的OracleRequest事件,将请求发送至Chainlink节点。
  5. Chainlink节点捕获该事件并执行对应的任务。
  6. 任务执行完成后,Chainlink节点调用fulfillOracleRequest2函数,将外部适配器的结果返回给PreCoordinator。
  7. PreCoordinator计算所有Oracle结果的平均值,并最终在Messenger中注册SLI。
  8. 通过比较SLI(实际值)和SLO(目标值),验证SLA是否符合要求。

执行问题

我们的节点无法捕获PreCoordinator v0.6/Operator v0.7架构下的OracleRequest事件,请求从未被执行。我们怀疑PreCoordinator服务协议中的job id语法是否正确,以及节点/v2任务规格是否需要特殊配置。

AnyAPI栈详情

  • PreCoordinator.sol:通过服务协议使用多个Chainlink oracle的代理合约
  • v0.6 Chainlink合约依赖:
import '@chainlink/contracts/src/v0.6/ChainlinkClient.sol';
import '@chainlink/contracts/src/v0.6/LinkTokenReceiver.sol';
import '@chainlink/contracts/src/v0.6/Median.sol';
import '@chainlink/contracts/src/v0.6/vendor/Ownable.sol';
import '@chainlink/contracts/src/v0.6/vendor/SafeMathChainlink.sol';
  • v0.7 Operator.sol合约:为解决此问题,从v0.6 Oracle.sol智能合约迁移而来
  • v1.9.0版本Arbitrum Chainlink节点的v2任务规格:
type = "directrequest"
schemaVersion = 1
name = "StakingParametricRequest"
forwardingAllowed = false
maxTaskDuration = "0s"
contractAddress = "0x6Dc1147ca16C020579642D90042CeA252474fD67"
minContractPaymentLinkJuels = "0"
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)"]
    fetch        [type=bridge name="staking-parametric" requestData="{\\"id\\": $(jobSpec.externalJobID), \\"data\\": { \\"sla_monitoring_start\\": $(decode_cbor.sla_monitoring_start), \\"sla_monitoring_end\\": $(decode_cbor.sla_monitoring_end), \\"sla_address\\": $(decode_cbor.sla_address), \\"network_name\\": $(decode_cbor.network_name)}}"]
    parse        [type=jsonparse path="data,result" data="$(fetch)"]
    encode_large [type="ethabiencode"
                abi="(bytes32 requestId, bytes _data)"
                data="{\\"requestId\\": $(decode_log.requestId), \\"_data\\": $(parse)}"
                ]
    encode_tx    [type=ethabiencode
                  abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)"
                  data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_large)}"
                 ]
    submit_tx    [type=ethtx to="0x6Dc1147ca16C020579642D90042CeA252474fD67" data="$(encode_tx)"]

    decode_log -> decode_cbor -> fetch -> parse -> encode_large -> encode_tx -> submit_tx
"""
  • 环境变量配置:
ETH_CHAIN_ID: "42161"
LINK_CONTRACT_ADDRESS: "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4"
ETH_URL: "wss://arbitrum-mainnet.s.chainbase.online/v1/[redacted]"
ETH_SECONDARY_URLS: "https://morning-dimensional-morning.arbitrum-mainnet.quiknode.pro/[redacted]/"

请问是否有人遇到过类似问题?感谢您的帮助!


内容的提问来源于stack exchange,提问作者Wilhem Pujar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:50:25