fpl*_*uis 1 solidity chainlink
我的 Chainlink 节点上的交易已恢复,我正在寻找一些有关如何调试它的提示。节点接收 Oracle 请求并且作业成功运行。我的履行功能很小:
function checkConditions(address _oracle, string memory _jobId) external {
setPublicChainlinkToken();
Chainlink.Request memory request = buildChainlinkRequest(
stringToBytes32(_jobId),
address(this),
this.fulfill.selector
);
request.add("ytChannelId", "UCfpnY5NnBl-8L7SvICuYkYQ");
sendChainlinkRequestTo(
_oracle,
request,
1 * LINK_DIVISIBILITY
);
}
event OnFulfill(uint256 _ytViews, uint256 _ytSubs);
function fulfill(
bytes32 _requestId,
uint256 _ytViews,
uint256 _ytSubs
) public recordChainlinkFulfillment(_requestId) {
emit OnFulfill(_ytViews, _ytSubs);
}
Run Code Online (Sandbox Code Playgroud)
我从这个github blob改编了作业规范,因为它是一个带有桥的多变量作业,这正是我的用例。我的 .toml 文件:
type = "directrequest"
schemaVersion = 1
name = "mysocialcontract-ea-job"
contractAddress = "0x2Db11F9E1d0a1cDc4e3F4C75B4c14f4a4a1a3518"
maxTaskDuration = "0s"
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)"]
decodecbor [type="cborparse" data="$(decode_log.data)"]
fetch [type="bridge" name="mysocialcontract" requestData="{\\"id\\": \\"0\\", \\"data\\": {\\"ytChannelId\\": $(decodecbor.ytChannelId)}}"]
decode_log -> decodecbor -> fetch
ytSubs [type=jsonparse path="result,ytSubs"]
ytViews [type=jsonparse path="result,ytViews"]
fetch -> ytSubs
fetch -> ytViews
ytSubs -> encode_mwr
ytViews -> encode_mwr
encode_mwr [type=ethabiencode abi="(bytes32 _requestId, uint256 _ytViews, uint256 _ytSubs)"
data="{\\"_requestId\\": $(decode_log.requestId),\\"_ytViews\\": $(ytViews),\\"_ytSubs\\": $(ytSubs)}"]
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_mwr)}"]
submit [type=ethtx to="0x2Db11F9E1d0a1cDc4e3F4C75B4c14f4a4a1a3518" data="$(encode_tx)" gasLimit="5000000"]
encode_mwr -> encode_tx -> submit
"""
Run Code Online (Sandbox Code Playgroud)
我运行的最后一次尝试之一的交易:https://kovan.etherscan.io/tx/0x2b58d0b9c6a6718817acbfb4cfb1bdcc893b28cedf111a8b5293473842a9a9c3
这是我的设置:
感谢 Chainlink Discord 上的一位用户,我成功地让多字请求正常工作。正如他所说,问题是我使用的是 Oracle.sol 合约而不是 Operator.sol 合约,然后在节点作业上调用“fulfillOracleRequest2”。问题出在合同上,而不是 .toml 工作上。事实上,我最终从节点作业中更改的唯一内容是预言机地址。
为了使合约正常工作,我刚刚改编了 chainlink 文档中的 MultiWordConsumer.sol 合约。我在 Chainlink 文档上找不到有关 Operator.sol 合约的太多信息,因此希望这能帮助那些面临与我相同问题的人:
您已经部署了自己的 Operator.sol 合约实例。您可以在 Remix 中通过创建仅导入 Operator.sol 合约的合约来实现此目的: import "@chainlink/contracts/src/v0.7/Operator.sol";
部署 Operator 合约后,您必须将节点设置为授权发送者。您可以通过使用节点地址调用“setAuthorizedSenders”来完成此操作,即[“0xb7 ...”]
归档时间: |
|
查看次数: |
364 次 |
最近记录: |