智能合约不是自动执行的;它们的执行完全取决于在区块链网络上进行的链上交易,作为触发功能调用的行动呼吁。然而,手动执行智能合约有缺点,如潜在的安全风险,不必要的延迟,以及人为错误的可能性。
本文探讨了智能合约自动化的核心概念,并回顾了各种智能合约自动化工具的优点和缺点。此外,本指南还展示了流行的智能合约自动化工具所使用的流程。Chainlink Keepers, theGelato Network, andOpenZeppelin Defender。
目录
前提条件
要跟上这篇文章,请确保你有以下条件:
- 安装了MetaMask
- 设置了OpenZeppelin Defender账户
- Remix在线IDE
- Rinkeby测试网络(或Goerli)。
- 具有Solidity和JavaScript编程语言的基本知识
了解智能合约自动化
在智能合约自动化出现之前,开发人员使用集中式服务器来实现各种手动流程,如基于时间的执行、DevOps任务、链外计算和清算。
手工流程增加了智能合约的安全风险,因为它们给去中心化的应用程序引入了一个中心故障点。此外,手动流程经常导致的网络拥堵会延迟交易的执行,使用户资金面临风险。
智能合约自动化使我们能够自动化几个Web3功能,如产量耕作、跨链NFT铸币、清算抵押不足的贷款、游戏等等。
现在我们对智能合约自动化有了一个概述,让我们回顾一下一些流行的智能合约自动化工具,了解它们是如何工作的。
Chainlink Keepers
Chainlink Keepers是一个智能合约自动化工具,在多个区块链上运行,如Ethereum、BNB链和Polygon。这个工具使外部拥有的账户能够对智能合约中的预定条件进行检查,然后根据时间间隔来触发和执行交易。
例如,开发者可以通过监测Keepers网络上的条件来注册智能合约进行自动维护。随后,由节点在Keepers网络上进行链外计算,直到智能合约中定义的条件得到满足。
如果智能合约的条件没有得到满足,计算的结果是false
,而节点则继续他们的工作。如果智能合约的条件得到满足,计算返回值为true
,Keepers网络就会触发合约的执行。
Chainlink Keepers提供了许多好处:
- 易于整合。Chainlink Keepers的用户友好型文档由如何操作指南组成,帮助开发者快速完成集成工作
- 安全性和可靠性。Chainlink Keepers的去中心化特性通过减少与中心化服务器相关的安全风险,为应用程序提供了一个安全框架。Chainlink Keepers利用透明池进行操作,帮助开发者和DAO之间建立信任。
- 成本效益。Chainlink Keepers的基础设施提供了优化成本的功能,提高了与执行智能合约相关的气体费用的稳定性
- 提高生产力。Chainlink Keepers处理对智能合约进行检查的链外计算,让开发者有更多的时间专注于构建DApps
演示:用Chainlink Keepers自动化智能合约
让我们来研究一下如何用Chainlink Keepers来实现智能合约的自动化。我们将使用一个建立在Remix在线IDE上的Solidity合约,并部署到Rinkeby测试网络。该智能合约将实现Chainlink KeepersGitHub仓库中定义的接口。
为了与Chainlink Keepers兼容,我们的智能合约必须包括以下两个方法:
checkUpKeep()
:该方法在智能合约上进行链外计算,该计算基于时间间隔执行;该方法返回一个布尔值,告诉网络是否需要维护performUpKeep()
:该方法接受从checkUpKeep()
方法返回的消息作为参数。接下来,它触发Chainlink Keepers来执行智能合约的upkeep。然后,它执行一些链上计算来验证来自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菜单按钮(从顶部开始的第三个按钮),点击编译按钮(用绿色验证标记表示)来编译合同。
要继续下去,你需要用一些ERC-677 LINK代币来资助你的维持。使用Faucets连接你的Rinkeby测试网络,并在链路上获得一些testnet LINK代币。
选择Injected Web3作为环境,并选择Rinkeby测试网络。然后,点击发送请求,获得20个测试LINK和0.1个测试ETH发送到你的钱包。
接下来,通过传递30秒的时间间隔来部署合约。一旦你点击部署,MetaMask应该打开,要求你确认交易。
在你的MetaMask钱包中点击确认。
现在你可以查看你部署的合约地址。
接下来,导航到Chainlink Keepers,通过选择基于时间的触发器选项并输入你部署的智能合约的地址来注册你的部署的智能合约。
从你的Remix IDE中复制你的合约ABI,并将其粘贴到ABI字段中。
现在,在功能输入栏中输入你的合约地址。
指定Chainlink Keepers对你的智能合约进行维护的时间安排。在Cron表达式字段中,指出维护应该每15分钟执行一次。
接下来,通过在以下字段中输入适当的信息,为你的维护提供细节。维护的名称,气体限制,LINK代币的起始余额,以及您的电子邮件地址。然后,点击注册维护。
这就是了!Chainlink Keepers已经成功注册了你的智能合约,以实现自动维护。
Gelato网络
Gelato网络是一个去中心化的机器人网络,可以自动执行所有EVM区块链上的智能合约。Gelato易于使用的架构为DeFi应用提供了一个可靠的接口。
演示:用Gelato自动执行一个智能合约
要用Gelato网络自动执行智能合约,请遵循以下步骤。
- 在Remix IDE上创建一个新的智能合约,实现一个计数器。
- 编译并部署该智能合约到Rinkeby测试网络上
- 将您的MetaMask钱包连接到Gelato网络并进行存款
- 在Gelato上创建一个带有已部署合约地址和一些配置的任务
让我们开始吧!
GelatoContract.sol
在你的Remix IDE上,创建一个gelato
文件夹,该文件定义了一个函数,根据以下条件增加一个计数器变量。
// 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网络。从顶部、右侧的下拉菜单中选择Rinkeby网络。然后,连接你的钱包。
接下来,点击资金,添加0.1ETH的存款。
一旦你点击存款,MetaMask将打开。点击确认,你的屏幕上应该出现一条信息,表明交易成功。
接下来,一些ETH将被添加到您的余额。
现在,返回Remix IDE,在Rinkeby测试网络上部署您的合约,间隔时间为30秒。
通过传递你部署的合约地址并将你的合约ABI粘贴到ABI字段中,创建一个新任务。
然后,从Funtion to be automated下拉菜单中选择incrementCounter()
功能。
选择一个五分钟的频率,让Gelato自动执行你的智能合约。然后,选择立即开始复选框,指示Gelato在你创建任务时立即执行你的智能合约。
选择任务的支付方式,点击创建任务,并在MetaMask上确认你的交易。
在你的Remix IDE上,如果你点击计数器,你会发现它已经增加了1,并将继续每5分钟递增。
好了,你已经成功地在Gelato上为你的智能合约设置了自动化。
OpenZeppelin卫士
OpenZeppelin是一个流行的工具,用于构建安全的去中心化应用程序。Defender是OpenZeppelin的一个产品,是为安全的智能合约自动化而制作的,支持第一层区块链、第二层区块链和侧链。
OpenZeppelin Defender提供以下与智能合约自动化相关的功能:
- 管理员:实现了对智能合约过程的透明管理,如访问控制(对资产的管理权)、升级(修复遇到的错误或应用新服务)和暂停(使用暂停功能)。
- 中继:允许创建Relayers(外部拥有的账户),轻松保护你的私人API密钥,用于签署、管理(发送)你的交易,以及执行政策,如天然气价格上限。
- 自动任务:连接到Relayers,允许用JavaScript编写和调度代码脚本,这些脚本将在外部网络API或第三方服务的帮助下定期在智能合约上运行。
- 哨兵:监视你的智能合约的交易,并根据指定的条件、功能或事件提供交易的通知
- 顾问:帮助你保持与安全最佳实践的同步,包括实施智能合约开发、监测、操作和测试的安全程序
演示:用OpenZeppelin Defender自动执行一个智能合约
现在,让我们使用上面描述的功能,用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仪表板,通过提供一个名称和选择一个网络来创建你的Relayer。
一旦你创建了你的中继器,你的ETH地址、API密钥和秘密密钥将在你的屏幕上可见。复制您的密匙,将其保存在安全的地方,然后复制您的ETH地址。
接下来,通过将你的地址粘贴到Rinkeby龙头中,为你的Relayer地址提供一些ETH。然后,参考你的Relayer,确认ETH已经被发送到你的OpenZepplin账户。
第二步:创建一个自动任务
接下来,在Defender Autotask仪表板中创建一个Autotask,它将连接到你刚刚创建的Relayer。
点击添加第一个自动任务;你可以选择通过时间表或HTTP请求来触发任务。对于这个演示,选择时间表,为 "每次运行"选择两分钟,并在 "连接到继电器"字段中添加您的继电器名称。
现在,通过JavaScript代码片段,它使用ethers.js与defender-relay-client来导出一个DefenderRelaySigner
和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。然后,复制并粘贴上述代码片段到仪表板的代码部分。
点击创建按钮,Autotask将每两分钟用你Relayer中的ETH余额自动执行incrementFunction()
。
一旦自动任务开始运行,检查Remix IDE上的计数器。两分钟后,它应该增加一个。
结论
启用许多智能合约功能的自动化,可以节省时间并提高安全性。在这篇文章中,我们回顾了一些流行的智能合约自动化工具(Chainlink Keepers、Gelato Network和OpenZeppelin Defender),讨论了它们的优点和缺点,并演示了如何用每个工具实现智能合约的自动化。