Arbitrum上Chainlink节点无法捕获OracleRequest事件,请求未执行排查
Chainlink AnyAPI栈在Arbitrum节点上的OracleRequest事件捕获问题
我们正尝试让Chainlink AnyAPI栈在Arbitrum Chainlink节点上运行,该栈在以太坊、Polygon和Avalanche网络均能正常工作。Chainlink AnyAPI为DSLA Protocol的部分用例提供支持,DSLA是一种中间件,可通过点对点服务水平协议(SLA)为可监控市场(如OpenSea)添加消费者保护功能。
请求生命周期
以下是使用Chainlink验证SLA合约是否被遵守的步骤:
- 用户调用实现Chainlink的
Messenger智能合约中的验证函数。 Messenger智能合约将请求发送至PreCoordinator智能合约。PreCoordinator将请求转发至服务协议中定义的Oracles(Oracle代理)。- 收到LINK后,每个Oracle通过触发带有待执行任务ID的
OracleRequest事件,将请求发送至Chainlink节点。 - Chainlink节点捕获该事件并执行对应的任务。
- 任务执行完成后,Chainlink节点调用
fulfillOracleRequest2函数,将外部适配器的结果返回给PreCoordinator。 - PreCoordinator计算所有Oracle结果的平均值,并最终在Messenger中注册SLI。
- 通过比较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
相关产品推荐
相关产品推荐

