使用Automation、Gelato和Defender 进行合约自动化执行

ChainLink Automation、Gelato Network 和OpenZeppelin Defender 三个自动化合约执行工具对比。

智能合约无法自动执行,其执行需要通过区块链网络上进行的链上交易触发。然而,手动执行智能合约有缺点,如潜在的安全风险,不必要的延迟,以及人为错误的可能性。

本文探讨了智能合约自动化的核心概念,并回顾了各种智能合约自动化工具的优点和缺点。此外,本指南还展示了流行的智能合约自动化工具所使用的流程:Chainlink AutomationGelato Network,以及OpenZeppelin Defender

本文主要内容:

  • 前置知识
  • 了解智能合约自动化
  • Chainlink Automation
  • 演示:用Chainlink Automation实现智能合约的自动化
  • Gelato Network
  • 演示:用Gelato实现智能合约的自动化
  • OpenZeppelin Defender
  • 演示:用OpenZeppelin Defender实现智能合约的自动化
  • 使用Chainlink Automation、Gelato和OpenZeppelin Defender的优点和缺点

前置知识

要跟上这篇文章,请确保你有以下准备:

了解智能合约自动化

在智能合约自动化出现之前,开发者使用中心化服务器来实现各种手动流程,如基于时间的执行、DevOps任务、链外计算和清算。

手动流程增加了智能合约的安全风险,因为它们给去中心化的应用程序引入了一个中心故障点。此外,手动流程经常导致的网络拥堵会延迟交易的执行,使用户资金面临风险。

智能合约自动化使我们能够自动化若干Web3功能,如挖矿复投、跨链NFT铸币、清算抵押不足的贷款、博彩等等。

现在我们对智能合约自动化有了一个概述,让我们回顾一下一些流行的智能合约自动化工具,了解它们是如何工作的。

Chainlink Automation

Chainlink Automation是一个智能合约自动化工具,在多个区块链上运行,如以太坊BNB链Polygon 等。这个工具使外部拥有的账户能够对智能合约中的预定条件进行检查,然后根据时间间隔来触发和执行交易。

例如,开发者可以通过监测Automation网络上的条件来注册智能合约进行自动维护。随后,由节点在Automation网络上进行链外计算,直到智能合约中定义的条件得到满足。

如果智能合约的条件没有得到满足,计算会返回一个 "false "的值,而节点会继续他们的工作。如果智能合约的条件得到满足,计算结果返回 "true",Automation网络就会触发合约的执行。

Chainlink Automation提供了许多好处:

  • 容易集成:Chainlink Automation的用户文档友好,有操作指南,可以帮助开发者快速完成集成工作

  • 安全性和可靠性:Chainlink Automation的去中心化特性通过减少与中心化服务器相关的安全风险为应用程序提供了一个安全框架。Chainlink Automation利用透明池进行操作,有助于在开发者和DAO之间建立信任。

  • 成本效率:Chainlink Automation的基础设施提供了优化成本的功能,并提高了与执行智能合约相关的Gas费用的稳定性。

  • 增加的生产力:Chainlink Automation处理在智能合约上运行检查的链外计算,让开发者有更多时间专注于构建DApps

演示:使用Chainlink Automation自动化智能合约

让我们研究一下如何用Chainlink Automation来自动执行智能合约。

我们将使用一个建立在Remix IDE上的Solidity合约,并部署到测试网络。该智能合约将实现Chainlink Automation GitHub仓库中定义的接口。

为了与Chainlink Automation兼容,我们的智能合约必须包括以下两个方法:

  • checkUpKeep():在链下间隔执行调用该函数, 该方法返回一个布尔值,告诉网络是否需要自动化执行。
  • performUpKeep():这个方法接受从checkUpKeep()方法返回的信息作为参数。Chainlink Automation 会触发对它的调用。函数应该先进行一些检查,再执行链上其他计算。

要想开始,请添加以下代码,在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,当新区块和上一个区块之间的差值大于一个区间时,该变量会递增1。然后,它实现了两个Automation 要求实现的方法。

