智能合约不是自动执行的;它们的执行完全取决于在区块链网络上进行的链上交易,作为触发函数调用的行动号召。然而,手动执行智能合约也有缺点,例如潜在的安全风险、不必要的延迟以及人为错误的可能性。
本文探讨了智能合约自动化的核心概念,并回顾了各种智能合约自动化工具的优缺点。此外,本指南还演示了流行的智能合约自动化工具使用的流程:Chainlink Keepers、Gelato Network和OpenZeppelin Defender。
跳跃前进:
先决条件
了解智能合约自动化
链环守护者
演示:使用 Chainlink Keepers 自动化智能合约
冰淇淋网络
演示:使用 Gelato 自动化智能合约
OpenZeppelin Defender
演示:使用 OpenZeppelin Defender 自动化智能合约
使用 Chainlink Keepers、Gelato 和 OpenZeppelin Defender 的优缺点
要继续阅读本文,请确保您具备以下条件:
已安装MetaMask
OpenZeppelin Defender帐户设置
混音在线IDE
Rinkeby测试网络(或Goerli)
Solidity和 JavaScript 编程语言的基础知识
在智能合约自动化出现之前,开发人员使用集中式服务器来实现各种手动流程,例如基于时间的执行、DevOps 任务、链下计算和清算。
手动流程增加了智能合约的安全风险,因为它们给分散的应用程序引入了中心故障点。此外,通常由手动流程导致的网络拥塞可能会延迟交易的执行,从而使用户资金面临风险。
智能合约自动化使我们能够自动化多个 Web3 功能,例如收益农业、跨链 NFT 铸造、抵押不足的贷款清算、游戏等。
现在我们对智能合约自动化有了一个概述,让我们回顾一些流行的智能合约自动化工具并了解它们是如何工作的。
Chainlink Keepers 是一款智能合约自动化工具,可在以太坊、BNB 链和Polygon等多个区块链上运行。Glary Utilities pro专业解锁版,Windows全能系统优化清理增强工具,一键优化!该工具使外部拥有的账户能够对智能合约中的预定条件进行检查,然后根据时间间隔触发和执行交易。
例如,开发人员可以通过监控 Keepers 网络的状况来注册智能合约以进行自动维护。随后,节点在 Keepers 网络上执行链下计算,直到满足智能合约中定义的条件。
如果不满足智能合约条件,则计算返回值false,节点继续工作。如果满足智能合约条件,则计算返回值true,并且 Keepers 网络触发合约执行。
Chainlink Keepers 提供了许多好处:
易于集成:Chainlink Keepers 的用户友好文档包含操作指南,可帮助开发人员加快集成速度
安全性和可靠性:Chainlink Keepers 的去中心化特性通过降低与中心化服务器相关的安全风险,为应用程序提供了一个安全的框架。Chainlink Keepers 使用透明池进行运营,有助于在开发人员和 DAO 之间建立信任
成本效率:Chainlink Keepers 的基础设施提供了优化成本并提高与执行智能合约相关的 Gas 费用稳定性的功能
提高生产力:Chainlink Keepers 处理对智能合约进行检查的链下计算,让开发人员有更多时间专注于构建 DApp
让我们研究如何使用 Chainlink Keepers 自动化智能合约。我们将使用基于 Remix 在线 IDE 构建并部署到 Rinkeby 测试网络的 Solidity 合约。网页更新提醒插件,监控任何网页可自定义规则通知,监控并记录网页内容变化!智能合约将实现 Chainlink Keepers GitHub 存储库中定义的接口。
为了与 Chainlink Keepers 兼容,我们的智能合约必须包含以下两种方法:
checkUpKeep():此方法对基于时间间隔执行的智能合约进行链下计算;该方法返回一个布尔值,告诉网络是否需要维护
performUpKeep():该方法接受方法返回的消息checkUpKeep()作为参数。接下来,它会触发 Chainlink Keepers 对智能合约进行维护。然后,它执行一些链上计算来重新验证checkUpKeep()方法的结果,以确认需要维护
首先,添加以下代码以在您的 Remix IDE 中创建一个简单的计数器合约:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract Counter { uint public counter; uint public immutable interval; uint public lastTimeStamp; constructor(uint updateInterval) { interval = updateInterval; lastTimeStamp = block.timestamp; counter = 0; } function checkUpkeep(bytes calldata /* checkData */) external view 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 { //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 } }
该合约有一个公共变量counter,当新区块与最后一个区块之间的差异大于一个区间时,该变量会加一。然后,它实现了两种与 Keepers 兼容的方法。
现在,导航到Remix 菜单按钮(从顶部开始的第三个按钮)并单击Compile按钮(带有绿色验证标记)来编译合约:
要继续,您需要使用一些ERC-677 LINK 代币来为您的维护提供资金。使用 Faucets 连接您的 Rinkeby 测试网络并在 chainlink 上获得一些测试网络 LINK 代币:
选择Injected Web3作为环境,并选择Rinkeby 测试网络。苹果版ios追剧看片神器,伪装上架支持投屏画质最低1080P,免费秒播放高清无广告!然后,点击发送请求,将 20 个测试 LINK 和 0.1 个测试 ETH 发送到您的钱包。
接下来,通过传递 30 秒作为间隔来部署合约。单击Deploy后,MetaMask 应该会打开,要求您确认交易。
超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →
在您的 MetaMask 钱包中单击确认:
现在您可以查看已部署的合约地址:
接下来,导航到 Chainlink Keepers 并通过选择Time-based trigger 选项并输入部署的智能合约的地址来注册部署的智能合约:
从 Remix IDE 复制合约的 ABI 并将其粘贴到ABI字段中:
现在,在Function Input字段中输入您的合约地址:
指定 Chainlink Keepers 维护您的智能合约的时间表。在Cron 表达式字段中,指示应每 15 分钟执行一次维护。
接下来,通过在以下字段中输入适当的信息来提供维护的详细信息:维护名称、气体限制、 LINK 代币的起始余额和您的电子邮件地址。然后,点击注册维护:
而已!Chainlink Keepers 已成功注册您的智能合约以进行自动维护。
Gelato Network 是一个去中心化的机器人网络,可在所有 EVM 区块链上自动执行智能合约。Gelato 易于使用的架构为 DeFi 应用程序提供了可靠的接口。
要使用 Gelato Network 自动执行智能合约,请执行以下步骤:
在实现计数器的 Remix IDE 上创建新的智能合约
编译并部署智能合约到 Rinkeby 测试网络
将您的 MetaMask 钱包连接到 Gelato 网络并进行存款
使用已部署的合约地址和一些配置在 Gelato 上创建一个任务
让我们开始吧!
在您的 Remix IDE 上,创建一个gelato文件夹,其中包含一个GelatoContract.sol文件,该文件定义了一个函数,该函数根据以下条件递增一个计数器变量:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract Counter { uint public counter; uint public immutable interval; uint public lastTimeStamp; constructor(uint updateInterval) { interval = updateInterval; lastTimeStamp = block.timestamp; counter = 0; } function incrementCounter() external { if ((block.timestamp - lastTimeStamp) > interval ) { lastTimeStamp = block.timestamp; counter = counter + 1; } } }
编译合约并导航到Gelato Network。从顶部右侧下拉列表中选择 Rinkeby 网络。然后,连接你的钱包:
接下来,点击Funds并添加 0.1 ETH 的存款:
单击“存款”后,MetaMask 将打开。单击确认,您的屏幕上会出现一条消息,指示交易成功。
接下来,一些 ETH 将被添加到您的余额中。
现在,返回 Remix IDE 并以 30 秒的间隔在 Rinkeby 测试网络上部署您的合约。
不要错过来自 LogRocket 的精选时事通讯The Replay
了解LogRocket 的 Galileo 如何消除噪音以主动解决应用程序中的问题
使用 React 的 useEffect优化应用程序的性能
在多个 Node 版本之间切换
了解如何使用 AnimXYZ 为您的 React 应用程序制作动画
探索 Tauri,一个用于构建二进制文件的新框架
比较NestJS 与 Express.js
通过传递已部署的合约地址并将合约的 ABI 粘贴到ABI字段中来创建新任务。
然后,incrementCounter()从要自动下拉的功能中选择功能。
为 Gelato 选择五分钟的频率来自动执行您的智能合约。然后,选中立即开始复选框以指示 Gelato 在您创建任务后立即执行您的智能合约。
选择任务的支付方式,点击创建任务,在 MetaMask 上确认您的交易。
在您的 Remix IDE 上,如果您单击counter,您会注意到它增加了 1 并且将继续每五分钟增加一次:
好的,您已成功在 Gelato 上为您的智能合约设置自动化!
OpenZeppelin 是一种用于构建安全分散应用程序的流行工具。Defender 是一款 OpenZeppelin 产品,旨在实现安全的智能合约自动化,并支持第 1 层区块链、第 2 层区块链和侧链。
OpenZeppelin Defender 提供以下与智能合约自动化相关的功能:
管理员:启用智能合约流程的透明管理,例如访问控制(对资产的管理权限)、升级(修复遇到的错误或应用新服务)和暂停(使用暂停功能)
Relay:允许创建 Relayers(外部拥有的账户),轻松保护您的私有 API 密钥,用于签署、管理(发送)您的交易,以及执行汽油价格上限等政策
Autotasks:连接到 Relayers,允许在 JavaScript 中编写和调度代码脚本,这些脚本将在外部 Web API 或第三方服务的帮助下定期在智能合约上运行
Sentinel:监控您的智能合约的交易,并根据指定的条件、功能或事件提供有关交易的通知
顾问:帮助您了解最新的安全最佳实践,包括实施智能合约开发、监控、操作和测试的安全程序
现在,让我们使用上述功能通过 OpenZeppelin Defender 自动化智能合约。
首先,在您的 Remix IDE 上创建一个智能合约。使用您之前使用的相同代码,但给它一个新名称并将其放在不同的文件夹中:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract Counter { uint public counter; uint public immutable interval; uint public lastTimeStamp; constructor(uint updateInterval) { interval = updateInterval; lastTimeStamp = block.timestamp; counter = 0; } function incrementCounter() external { if ((block.timestamp - lastTimeStamp) > interval ) { lastTimeStamp = block.timestamp; counter = counter + 1; } } }
将合约部署到 Rinkeby 测试网络并在 MetaMask 上确认您的交易。然后,执行以下步骤:
第 1 步:创建中继器
导航到OpenZeppelin Defender Relay 仪表板并通过提供Name并选择Network创建您的 Relayer :
创建中继器后,您的 ETH 地址、API 密钥和密钥将显示在您的屏幕上。复制您的密钥,将其保存在安全的地方,然后复制您的 ETH 地址。
接下来,通过将您的地址粘贴到Rinkeby 水龙头中,用一些 ETH 为您的中继者地址提供资金。然后,请参阅您的 Relayer 以确认 ETH 已发送到您的 OpenZepplin 帐户:
第 2 步:创建自动任务
接下来,在Defender Autotask 仪表板中创建一个 Autotask ,它将连接到您刚刚创建的 Relayer。
单击添加第一个自动任务;您可以选择通过计划或 HTTP 请求触发任务。对于此演示,选择Schedule ,为Runs Every timeframe选择两分钟,然后在Connect to a relayer 字段中添加您的 Relayer 名称。
现在,传递 JavaScript 代码片段,它使用ethers.js和defender-relay-client来导出 aDefenderRelaySigner并DefenderRelayProvider用于签名和发送交易。
以下代码片段调用并执行incrementCounter()您的智能合约中定义的函数:
const { DefenderRelaySigner, DefenderRelayProvider } = require('defender-relay-client'); const { ethers } = require("ethers"); const ABI = [`function incrementCounter() external`]; const ADDRESS = '0xC1C23C07eC405e7dfD0Cc4B12b1883b6638FB077' async function main(signer) { const contract = new ethers.Contract(ADDRESS, ABI, signer); await contract.incrementCounter(); console.log('Incremented counter by 1'); } exports.handler = async function(params) { const provider = new DefenderRelayProvider(params); const signer = new DefenderRelaySigner(params, provider, { speed: 'fast' }) console.log(`Using relayer ${await signer.getAddress()}`); await main(signer); }openzepp
点击自动任务。然后,将上述代码段复制并粘贴到仪表板的代码部分:
单击创建按钮,Autotask 将incrementFunction()每隔两分钟自动执行一次,并使用您的中继器中的 ETH 余额。
Autotask 开始运行后,检查 Remix IDE 上的计数器。两分钟后,它应该增加一。
Chainlink Keepers、Gelato Network 和 OpenZeppelin Defender 都是智能合约自动化的不错选择。在为您的项目选择智能合约自动化工具时,请记住以下一些权衡。
智能合约自动化工具 | 优点 | 缺点 |
---|---|---|
链环守护者 | – 在多个区块链网络上运行 – 提供全面的文档 | – 需要 LINK 代币 (ERC-677) 来支付网络 – 智能合约必须与 Chainlink Keepers 兼容 – LINK 代币使用 ERC-677 代币标准,不能直接在 BNB 链和 Polygon 等非以太坊区块链上使用(MATIC)直到它们被桥接和交换 |
冰淇淋网络 | – 提供两种支付智能合约自动化的选项 – 支持众多区块链网络 – 易于使用的架构 | - 任务创建后无法编辑 |
OpenZeppelin Defender | – 支持多个区块链网络 – 通过指定的通知模式(例如电子邮件)提供有关交易的快速通知 – 提供一种透明的方式来轻松管理任务 | – 与其他智能合约自动化工具相比,使用更复杂 |
启用许多智能合约功能的自动化可以节省时间并提高安全性。在本文中,我们回顾了一些流行的智能合约自动化工具(Chainlink Keepers、Gelato Network 和 OpenZeppelin Defender),讨论了它们的优缺点,并演示了如何使用每种工具自动化智能合约