我正在尝试从 Chainlink 外部适配器获取智能合约中的数据:
取桥 “{“数据”:{“结果”:{“id”:“UCAl9Ld79qaZxp9JzEOwd3aA”,“统计”:{“subscriberCount”:“209000”}}},“jobRunId”:“0x84aae6f7b7144fbc8196230158918797”,“statusCode”:200} ”
名称:玉兔
requestData: {"id": $(jobSpec.externalJobID), "data": { "chid": $(decode_cbor.chid)},"key": $(decode_cbor.key)}
解析 jsonparse “209000”
路径:数据、结果、统计、订阅者计数
数据:$(获取)
encode_data ethabiencode “0x0000000000000000000000000000000000000000000000000000000000033068”
abi:(uint256 值)
数据:{“值”:$(解析)}
encode_tx ethabiencode “0x4ab0d1902a02a37be17119894c2d9400f9bcf563bd4be47496af9a493a96eb412676916c00000000000000000000000000000000000000000000000000de0b6 b3a76400000000000000000000000000002e495ea15b191aff2dea171abba537dc597d6f117642d3750000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000006571ad1800000000000000000000000000000000000000000000000000000 000000033068”
abi:fullOracleRequest(bytes32 requestId,uint256付款,地址callbackAddress,bytes4callbackFunctionId,uint256到期,bytes32数据)
数据:{“requestId”:$(decode_log.requestId),“付款”:$(decode_log. payment),“callbackAddress”:$(decode_log.callbackAddr),“callbackFunctionId”:$(decode_log.callbackFunctionId),“到期时间“:$(decode_log.cancelExpiration),“数据”:$(encode_data)}
submit_tx ethtx 至:0x34b33d85A6a642A6Eaa1fE554f576c6122FF64b6
数据:$(encode_tx)
我正在尝试获取以下智能合约中的订阅者数量: // SPDX 许可证标识符:MIT 杂注可靠性 ^0.8.7;
导入“@chainlink/contracts/src/v0.8/ChainlinkClient.sol”; 导入“@chainlink/contracts/src/v0.8/ConfirmedOwner.sol”;
/**
合约 ConsumerContract 是 ChainlinkClient,ConfirmedOwner { 使用 Chainlink 进行 Chainlink.Request;
uint256 private constant ORACLE_PAYMENT = 1 * LINK_DIVISIBILITY; // 1 * 10**18
uint256 public lastRetrievedSubscriberCount;
event RequestForSubscriberCountFulfilled(
bytes32 indexed requestId,
uint256 indexed subscriberCount
);
/**
* Goerli
* @dev LINK address in Sepholia network: 0x779877A7B0D9E8603169DdbD7836e478b4624789
* @dev Check https://docs.chain.link/docs/link-token-contracts/ for LINK address for the right network
*/
constructor() ConfirmedOwner(msg.sender) {
setChainlinkToken(0x779877A7B0D9E8603169DdbD7836e478b4624789);
}
function requestSubscriberCount(
address _oracle,
string memory _jobId,
string memory channelId,
string memory apiKey
) public onlyOwner {
Chainlink.Request memory req = buildOperatorRequest(
stringToBytes32(_jobId),
this.fulfillRequestInfo.selector
);
req.add("chid", channelId);
req.add("key", apiKey);
sendOperatorRequestTo(_oracle, req, ORACLE_PAYMENT);
}
function fulfillRequestInfo(bytes32 _requestId, string memory _info)
public
recordChainlinkFulfillment(_requestId)
{
// Parse the JSON data to extract the subscriberCount
(uint256 subscriberCount, ) = abi.decode(bytes(_info), (uint256, uint256));
emit RequestForSubscriberCountFulfilled(_requestId, subscriberCount);
lastRetrievedSubscriberCount = subscriberCount;
}
function getSubscriberCount() public view returns (uint256) {
return lastRetrievedSubscriberCount;
}
/*
========= UTILITY FUNCTIONS ==========
*/
function contractBalances()
public
view
returns (uint256 eth, uint256 link)
{
eth = address(this).balance;
LinkTokenInterface linkContract = LinkTokenInterface(
chainlinkTokenAddress()
);
link = linkContract.balanceOf(address(this));
}
function getChainlinkToken() public view returns (address) {
return chainlinkTokenAddress();
}
function withdrawLink() public onlyOwner {
LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());
require(
link.transfer(msg.sender, link.balanceOf(address(this))),
"Unable to transfer Link"
);
}
function withdrawBalance() public onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
function cancelRequest(
bytes32 _requestId,
uint256 _payment,
bytes4 _callbackFunctionId,
uint256 _expiration
) public onlyOwner {
cancelChainlinkRequest(
_requestId,
_payment,
_callbackFunctionId,
_expiration
);
}
function stringToBytes32(string memory source)
private
pure
returns (bytes32 result)
{
bytes memory tempEmptyStringTest = bytes(source);
if (tempEmptyStringTest.length == 0) {
return 0x0;
}
assembly {
// solhint-disable-line no-inline-assembly
result := mload(add(source, 32))
}
}
}
您能否向我们指出您的请求交易以及您要发送到的预言机地址?
根据上下文,我假设您正在向 Chainlink 的 ETH Sepolia 测试网预言机 0x34b33d85a6a642a6eaa1fe554f576c6122ff64b6 发出请求。
根据您提出问题的时间,我假设这些失败的 Oracle 履行交易之一是您的:
如果您查看上述任何履行交易,您将看到合约执行错误
Data versions must match
。
查看 Operator.sol(oracle)合约,这是失败的情况: https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.7/Operator.sol#L480
您要导入哪个版本的
ChainlinkClient.sol
到您的智能合约中?我建议您使用最新版本,看看这是否会有所不同。