现在,导航到Remix菜单按钮(从顶部开始的第三个按钮),点击Compile按钮(用绿色验证标记表示)来编译合约:

编译合约

为了继续进行,你需要用一些ERC-677 LINK代币来作为手续费。使用Faucets连接你的测试网络,并在Chainlink上获得一些testnet LINK代币

申请测试网链接

选择Injected Web3作为环境,并选择Goerli 测试网络。然后,点击发送请求,获得20个测试LINK和0.1个测试ETH发送到你的钱包。

接下来,通过传递30秒作为间隔来部署合约。一旦你点击部署,MetaMask应该打开,要求你确认交易。

在你的MetaMask钱包中点击确认

确认按钮MetaMask

现在你可以查看你部署的合约地址:

部署的合约地址

接下来,导航到Chainlink Automation,通过选择基于时间的触发器选项,并输入你部署的智能合约的地址来注册你的部署的智能合约:

注册新Upkeep

从你的Remix IDE中复制你的合约的ABI,并将其粘贴到ABI字段中:

ABI字段

现在,在函数输入字段中输入你的合约地址:

功能输入

指定Chainlink Automation对你的智能合约进行维护的时间安排。在Cron表达式字段中,指出每15分钟应进行一次维护。

Cron Expression

接下来,通过在以下字段中输入适当的信息,为你的Upkeep提供细节:Upkeep名称,Gas LimitLINK代币的起始余额,以及你的电子邮件地址。然后,点击注册Upkeep

维护详情

这样就可以了 !

Chainlink Automation 已经成功注册了你的智能合约,就会进行自动检查你的条件(checkUpkeep),满足条件时调用 performUpkeep

Gelato Network

Gelato Network是一个去中心化的机器人网络,可以自动执行所有EVM区块链上的智能合约。Gelato易于使用的架构为DeFi应用提供了一个可靠的接口。

演示:用Gelato自动执行一个智能合约

要用Gelato网络自动执行一个智能合约,请遵循以下步骤:

  1. 在Remix IDE上创建一个新的智能合约,实现一个计数器。
  2. 编译并部署该智能合约到Rinkeby测试网络上
  3. 将你的MetaMask钱包连接到Gelato网络并进行存款
  4. 在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。从顶部的右侧下拉菜单中选择Goerli网络。然后,连接你的钱包:

Gelato仪表板

接下来,点击资金,添加0.1ETH的存款:

添加资金

一旦你点击存款,MetaMask将打开。点击确认,你的屏幕上应该出现一条信息,表明交易成功。

确认信息

接下来,一些ETH将被添加到你的余额中。

ETH添加到余额

现在,返回Remix IDE,在Goerli测试网络上部署你的合约,间隔时间为30秒。

Deploy Contract Rinkeby

通过传递你部署的合约地址并将你的合约ABI粘贴到ABI字段中,创建一个新任务。

然后,从要自动执行的任务下拉菜单中选择incrementCounter()函数。

函数自动下拉

为Gelato选择一个五分钟的频率来自动执行你的智能合约。然后,选择立即启动复选框,指示Gelato在你创建任务时立即执行你的智能合约。

立即开始

选择任务的支付方式,点击创建任务,并在MetaMask上确认你的交易。

创建Gelato测试任务

在你的Remix IDE上,如果你点击计数器,你会发现它已经增加了一个,并将继续每5分钟递增一次:

Counter Increment

好了,你已经成功地在Gelato上为你的智能合约设置了自动化

OpenZeppelin Defender

OpenZeppelin 想必大家都使用过,一个构建安全去中心化应用程序的流行工具

Defender是OpenZeppelin的一个产品,它是为安全的智能合约自动化而制作的,支持第一层区块链、第二层区块链和侧链。

