{"content":{"title":"使用Automation、Gelato和Defender 进行合约自动化执行","body":"> * 原文链接： https://blog.logrocket.com/tools-smart-contract-automation-guide/\r\n> * 译文出自：[登链翻译计划](https://github.com/lbc-team/Pioneer)\r\n> * 译者：[翻译小组](https://learnblockchain.cn/people/412)  校对：[Tiny 熊](https://learnblockchain.cn/people/15)\r\n> * 本文永久链接：[learnblockchain.cn/article…](https://learnblockchain.cn/article/5618)\r\n\r\n\r\n\r\n智能合约无法自动执行，其执行需要通过区块链网络上进行的链上交易触发。然而，手动执行智能合约有缺点，如潜在的安全风险，不必要的延迟，以及人为错误的可能性。\r\n\r\n本文探讨了智能合约自动化的核心概念，并回顾了各种智能合约自动化工具的优点和缺点。此外，本指南还展示了流行的智能合约自动化工具所使用的流程：[Chainlink Automation](https://chain.link/automation)，[Gelato Network](https://www.gelato.network/)，以及[OpenZeppelin Defender](https://www.openzeppelin.com/defender)。\r\n\r\n\r\n\r\n本文主要内容:\r\n\r\n- 前置知识\r\n- 了解智能合约自动化\r\n- Chainlink Automation\r\n- 演示：用Chainlink Automation实现智能合约的自动化 \r\n- Gelato Network\r\n- 演示：用Gelato实现智能合约的自动化\r\n- OpenZeppelin Defender\r\n- 演示：用OpenZeppelin Defender实现智能合约的自动化\r\n- 使用Chainlink Automation、Gelato和OpenZeppelin Defender的优点和缺点\r\n\r\n## 前置知识\r\n\r\n要跟上这篇文章，请确保你有以下准备：\r\n\r\n- 安装了[MetaMask](https://metamask.io/)。\r\n- 注册了[OpenZeppelin Defender](https://defender.openzeppelin.com/)账户\r\n- [Remix online IDE](https://remix.ethereum.org/)\r\n- [Goerli](https://goerlifaucet.com/) 测试网络\r\n- [Solidity](https://blog.logrocket.com/writing-smart-contracts-solidity/)和JavaScript编程语言的基本知识\r\n\r\n## 了解智能合约自动化\r\n\r\n在智能合约自动化出现之前，开发者使用中心化服务器来实现各种手动流程，如基于时间的执行、DevOps任务、链外计算和清算。\r\n\r\n手动流程增加了智能合约的安全风险，因为它们给去中心化的应用程序引入了一个中心故障点。此外，手动流程经常导致的网络拥堵会延迟交易的执行，使用户资金面临风险。\r\n\r\n智能合约自动化使我们能够自动化若干Web3功能，如挖矿复投、跨链NFT铸币、清算抵押不足的贷款、博彩等等。\r\n\r\n现在我们对智能合约自动化有了一个概述，让我们回顾一下一些流行的智能合约自动化工具，了解它们是如何工作的。\r\n\r\n## Chainlink Automation\r\n\r\nChainlink Automation是一个智能合约自动化工具，在多个区块链上运行，如[以太坊](https://ethereum.org/en/)、[BNB链](https://www.bnbchain.org/en)和[Polygon](https://polygon.technology/) 等。这个工具使外部拥有的账户能够对智能合约中的预定条件进行检查，然后根据时间间隔来触发和执行交易。\r\n\r\n例如，开发者可以通过监测Automation网络上的条件来注册智能合约进行自动维护。随后，由节点在Automation网络上进行链外计算，直到智能合约中定义的条件得到满足。\r\n\r\n如果智能合约的条件没有得到满足，计算会返回一个 \"false \"的值，而节点会继续他们的工作。如果智能合约的条件得到满足，计算结果返回 \"true\"，Automation网络就会触发合约的执行。\r\n\r\nChainlink Automation提供了许多好处：\r\n\r\n- **容易集成**：Chainlink Automation的用户文档友好，有操作指南，可以帮助开发者快速完成集成工作\r\n- **安全性和可靠性**：Chainlink Automation的去中心化特性通过减少与中心化服务器相关的安全风险为应用程序提供了一个安全框架。Chainlink Automation利用透明池进行操作，有助于在开发者和DAO之间建立信任。\r\n- **成本效率**：Chainlink Automation的基础设施提供了优化成本的功能，并提高了与执行智能合约相关的Gas费用的稳定性。\r\n\r\n\r\n- **增加的生产力**：Chainlink Automation处理在智能合约上运行检查的链外计算，让开发者有更多时间专注于构建DApps\r\n\r\n### 演示：使用Chainlink Automation自动化智能合约\r\n\r\n让我们研究一下如何用Chainlink Automation来自动执行智能合约。\r\n\r\n我们将使用一个建立在Remix IDE上的Solidity合约，并部署到测试网络。该智能合约将实现Chainlink Automation [GitHub仓库](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol)中定义的接口。\r\n\r\n为了与Chainlink Automation兼容，我们的智能合约必须包括以下两个方法：\r\n\r\n- `checkUpKeep()`：在链下间隔执行调用该函数， 该方法返回一个布尔值，告诉网络是否需要自动化执行。\r\n- `performUpKeep()`：这个方法接受从`checkUpKeep()`方法返回的信息作为参数。Chainlink Automation 会触发对它的调用。函数应该先进行一些检查，再执行链上其他计算。\r\n\r\n要想开始，请添加以下代码，在Remix IDE中创建一个简单的反欺诈合约：\r\n\r\n```solidity\r\n// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.7;\r\n\r\ncontract Counter {\r\n\r\n   uint public counter;\r\n\r\n   uint public immutable interval;\r\n   uint public lastTimeStamp;\r\n\r\n   constructor(uint updateInterval) {\r\n     interval = updateInterval;\r\n     lastTimeStamp = block.timestamp;\r\n\r\n     counter = 0;\r\n   }\r\n\r\n   function checkUpkeep(bytes calldata /* checkData */) external view returns (bool upkeepNeeded /* bytes memory  performData */) {\r\n       upkeepNeeded = (block.timestamp - lastTimeStamp) > interval;\r\n\r\n       // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered\r\n   }\r\n\r\n   function performUpkeep(bytes calldata /* performData */) external {\r\n       //We highly recommend revalidating the upkeep in the performUpkeep function\r\n       if ((block.timestamp - lastTimeStamp) > interval ) {\r\n           lastTimeStamp = block.timestamp;\r\n           counter = counter + 1;\r\n       }\r\n\r\n       // We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function\r\n   }\r\n}\r\n```\r\n\r\n该合约有一个公有变量`counter`，当新区块和上一个区块之间的差值大于一个区间时，该变量会递增1。然后，它实现了两个Automation 要求实现的方法。\r\n\r\n现在，导航到**Remix菜单**按钮（从顶部开始的第三个按钮），点击**Compile**按钮（用绿色验证标记表示）来编译合约：\r\n\r\n![编译合约](https://img.learnblockchain.cn/2023/04/03/10663.png)\r\n\r\n为了继续进行，你需要用一些[ERC-677 LINK代币](https://docs.chain.link/docs/link-token-contracts/)来作为手续费。使用Faucets连接你的测试网络，并[在Chainlink上获得一些testnet LINK代币](https://faucets.chain.link/)：\r\n\r\n![申请测试网链接](https://img.learnblockchain.cn/2023/04/03/8651.png)\r\n\r\n选择**Injected Web3**作为环境，并选择**Goerli 测试网络**。然后，点击**发送请求**，获得20个测试LINK和0.1个测试ETH发送到你的钱包。\r\n\r\n接下来，通过传递30秒作为间隔来部署合约。一旦你点击**部署**，MetaMask应该打开，要求你确认交易。\r\n\r\n\r\n\r\n在你的MetaMask钱包中点击**确认**：\r\n\r\n![确认按钮MetaMask](https://img.learnblockchain.cn/2023/04/03/52351.png)\r\n\r\n现在你可以查看你部署的合约地址：\r\n\r\n![部署的合约地址](https://img.learnblockchain.cn/2023/04/03/66625.png)\r\n\r\n接下来，导航到Chainlink Automation，通过选择**基于时间的**触发器选项，并输入你部署的智能合约的地址来注册你的部署的智能合约：\r\n\r\n![注册新Upkeep](https://img.learnblockchain.cn/2023/04/03/27813.png)\r\n\r\n从你的Remix IDE中复制你的合约的ABI，并将其粘贴到**ABI**字段中：\r\n\r\n![ABI字段](https://img.learnblockchain.cn/2023/04/03/23635.png)\r\n\r\n现在，在**函数输入**字段中输入你的合约地址：\r\n\r\n![功能输入](https://img.learnblockchain.cn/2023/04/03/65463.png)\r\n\r\n指定Chainlink Automation对你的智能合约进行维护的时间安排。在**Cron表达式**字段中，指出每15分钟应进行一次维护。\r\n\r\n![Cron Expression](https://img.learnblockchain.cn/2023/04/03/41353.png)\r\n\r\n接下来，通过在以下字段中输入适当的信息，为你的Upkeep提供细节：**Upkeep**名称，**Gas Limit**，**LINK代币的起始余额**，以及**你的电子邮件地址**。然后，点击**注册Upkeep**：\r\n\r\n![维护详情](https://img.learnblockchain.cn/2023/04/03/32420.png)\r\n\r\n这样就可以了 !\r\n\r\nChainlink Automation 已经成功注册了你的智能合约，就会进行自动检查你的条件（`checkUpkeep`），满足条件时调用 `performUpkeep` 。\r\n\r\n\r\n\r\n## Gelato Network\r\n\r\nGelato Network是一个去中心化的机器人网络，可以自动执行所有EVM区块链上的智能合约。Gelato易于使用的架构为DeFi应用提供了一个可靠的接口。\r\n\r\n### 演示：用Gelato自动执行一个智能合约\r\n\r\n要用Gelato网络自动执行一个智能合约，请遵循以下步骤：\r\n\r\n1. 在Remix IDE上创建一个新的智能合约，实现一个计数器。\r\n2. 编译并部署该智能合约到Rinkeby测试网络上\r\n3. 将你的MetaMask钱包连接到Gelato网络并进行存款\r\n4. 在Gelato上创建一个带有已部署合约地址和一些配置的任务\r\n\r\n让我们开始吧!\r\n\r\n\r\n\r\n在你的Remix IDE上，创建一个`gelato`文件夹，其中有一个`GelatoContract.sol`文件，该文件定义了一个函数，根据以下条件增加一个计数器变量：\r\n\r\n```\r\n// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.7;\r\n\r\ncontract Counter {\r\n   uint public counter;\r\n\r\n    uint public immutable interval;\r\n   uint public lastTimeStamp;\r\n\r\n   constructor(uint updateInterval) {\r\n     interval = updateInterval;\r\n     lastTimeStamp = block.timestamp;\r\n\r\n     counter = 0;\r\n   }\r\n\r\n   function incrementCounter() external {\r\n        if ((block.timestamp - lastTimeStamp) > interval ) {\r\n           lastTimeStamp = block.timestamp;\r\n           counter = counter + 1;\r\n       }\r\n   }\r\n}\r\n```\r\n\r\n编译合约并导航到[Gelato Network](https://app.gelato.network/)。从顶部的右侧下拉菜单中选择Goerli网络。然后，连接你的钱包：\r\n\r\n![Gelato仪表板](https://img.learnblockchain.cn/2023/04/03/57479.png)\r\n\r\n接下来，点击**资金**，添加0.1ETH的存款：\r\n\r\n![添加资金](https://img.learnblockchain.cn/2023/04/03/85373.png)\r\n\r\n一旦你点击**存款**，MetaMask将打开。点击**确认**，你的屏幕上应该出现一条信息，表明交易成功。\r\n\r\n![确认信息](https://img.learnblockchain.cn/2023/04/03/21651.png)\r\n\r\n接下来，一些ETH将被添加到你的余额中。\r\n\r\n![ETH添加到余额](https://img.learnblockchain.cn/2023/04/03/83153.png)\r\n\r\n现在，返回Remix IDE，在Goerli测试网络上部署你的合约，间隔时间为30秒。\r\n\r\n![Deploy Contract Rinkeby](https://img.learnblockchain.cn/2023/04/03/68552.png)\r\n\r\n通过传递你部署的合约地址并将你的合约ABI粘贴到**ABI**字段中，创建一个新任务。\r\n\r\n然后，从**要自动执行的任务**下拉菜单中选择`incrementCounter()`函数。\r\n\r\n![函数自动下拉](https://img.learnblockchain.cn/2023/04/03/89750.png)\r\n\r\n为Gelato选择一个五分钟的频率来自动执行你的智能合约。然后，选择**立即启动**复选框，指示Gelato在你创建任务时立即执行你的智能合约。\r\n\r\n![立即开始](https://img.learnblockchain.cn/2023/04/03/72355.png)\r\n\r\n选择任务的支付方式，点击**创建任务**，并在MetaMask上确认你的交易。\r\n\r\n![创建Gelato测试任务](https://img.learnblockchain.cn/2023/04/03/26732.png)\r\n\r\n在你的Remix IDE上，如果你点击**计数器**，你会发现它已经增加了一个，并将继续每5分钟递增一次：\r\n\r\n![Counter Increment](https://img.learnblockchain.cn/2023/04/03/4565.png)\r\n\r\n好了，你已经成功地在Gelato上为你的智能合约设置了自动化\r\n\r\n## OpenZeppelin Defender\r\n\r\nOpenZeppelin 想必大家都使用过，一个[构建安全去中心化应用程序的流行工具](https://blog.logrocket.com/openzeppelin-secure-smart-contracts/)。\r\n\r\nDefender是OpenZeppelin的一个产品，它是为安全的智能合约自动化而制作的，支持第一层区块链、第二层区块链和侧链。\r\n\r\nOpenZeppelin Defender提供了以下与智能合约自动化相关的功能：\r\n\r\n- [Admin](https://docs.openzeppelin.com/defender/admin)：实现了对智能合约流程的透明管理，如访问控制（对资产的管理权）、升级（修复遇到的错误或应用新的服务）和暂停（使用暂停功能）。\r\n- [Relay](https://docs.openzeppelin.com/defender/relay)：允许创建Relayers（外部拥有的账户），轻松地保护你的私人API密钥，用于签署、管理（发送）你的交易，以及执行诸如Gas价格上限的政策\r\n- [Autotasks](https://docs.openzeppelin.com/defender/autotasks)：连接到Relayers，允许用JavaScript编写和调度代码脚本，这些脚本将在外部网络API或第三方服务的帮助下定期在智能合约上运行。\r\n- [Sentinel](https://docs.openzeppelin.com/defender/sentinel)：监视你的智能合约的交易，并根据指定的条件、功能或事件提供交易的通知。\r\n- [Advisor](https://docs.openzeppelin.com/defender/advisor)：帮助你掌握最新的安全最佳实践，包括实施智能合约开发、监控、操作和测试的安全程序。\r\n\r\n### 演示：用OpenZeppelin Defender自动处理智能合约\r\n\r\n现在，让我们使用上面描述的功能，用OpenZeppelin Defender自动化一个智能合约。\r\n\r\n首先，在你的Remix IDE上创建一个智能合约。使用你之前使用的相同代码，但给它一个新的名称，并将其放在不同的文件夹中：\r\n\r\n```solidity\r\n// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.7;\r\n\r\ncontract Counter {\r\n   uint public counter;\r\n\r\n    uint public immutable interval;\r\n   uint public lastTimeStamp;\r\n\r\n   constructor(uint updateInterval) {\r\n     interval = updateInterval;\r\n     lastTimeStamp = block.timestamp;\r\n\r\n     counter = 0;\r\n   }\r\n\r\n   function incrementCounter() external {\r\n        if ((block.timestamp - lastTimeStamp) > interval ) {\r\n           lastTimeStamp = block.timestamp;\r\n           counter = counter + 1;\r\n       }\r\n   }\r\n}\r\n```\r\n\r\n将合约部署到 Goerli 测试网络，并在 MetaMask 上确认你的交易。然后，执行以下步骤：\r\n\r\n#### 第1步：创建一个中继（Relay）\r\n\r\n导航到[OpenZeppelin Defender Relay dashboard](https://defender.openzeppelin.com/#/relay)，通过提供一个**名称**和选择一个**网络**来创建你的Relayer：\r\n\r\n![创建中继器](https://img.learnblockchain.cn/pics/20230403170252.png)\r\n\r\n\r\n\r\n一旦你创建了中继，再创建 API Key：\r\n\r\n\r\n\r\n![image-20230403170638625](https://img.learnblockchain.cn/pics/20230403170654.png)\r\n\r\n\r\n\r\n注意密钥 API KEY及Secret Key保存到安全的地方。\r\n\r\n你的ETH地址，API密钥和秘密密钥将在你的屏幕上可见。\r\n\r\n![中继者样本](https://img.learnblockchain.cn/2023/04/03/90947.png)\r\n\r\n\r\n\r\n接下来，通过在[水龙头（Faucet）](https://chaintool.tech/faucet#goerli) 网站获取一些测试币，为你的Relayer地址注入一些ETH。然后，查看 Relayer，确认ETH已经被发送到你的OpenZepplin账户：\r\n\r\n![确认Relayer](https://img.learnblockchain.cn/2023/04/03/60240.png)\r\n\r\n#### 第二步：创建一个自动任务\r\n\r\n接下来，在[Defender Autotask dashboard](https://defender.openzeppelin.com/#/autotask)中创建一个自动任务，它将连接到你刚刚创建的Relayer。\r\n\r\n![Defender Autotask dashboard](https://img.learnblockchain.cn/2023/04/03/21476.png)\r\n\r\n点击**添加第一个自动任务**；你可以选择通过“Schedule”或HTTP请求来触发任务。对于这个演示，选择**Schedule**，为**每次运行**时间间隔选择两分钟，并在**连接到Relayer**字段中添加你的**Relayer**名称。\r\n\r\n![image-20230403171830599](https://img.learnblockchain.cn/pics/20230403171831.png)\r\n\r\n现在，通过JavaScript代码片段，它使用[ethers.js](https://docs.ethers.io/v5/)与[defender-relay-client](https://www.npmjs.com/package/defender-relay-client)来导出一个`DefenderRelaySigner`和`DefenderRelayProvider`，用于签署和发送交易。\r\n\r\n下面的代码片段调用并执行了你的智能合约中定义的`incrementCounter()`函数：\r\n\r\n```js\r\nconst { DefenderRelaySigner, DefenderRelayProvider } = require('defender-relay-client');\r\nconst { ethers } = require(\"ethers\");\r\nconst ABI = [`function incrementCounter() external`];\r\n\r\nconst ADDRESS = '0xC1C23C07eC405e7dfD0Cc4B12b1883b6638FB077'\r\n\r\nasync function main(signer) {\r\n        const contract = new ethers.Contract(ADDRESS, ABI, signer);\r\n          await contract.incrementCounter();\r\n          console.log('Incremented counter by 1');\r\n}\r\n\r\nexports.handler = async function(params) {\r\n        const provider = new DefenderRelayProvider(params);\r\n          const signer = new DefenderRelaySigner(params, provider, { speed: 'fast' })\r\n    console.log(`Using relayer ${await signer.getAddress()}`);\r\n          await main(signer);\r\n}openzepp\r\n```\r\n\r\n点击**自动任务**。然后，复制并粘贴上述代码片段到仪表板的**代码**部分：\r\n\r\n![代码字段](https://img.learnblockchain.cn/2023/04/03/33714.png)\r\n\r\n点击\"**创建(Create)**\"按钮，Autotask将每两分钟用你的Relayer中的ETH余额自动执行`incrementFunction（）`。\r\n\r\n一旦自动任务开始运行，请检查你的Remix IDE上的计数器。两分钟后，它应该增加1。\r\n\r\n![Remix IDE计数器](https://img.learnblockchain.cn/2023/04/03/61076.png)\r\n\r\n## 使用Chainlink Automation、Gelato和OpenZeppelin Defender的优点和缺点\r\n\r\nChainlink Automation、Gelato网络和OpenZeppelin Defender 都是智能合约自动化的好选择。以下是在为你的项目选择智能合约自动化工具时需要记住的一些权衡。\r\n\r\n| 智能合约自动化工具 | 优点 | 缺点|\r\n| :----------------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- |\r\n| Chainlink Automation | - 在多个区块链网络上运行<br /> - 提供全面的文档 | - 需要LINK代币（ERC-677）来支付网络 <br />- 智能合约必须与Chainlink Automation兼容 <br /> |\r\n| Gelato网络 | - 提供两种支付智能合约自动化的选择<br /> - 支持众多区块链网络<br /> - 易于使用的架构 | - 任务创建后无法编辑 |\r\n| OpenZeppelin Defender | - 支持多个区块链网络 <br />- 通过指定的通知模式（如电子邮件）提供快速的交易通知 - 提供一个透明的手段来轻松管理任务 | - 与其他智能合约自动化工具相比，使用起来更复杂 |\r\n\r\n## 结论\r\n\r\n启用许多智能合约功能的自动化，可以节省时间并提高安全性。在这篇文章中，我们回顾了一些流行的智能合约自动化工具（Chainlink Automation、Gelato Network和OpenZeppelin Defender），讨论了它们的优点和缺点，并演示了如何使用每个工具来自动化智能合约。\r\n\r\n\r\n\r\n\r\n\r\n本文作者：[LogRocket ](https://lp.logrocket.com/blg/web3-signup)， LogRocket 可主动监控Web3应用程序\r\n\r\n感谢 [Chaintool](https://chaintool.tech/) 对本翻译的支持， Chaintool 是一个为区块链开发者准备的开源工具箱"},"author":{"user":"https://learnblockchain.cn/people/412","address":null},"history":null,"timestamp":1680569431,"version":1}