Wie übergebe ich ein Argument an den Chainlink-Selektor?

Nov 30 2020

Ich habe eine Zuordnung mit Ganzzahlschlüsseln und Strukturwerten.

mapping (int => Client) public customers;

Jeder Kunde hat sein eigenes Beweisargument, das ich mit einem Chainlink-API-Aufruf aktualisieren möchte. Hier ist meine Struktur.

struct Client {
    int id,
    bool proof;
}

Hier ist, wie ich API Get Call anfordere

   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);
}

Und diese Funktion löst die folgende Funktion aus

     function fulfill(bytes32 _requestId, bool _isProofCorrect, unit val) public recordChainlinkFulfillment(_requestId){
            customers[1].proof = _isProofCorrect;  
}

Wie kann ich das Proof-Argument meines Konstrukts mithilfe der Kunden-ID aktualisieren? Zum Beispiel:

customers[<customer_id>].proof = _isProofCorrect;

Antworten

1 PatrickCollins Nov 30 2020 at 22:17

Für alle Chainlink-API-Aufrufe akzeptiert die fulfilMethode nur zwei Argumente.

  • bytes32 _requestIdDer requestIddes Chainlink API-Aufrufs.
  • <type> _dataDas _data, was vom Chainlink-API-Aufruf zurückgegeben wird.

Dies bedeutet, dass Sie 3 Parameter nicht übergeben können.

Was dies bedeutet ist, dass Sie Ihre Karte requestIdauf Ihren Wert , und es wird in etwa so aussehen.

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;  
}