OpenZeppelin Defender提供了以下与智能合约自动化相关的功能:

  • Admin:实现了对智能合约流程的透明管理,如访问控制(对资产的管理权)、升级(修复遇到的错误或应用新的服务)和暂停(使用暂停功能)。
  • Relay:允许创建Relayers(外部拥有的账户),轻松地保护你的私人API密钥,用于签署、管理(发送)你的交易,以及执行诸如Gas价格上限的政策
  • Autotasks:连接到Relayers,允许用JavaScript编写和调度代码脚本,这些脚本将在外部网络API或第三方服务的帮助下定期在智能合约上运行。
  • Sentinel:监视你的智能合约的交易,并根据指定的条件、功能或事件提供交易的通知。
  • Advisor:帮助你掌握最新的安全最佳实践,包括实施智能合约开发、监控、操作和测试的安全程序。

演示:用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;
       }
   }
}

将合约部署到 Goerli 测试网络,并在 MetaMask 上确认你的交易。然后,执行以下步骤:

第1步:创建一个中继(Relay)

导航到OpenZeppelin Defender Relay dashboard,通过提供一个名称和选择一个网络来创建你的Relayer:

创建中继器

一旦你创建了中继,再创建 API Key:

image-20230403170638625

注意密钥 API KEY及Secret Key保存到安全的地方。

你的ETH地址,API密钥和秘密密钥将在你的屏幕上可见。

中继者样本

接下来,通过在水龙头(Faucet) 网站获取一些测试币,为你的Relayer地址注入一些ETH。然后,查看 Relayer,确认ETH已经被发送到你的OpenZepplin账户:

确认Relayer

第二步:创建一个自动任务

接下来,在Defender Autotask dashboard中创建一个自动任务,它将连接到你刚刚创建的Relayer。

Defender Autotask dashboard

点击添加第一个自动任务;你可以选择通过“Schedule”或HTTP请求来触发任务。对于这个演示,选择Schedule,为每次运行时间间隔选择两分钟,并在连接到Relayer字段中添加你的Relayer名称。

image-20230403171830599

现在,通过JavaScript代码片段,它使用ethers.jsdefender-relay-client来导出一个DefenderRelaySignerDefenderRelayProvider,用于签署和发送交易。

下面的代码片段调用并执行了你的智能合约中定义的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

点击自动任务。然后,复制并粘贴上述代码片段到仪表板的代码部分:

代码字段

点击"创建(Create)"按钮,Autotask将每两分钟用你的Relayer中的ETH余额自动执行incrementFunction()

一旦自动任务开始运行,请检查你的Remix IDE上的计数器。两分钟后,它应该增加1。

Remix IDE计数器

使用Chainlink Automation、Gelato和OpenZeppelin Defender的优点和缺点

Chainlink Automation、Gelato网络和OpenZeppelin Defender 都是智能合约自动化的好选择。以下是在为你的项目选择智能合约自动化工具时需要记住的一些权衡。

智能合约自动化工具 优点 缺点
Chainlink Automation - 在多个区块链网络上运行<br /> - 提供全面的文档 - 需要LINK代币(ERC-677)来支付网络 <br />- 智能合约必须与Chainlink Automation兼容 <br />
Gelato网络 - 提供两种支付智能合约自动化的选择<br /> - 支持众多区块链网络<br /> - 易于使用的架构 - 任务创建后无法编辑
OpenZeppelin Defender - 支持多个区块链网络 <br />- 通过指定的通知模式(如电子邮件)提供快速的交易通知 - 提供一个透明的手段来轻松管理任务 - 与其他智能合约自动化工具相比,使用起来更复杂

结论

启用许多智能合约功能的自动化,可以节省时间并提高安全性。在这篇文章中,我们回顾了一些流行的智能合约自动化工具(Chainlink Automation、Gelato Network和OpenZeppelin Defender),讨论了它们的优点和缺点,并演示了如何使用每个工具来自动化智能合约。

本文作者:LogRocket , LogRocket 可主动监控Web3应用程序

感谢 Chaintool 对本翻译的支持, Chaintool 是一个为区块链开发者准备的开源工具箱

点赞 2
收藏 4
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
翻译小组
翻译小组
0x9e64...7c84
大家看到好的文章可以在 GitHub 提 Issue: https://github.com/lbc-team/Pioneer/issues 欢迎关注我的 Twitter: https://twitter.com/UpchainDAO