Как передать аргумент селектору Chainlink?
Nov 30 2020
У меня есть сопоставление с целочисленными ключами и значениями структуры.
mapping (int => Client) public customers;
У каждого клиента есть собственный аргумент доказательства, который я пытаюсь обновить с помощью вызова API Chainlink. Вот моя структура.
struct Client {
int id,
bool proof;
}
Вот как я запрашиваю вызов API
function checkProof(string memory JobLocation, bytes32 JOBID) public {
Chainlink.Request memory req = buildChainlinkRequest(JOBID, address(this), this.fulfill.selector);
req.add("get",JobLocation);
req.add("path", "proof");
sendChainlinkRequestTo(ORACLE_ADDRESS, req, ORACLE_PAYMENT);
}
И эта функция запускает следующую функцию
function fulfill(bytes32 _requestId, bool _isProofCorrect, unit val) public recordChainlinkFulfillment(_requestId){
customers[1].proof = _isProofCorrect;
}
Как я могу обновить аргумент доказательства моей конструкции, используя идентификатор клиента. Например:
customers[<customer_id>].proof = _isProofCorrect;
Ответы
1 PatrickCollins Nov 30 2020 at 22:17
Для всех API вызовов ограды , то fulfilметод принимает только 2 аргумента.
bytes32 _requestIdrequestIdПо API вызова ограды.<type> _dataТо_data, что возвращается вызовом API Chainlink.
Это означает, что вы не можете передать 3 параметра.
Это означает, что вы можете сопоставить requestIdсвое значение со своим значением , и это будет выглядеть примерно так.
mapping (bytes32 => uint) public requestMapping;
function checkProof(string memory JobLocation, bytes32 JOBID) public {
Chainlink.Request memory req = buildChainlinkRequest(JOBID, address(this), this.fulfill.selector);
req.add("get", JobLocation);
req.add("path", "proof");
bytes32 requestId = sendChainlinkRequestTo(ORACLE_ADDRESS, req, ORACLE_PAYMENT);
requestMapping[requestId] = customerId;
}
function fulfill(bytes32 _requestId, bool _isProofCorrect, unit val) public recordChainlinkFulfillment(_requestId){
uint256 value = requestMapping[_requestId]
customers[value].proof = _isProofCorrect;
}