Solidity

如何保護我的 Chainlink oracle 實現方法?

  • April 11, 2021

背景:

我正在編寫一個繼承的契約,ChainlinkClient以便通過 oracle 作業發出 API 請求:

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
}

假設:

  • 發出 oracle 請求時,fulfill方法必須是public.
  • public任何其他合約都可以訪問方法。

問題:

是什麼阻止了某人手動呼叫該fulfill方法?這是相關的,因為合約依賴於注入的數據fulfill

如何保護合約免受無效數據的注入?我希望這個問題是我自己對預言機互動如何工作的誤解的結果!

您的假設是正確的,它需要公開,但在這種情況下修飾符可以提供幫助。ChainlinkClient 具有recordchainlinkfulfillment用於實現回調的修飾符。

此修飾符指定只有被呼叫的原始 oracle 可以呼叫此函式,即您發送請求時定義的 oracle。

參考:chainlink 文件

引用自:https://ethereum.stackexchange.com/questions/97051