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

