Wie kann ich meine Chainlink-Oracle-Fulfill-Methode schützen?

Hintergrund:

Ich schreibe einen Vertrag, der erbt ChainlinkClient, um eine API-Anfrage über einen Oracle-Job zu stellen:

function fetch() private returns (bytes32 requestId) {
    Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
    request.add("get", ...);
    return sendChainlinkRequestTo(oracle, request, fee);
}

function fulfill(bytes32 _requestId, uint256 _result) public recordChainlinkFulfillment(_requestId) {
    // Rely on returned data
}

Annahmen:

  • Bei einer Oracle-Anfrage fulfillmuss die Methode public.
  • publicAuf Methoden kann von jedem anderen Vertrag zugegriffen werden.

Frage:

Was hindert jemanden daran, die Methode manuell aufzurufen fulfill? Dies ist relevant, da der Vertrag auf den injizierten Daten beruht fulfill.

Wie werden Verträge vor dem Einschleusen ungültiger Daten geschützt? Ich gehe davon aus, dass diese Frage das Ergebnis meines eigenen Missverständnisses darüber ist, wie Orakelinteraktionen funktionieren!

Antworten (1)

Ihre Annahmen sind richtig, es muss öffentlich sein, aber Modifikatoren können in diesem Fall helfen. ChainlinkClient hat recordchainlinkfulfillmenteinen Modifikator für Fulfillment-Callbacks.

Dieser Modifikator gibt an, dass nur das ursprünglich aufgerufene Orakel diese Funktion aufrufen darf, das Orakel, das beim Senden der Anforderung definiert wurde.

Referenz: Chainlink-Dokumente