Chainlink作业未执行,但节点收到链接费



我有一个运行在evm测试网中的链接节点。我已经部署了链接令牌和oracle合约,用以太币资助了我的节点帐户,创建了一个作业和一个智能合约,向该作业发送请求。我在Chainlink.Request中使用了来自作业定义的externalJobID。我的oracle帐户正在收到合同执行和请求的链接费,但我的作业没有执行。我在链接节点日志中没有看到任何内容。

这是我的合同代码

contract Metadata is ChainlinkClient{
address private oracle;
bytes32 private jobId;
uint256 private fee;
//event variables
struct EMetaData{
address dataToken;
bytes   flags;
bytes   data;
address sender;
}
mapping(bytes32 => EMetaData) public metadatas;
constructor() public {
setChainlinkOracle(0x6a61789194260F0BE95a18d0116d883A4b5284ed);
setChainlinkToken(0xa38F087411e0908ad87b40Ab4D7Ca9247DE0052e);
jobId  = "3a3e489f1fd145b385a18728c6947508";
fee    = 0.1 * 10 ** 18; // (0.1 LINK)
}

event MetadataCreated(
address indexed dataToken,
address indexed createdBy,
bytes flags,
bytes data
);
function testCreate(
address _dataToken,
bytes memory _flags,
bytes memory _data
) public returns (bytes32 requestId){
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
metadatas[request.id].dataToken = _dataToken;
metadatas[request.id].flags = _flags;
metadatas[request.id].data = _data;
metadatas[request.id].sender = msg.sender;
return sendChainlinkRequest(request, fee);
}
function fulfill(bytes32 _requestId, bool result) public{
require(result == true, "Validation Failed");
emit MetadataCreated(
metadatas[_requestId].dataToken,
metadatas[_requestId].sender,
metadatas[_requestId].flags,
metadatas[_requestId].data
);
}
}
}

这是我的工作规范

type = "directrequest"
schemaVersion = 1
name = "Shacl validation"
contractAddress = "0x95D57363B491CF743970c640fe419541386ac8BF"
maxTaskDuration = "20s"
observationSource = """
decode_log  [type="ethabidecodelog"
data="$(jobRun.logData)"
topics="$(jobRun.logTopics)"
abi="SomeContractEvent(bytes32 requestID, bytes cborPayload)"]
decode_cbor [type="cborparse"
data="$(decode_log.cborPayload)"]
ds          [type="http" method=POST url="http://localhost:3000/api/v1/aquarius/assets/ddo/validate"]
ds_parse    [type="jsonparse" path=""]
encode_response [type="ethabiencode"
abi="(bool data)"
data="{\"data\": $(ds_parse) }"]
encode_tx [type="ethabiencode"
abi="fulfillOracleRequest(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes32 data)"
data="{\"requestId\": $(decode_log.requestId), \"payment\": $(decode_log.payment), \"callbackAddress\": $(decode_log.callbackAddr), \"callbackFunctionId\": $(decode_log.callbackFunctionId), \"expiration\": $(decode_log.cancelExpiration), \"data\": $(encode_response)}"
]
submit_tx [type="ethtx" to="0x95D57363B491CF743970c640fe419541386ac8BF" data="$(encode_tx)"]
decode_log -> decode_cbor -> ds -> ds_parse -> encode_response -> encode_tx -> submit_tx
"""
externalJobID = "3a3e489f-1fd1-45b3-85a1-8728c6947508"

-----------编辑0x6a61789194260F0BE95a18d0116d883A4b5284 ed是链接节点帐户

0x95D57363B491CF743970c640fe419541386ac8BF是oracle合同地址

只是从Discord中提取答案,这样其他人就可以更容易地找到它(因为节点地址和oracle地址经常混淆(:

0x6a61789194260F0BE95a18d0116d883A4b5284ed是您的Chainlink节点的地址(您可以在GUI的键选项卡中看到(,该节点需要使用ETH进行资助才能在链上发送交易。Chainlink节点侦听作业规范中使用的oracle智能合约发出的事件日志,oracle地址不是您用来部署它的帐户,而是新部署的oracle智能合同的地址,请确保遵循以下步骤:https://docs.chain.link/docs/fulfilling-requests/#deploy-你自己的甲骨文合同

您可以在Remix和底层网络的区块浏览器中找到oracle合同地址,这是您在消费者合同中需要使用的地址,以便成功请求,然后可以从oracle合同中提取LINK奖励。

在讨论了Chainlink的不和之后,我得到了的一些帮助

问题是,我正在将我的chainlink节点帐户传递给chainlink.Request对象,正确的做法是传递oracle合同地址。

最新更新