智能合約不是自動執行的,這意味著它們需要外部擁有的賬戶、預言機或合約來啟動自己的功能。這給許多dApp 帶來了問題,這些dApp 需要定期執行智能合約(例如每24 小時),在滿足預定義條件時(例如,以太坊達到特定價格),或遵循計算(例如,貸款被計算為抵押不足)。
過去,開發人員會通過創建和維護自己的集中式腳本來觸發他們的智能合約,或者手動觸發它們來解決這個問題。然而,這有效地破壞了構建去中心化區塊鏈應用程序的目的,並且如果集中式腳本或手動觸發過程失敗,則可能導致停機。
在本教程中,您將學習如何使用Chainlink Keepers 以可靠和分散的方式自動執行您的智能合約。
為什麼每個智能合約開發人員都應該使用去中心化自動化
Chainlink Keepers 解鎖了一種新形式的去中心化智能合約自動化,使開發人員能夠改變他們構建和維護dApp 的方式。去中心化智能合約自動化有三個主要好處。
首先,必須消除運營中的任何集中故障點。 Chainlink Keepers 由Keeper 節點的去中心化網絡提供支持——這些節點目前通過Chainlink 數據饋送在DeFi 中保護數百億價值的超可靠節點——消除了集中的故障點。
其次,開發人員無需花費時間和資源來創建用於鏈上監控和合約執行的腳本,只需創建與Keeper 兼容的合約並進行註冊,即可插入Chainlink Keepers 優化的基礎設施。這節省了時間,減少了DevOps 的工作量,並允許開發人員專注於編寫更出色的代碼。
最後,通過使用Chainlink Keepers,開發人員可以增強其協議的安全性。開發人員在從中心化服務器發起交易時不再需要冒險暴露自己的私鑰——Chainlink Keeper Network 上的節點將簽署鏈上交易。
開始使用Chainlink Keepers
您可以分兩步使用Chainlink Keepers 自動化您的智能合約:
- 創建和部署一個 與Keeper 兼容的合約
- 將合同登記在 Chainlink Keepers 應用程序 創建維護
完成這些步驟後,Chainlink Keepers 將按照指定執行維護工作,無需任何進一步的輸入。
如果您是Solidity 新手,我們建議您在繼續之前先閱讀一些初學者教程。 本教程 特別全面和有用。 我們現在將向您展示如何使您的合約Keeper 兼容。如果您喜歡觀看有關該主題的視頻,請觀看我們的 視頻 教程。
如何編寫與Keeper 兼容的合約
與Keeper 兼容的合約具有 checkUpkeep
功能和一個 performUpkeep
與Chainlink Keepers 期望的所需輸入和輸出一起運行。為了幫助防止錯誤,我們將在指定檢查和執行功能應該做什麼之前使用與Keeper 兼容的接口。
導入Keeper 兼容接口
首先導入 KeeperCompatibleInterface
進入你的合同。
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // KeeperCompatible.sol imports the functions from both ./KeeperBase.sol and // ./interfaces/KeeperCompatibleInterface.sol import "@chainlink/contracts/src/v0.8/KeeperCompatible.sol";
這個接口有兩個功能:
這 checkUpkeep
功能
Chainlink Keepers 使用去中心化網絡來監控 checkUpkeep
在每個區塊期間安全且經濟高效地在鏈下運行,然後在滿足預定義條件時啟動鏈上交易以執行智能合約功能。
function checkUpkeep( bytes calldata checkData ) external returns ( bool upkeepNeeded, bytes memory performData );
這 checkUpkeep
函數需要一個 字節 參數命名 checkData
當你設置 註冊您的維護 在 守護者應用. 此值是可選的,可在您的邏輯中用於確定是否 checkUpkeep
返回
. true
checkUpkeep
返回一個 布爾 叫 upkeepNeeded
. 如果為真,這將調用 performUpkeep
. 它也返回 performData
在 字節 Keeper 應該調用的格式(可選的附加數據) performUpkeep
如果需要維護。有關詳細信息,請參閱 開發者文檔.
這 performUpkeep
功能
如果你的鏈下模擬 checkUpkeep
確認滿足您的預定義條件(upkeepNeeded == true
從 checkUpkeep
),Keeper 會將交易廣播到執行 performUpkeep
和 performData
作為輸入.
function performUpkeep( bytes calldata performData ) external;
輪換節點選擇過程可以防止節點之間的天然氣價格拍賣戰,並穩定自動化合同的成本。
這是來自Chainlink Keepers 用戶的示例合約片段 熵 在哪裡 checkUpkeep
檢查Entropyfi 預測遊戲是否到期。
/** * @dev chainlink keeper checkUpkeep function to constantly check whether we need function call **/ function checkUpkeep(bytes calldata checkData) external override returns (bool upkeepNeeded, bytes memory performData) { PoolStatus currState = status.currState; uint256 lastUpdateTimestamp = status.lastUpdateTimestamp; uint256 durationOfGame = status.durationOfGame; uint256 durationOfBidding = status.durationOfBidding; if (currState == PoolStatus.Accepting && block.timestamp > lastUpdateTimestamp.add(durationOfBidding)) { upkeepNeeded = true; } else if (currState == PoolStatus.Locked && block.timestamp > lastUpdateTimestamp.add(durationOfGame)) { upkeepNeeded = true; } else { upkeepNeeded = false; } performData = checkData; }
Chainlink Keepers 將不斷調用 checkUpkeep
函數,如果 upkeepNeeded
被評估為 true
,然後節點將執行 performUpkeep
功能。
/** * @dev once checkUpKeep been triggered, keeper will call performUpKeep **/ function performUpkeep(bytes calldata performData) external override { PoolStatus currState = status.currState; uint256 lastUpdateTimestamp = status.lastUpdateTimestamp; uint256 durationOfGame = status.durationOfGame; uint256 durationOfBidding = status.durationOfBidding; if (currState == PoolStatus.Accepting && block.timestamp > lastUpdateTimestamp.add(durationOfBidding)) { startGame(); } if (currState == PoolStatus.Locked && block.timestamp > lastUpdateTimestamp.add(durationOfGame)) { endGame(); } performData; }
從一些示例代碼開始
無論您是創建新合約還是已經部署了包含需要自動化功能的合約,都有指南可幫助您開始使用Chainlink Keepers 開發者文檔.
從 示例合同在這裡. 下面的例子代表一個簡單的反向合約。
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; // KeeperCompatible.sol imports the functions from both ./KeeperBase.sol and // ./interfaces/KeeperCompatibleInterface.sol import "@chainlink/contracts/src/v0.7/KeeperCompatible.sol"; contract Counter is KeeperCompatibleInterface { /** * Public counter variable */ uint public counter; /** * Use an interval in seconds and a timestamp to slow execution of Upkeep */ uint public immutable interval; uint public lastTimeStamp; constructor(uint updateInterval) { interval = updateInterval; lastTimeStamp = block.timestamp; counter = 0; } function checkUpkeep(bytes calldata /* checkData */) external override returns (bool upkeepNeeded, bytes memory /* performData */) { upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. } function performUpkeep(bytes calldata /* performData */) external override { //We highly recommend revalidating the upkeep in the performUpkeep function if ((block.timestamp - lastTimeStamp) > interval ) { lastTimeStamp = block.timestamp; counter = counter + 1; } // We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function } }
Chainlink Keepers 可以監控任何鏈上或鏈下條件的狀態,例如時間的流逝(例如,24 小時過去了嗎?)或計算(例如,貸款是否被計算為抵押不足?)。一旦滿足條件,Chainlink Keepers 就會在鏈上提交交易以觸發功能執行。
您還可以從Chainlink Keepers 實用程序合約開始,例如 EthBalanceMonitor 合同 要么 這些例子.
如何將您的合同註冊為網絡上的維護
擁有與Keeper 兼容的合約後,請前往 Chainlink Keepers 應用程序 並單擊“註冊新維護”。
有關如何註冊的詳細分步指南,請參閱 Chainlink 開發者文檔.
重要說明(對於非ETH 鏈): 您的維護必須由ERC-677 LINK 資助(不是 ERC-20,這在許多代幣橋中都很常見)。 使用PegSwap 來 使您的LINK 代幣與ERC-677 兼容.
註冊並獲得批准後,您可以添加額外資金並在Chainlink Keepers 應用程序上查看您的維護的所有詳細信息。
今天開始
現在您知道使用Chainlink Keepers 自動化您的智能合約是多麼容易,您可以開始集成Keepers 並解鎖 大量的用例,例如DEX 限價單、跨鏈NFT 鑄造、重新定基和重新平衡代幣等等。
通過以下方式了解更多信息 參觀 開發者文檔 並參加技術討論 不和諧. 如果您想安排電話以更深入地討論集成,請聯繫 這裡.