Chainlink

確保只有 Keepers 可以呼叫我的合約的“performUpkeep”函式

  • December 6, 2021

我有一個 keeper performUpKeep 功能,它對任務至關重要,只有 keeper 可以呼叫,而不是一些隨機的第三方來更快地啟動契約。似乎 Chainlink 管理員在不斷變化,那麼我如何確保只有管理員呼叫合約?

理想情況下,您只需要驗證checkUpKeep是否返回 true,然後對輸入進行一些數據驗證,以確保它只能執行您想要的操作。根據chainlink github

  • @dev 這個方法的輸入不應該被信任, * 方法的呼叫者甚至不應該被限制在任何單一的系統資料庫中。* 任何人都應該能夠呼叫它,並且應該驗證輸入,不能保證 * 傳入的數據是從 checkUpkeep 返回的 performData。這 * 可能是由於惡意守門員、競速守門員或只是在 performUpkeep 交易等待確認時狀態更改而發生的。* 始終驗證傳入的數據。

不建議使用以下程式碼

如果你想忽略這個……(你不應該這樣做)但你可以onlyKeepers在你的函式中添加一個修飾符,performUpkeep這樣只有 Keepers 系統資料庫才能呼叫你的合約。

   address public keepersRegistry = xxxxxx;
   modifier onlyKeepers() {
       require(msg.sender == keepersRegistry, "Ownable: caller is not keepers registry");
       _;
   }

然後將您的功能包裝在其中。

function functionName() onlyKeepers {
....
}

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