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

Chainlink TOML作业规范字符串插值问题求助

现象

向GraphQL External Adapter发送字面量JSON时可正常运行:

{\"jobRunId\":1,\"data\":{\"query\":\"query rightToLeft ($code: ID!) {language(code: $code) { rtl }}\",\"variables\":{\"code\":\"ar\"},\"graphqlEndpoint\":\"https://countries.trevorblades.com/\"}}

但将变量值替换为$(decode_cbor.languageCode)后,执行HTTP POST任务报错:

requestData: while unmarshalling JSON: invalid character '_' after object key:value pair; js: {"jobRunId":1,"data":{"query":"query rightToLeft ($code: ID!) {language(code: $code) { rtl }}","variables":{"code":"{ "chainlink_key_path": "decode_cbor.languageCode" }"},"graphqlEndpoint":"https://countries.trevorblades.com/"}}: bad input for task

完整作业规范的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)"]
post         [type="http" method=POST url="https://ea-graphql-k3zq5wb52q-uc.a.run.app/" requestData="{\"jobRunId\":1,\"data\":{\"query\":\"query rightToLeft ($code: ID!) {language(code: $code) { rtl }}\",\"variables\":{\"code\":\"$(decode_cbor.languageCode)\"},\"graphqlEndpoint\":\"https://countries.trevorblades.com/\"}}"]

parse        [type="jsonparse" path="result,data,language,rtl" data="$(post)"]
encode_data  [type="ethabiencode" abi="(bool value)" data="{ \"value\": $(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_data)}"
              ]
submit_tx    [type="ethtx" to="0x188b71C9d27cDeE01B9b0dfF5C1aff62E8D6F434" data="$(encode_tx)"]

decode_log -> decode_cbor -> post -> parse -> encode_data -> encode_tx -> submit_tx

问题原因与解决方案

问题出在requestData中的变量引用被错误包裹在字符串引号内,Chainlink的模板语法$(...)在JSON字符串内部使用时,会被替换为带有__chainlink_key_path__的内部标记对象,而这个对象被双引号包裹后,直接破坏了JSON的语法结构,导致解析失败。

修正方法

去掉$(decode_cbor.languageCode)外层的双引号,让它直接作为JSON值存在:

post         [type="http" method=POST url="https://ea-graphql-k3zq5wb52q-uc.a.run.app/" requestData="{\"jobRunId\":1,\"data\":{\"query\":\"query rightToLeft ($code: ID!) {language(code: $code) { rtl }}\",\"variables\":{\"code\":$(decode_cbor.languageCode)},\"graphqlEndpoint\":\"https://countries.trevorblades.com/\"}}"]

修正后,Chainlink会正确将$(decode_cbor.languageCode)替换为实际的语言代码值,生成合法的JSON结构。

补充说明

  • Chainlink模板变量在JSON上下文中使用时,若目标是JSON值而非字符串,无需添加引号;如果变量本身是字符串类型,Chainlink会自动处理引号包裹逻辑。
  • 错误日志中的{ "__chainlink_key_path__": "decode_cbor.languageCode" }是Chainlink内部的路径引用标记,只有当它作为原生JSON值存在时才会被正确解析,被包裹在字符串中则会成为无效的JSON内容。

内容的提问来源于stack exchange,提问作者Ijonas Kisselbach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:48:21