智能合约自动化工具使用及对比

  • Meta
  • 更新于 2023-10-18 22:32
  • 阅读 2917

智能合约自动化工具:Chainlink Keeper、Gelato Network、OpenZeppelin Defender 如何使用,及他们的优缺点。

智能合约并不是自动执行的;它们的执行完全依赖于在区块链网络上进行的链上交易,而这些交易作为触发函数调用的行动号召。然而,手动执行智能合约也有缺点,例如潜在的安全风险、不必要的延迟以及人为错误的可能性。

本文探讨了智能合约自动化的核心概念,并回顾了各种智能合约自动化工具的优缺点。此外,本指南还演示了当前主流的智能合约自动化工具(Chainlink KeepersGelato Network OpenZeppelin Defender)的使用流程。

前提条件

要阅读本文,请确保你具备以下条件:

了解智能合约自动化

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

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

智能合约自动化使我们能够自动化多个 Web3 函数,例如流动性挖矿、跨链 NFT 铸造、抵押不足贷款的清算、游戏等等。

既然我们已经了解了智能合约自动化的概述,让我们来回顾一些流行的智能合约自动化工具,并了解它们的工作原理。

Chainlink Keepers

编者注: Chainlink Keepers 服务现在更名为 Chainlink Automation

Chainlink Keepers 是一个在多个区块链上运行的智能合约自动化工具,例如EthereumBNB chainPolygon。这个工具允许外部拥有的账户对智能合约中预定条件进行检查,然后根据时间间隔触发和执行交易。

例如,开发人员可以通过在 Keepers 监控网络上注册智能合约(UpKeep)以进行自动维护。随后,节点在 Keepers 网络上执行链下计算,直到满足智能合约中定义的条件。

如果不满足智能合约条件,计算将返回值 false ,并且节点继续其工作。如果满足智能合约条件,计算返回值true ,Keepers 网络触发合约执行。

Chainlink Keepers 提供许多好处:

  • 轻松集成:Chainlink Keepers 的文档编写得简明易懂,为开发者提供了操作指南,可帮助开发人员加快集成速度。
  • 安全性和可靠性: Chainlink Keepers 的去中心化性质通过降低与中心化服务器相关的安全风险,为应用程序提供了一个安全的框架。 Chainlink Keepers 利用透明池进行运营,帮助开发者和 DAO 之间建立信任。
  • 成本效率: Chainlink Keepers 的基础设施提供了优化成本和改善与执行智能合约相关的Gas费用稳定性的功能。
  • 提高生产力:Chainlink Keepers 负责处理对智能合约进行检查的链下计算,让开发人员有更多时间专注于构建 DApp。

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

让我们来探讨如何使用 Chainlink Keepers 自动化智能合约。我们将在 Remix 在线集成开发环境上构建 Solidity 合约,并将其部署到 Goerli 测试网络上。这个智能合约将实现在 Chainlink Keepers GitHub repository中定义的接口。

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

  • checkUpKeep():该方法基于时间间隔对智能合约执行链下计算; 该方法返回一个布尔值,告诉网络是否需要自动化执行performUpKeep()
  • performUpKeep():此方法接受 checkUpKeep() 方法返回的消息作为参数。 接下来, Chainlink Keepers 触发智能合约执行performUpKeep。 然后,它执行一些链上计算以重新验证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 ,当新块和最后一个块之间的时间间隔大于某个区间时,counter加1。然后,它实现了两个 Keepers 兼容的方法。

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

Compile Contract

继续,你需要使用一些 ERC-677 LINK tokens 来支付网络维护费用。 使用水龙头 连接你的 Goerli 测试网络并在 chainlink 上 获取一些测试网 LINK 代币:

Request Testnet Link

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

接下来,使用30 秒作为参数间隔时间来部署合约。 单击部署后,MetaMask 将打开,要求你确认交易。


img


在你的 MetaMask 钱包中点击确认

Confirm Button MetaMask

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

Deployed Contract Address

接下来,导航到 Chainlink Keepers 并通过选择基于时间(Time-based)的触发选项并输入已部署的智能合约的地址来注册你已部署的智能合约:

Register New Upkeep

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

Chainlink Automation - ABI

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

Chainlink Automation - 注册函数输入

指定 Chainlink Keepers 对你的智能合约执行UpKeep的时间表。 在 Cron expression 字段中,指示应每 15 分钟执行一次UpKeep。

Cron Expression

接下来,通过在以下字段中输入适当的信息来提供UpKeep详细信息:UpKeep名称、Gas 限制、LINK 代币的起始余额电子邮件地址。 然后,单击注册UpKeep

Upkeep Details

就是这样! Chainlink Keepers 已成功注册你的智能合约以进行自动化执行。

Gelato Network

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

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

要与 Gelato 网络自动执行智能合约,请按照以下步骤操作:

  1. 在 Remix IDE 上创建一个新的智能合约来实现计数器
  2. 编译智能合约并将其部署到 Goerli 测试网络
  3. 将你的 MetaMask 钱包连接到 Gelato 网络并存款
  4. 使用已部署的合约地址和一些配置在 Gelato 上创建任务

让我们开始吧!

在 Remix IDE 上,创建一个包含GelatoContract.sol文件的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 Network。 从顶部右侧的下拉列表中选择 Goerli 网络。 然后,连接你的钱包:

Gelato Dashboard

接下来,点击 Funds 并添加 0.1 ETH 的存款:

Add Funds

一旦你点击Deposit,MetaMask 将打开。 点击确认,屏幕上会出现一条消息,表明交易成功。

Confirm Message

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

ETH Added to Balance

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

Deploy Contract Goerli

通过传递已部署的合约地址并将合约的 ABI 粘贴到 ABI 字段来创建新任务。

然后,从 Funtion to be automated 下拉列表中选择incrementCounter()函数。

Function Automated Dropdown

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

Start Immediately

选择任务的付款方式,点击Create Task,并在 MetaMask 上确认你的交易。

Create Gelato Test Task

在 Remix IDE 上,如果单击 counter,你会注意到它增加了 1,并将继续每五分钟增加一次:

Counter Increment

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

OpenZeppelin Defender

OpenZeppelin 是一个构建安全去中心化应用程序的流行工具。 Defender 是OpenZeppelin 专为安全智能合约自动化而设计的一款产品,支持第 1 层区块链、第 2 层区块链和侧链。

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

  • 管理(Admin): 实现智能合约流程的透明管理,例如访问控制(对资产的管理权限)、升级(修复遇到的错误或应用新服务)和暂停(使用暂停功能)
  • 中继器(Relay): 允许创建中继器(外部拥有的帐户),轻松保护你的私有 API 密钥,用于签名、管理(发送)交易以及执行 Gas 价格上限等政策
  • 自动任务(Autotasks): 连接到中继器,允许在 JavaScript 中编写和调度代码脚本,这些脚本将在外部 Web 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 步:创建中继器

导航到 OpenZeppelin Defender 中继器仪表板 并通过提供 名称 并选择 网络 来创建你的中继器:

Create Relayer

创建 Relayer 后,你的 ETH 地址、API 密钥和密钥将在屏幕上可见。 复制你的密钥,将其保存在安全的地方,然后复制你的 ETH 地址。

Sample Relayer

接下来,将你的地址粘贴到 Goerli faucet 中,为你的中继器地址注入一些 ETH。 然后,查看中继器确认 ETH 已发送至你的 OpenZepplin 帐户:

Confirm Relayer

第 2 步:创建自动任务

接下来,在 Defender 自动任务仪表板 中创建一个自动任务,该自动任务将连接到你刚刚创建的中继器。

Defender Autotask dashboard

单击添加第一个自动任务; 你可以选择通过计划或 HTTP 请求触发任务。 对于此演示,选择 时间表(Schedule),为 运行频率 时间范围选择两分钟,然后在 连接到中继器 字段中添加你的中继器名称。

Schedule Button

现在,使用 ethers.jsdefender-relay-client 的 JavaScript 代码来导出 DefenderRelaySignerDefenderRelayProvider 进行签名并发送交易。

以下代码片段调用并执行智能合约中定义的incrementCounter()函数:

const { DefenderRelayProvider, DefenderRelaySigner } = require('@openzeppelin/defender-relay-client/lib/ethers');
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);
}

单击“自动任务”。 然后,将上面的代码片段复制并粘贴到仪表板的 Code 部分:

Code Field

点击 Create 按钮,Autotask 使用中继器的 ETH 余额将每两分钟自动执行一次 incrementFunction()

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

Remix IDE Counter

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

Chainlink Keepers、Gelato Network 和 OpenZeppelin Defender 都是智能合约自动化的不错选择。 在为你的项目选择智能合约自动化工具时,请记住以下一些权衡。

智能合约自动化工具 优点 缺点
Chainlink Keepers 在多个区块链网络上运行 ;提供全面的文档 需要 LINK 代币(ERC-677)来支付网络费用;智能合约必须与 Chainlink Keepers 兼容;LINK 代币使用 ERC-677 代币标准,不能直接在 BNB 链和 Polygon (MATIC) 等非以太坊区块链上使用,除非它们被桥接和交换
Gelato Network 提供两种支付智能合约自动化的选项 ;支持众多区块链网络 ;易于使用的架构 任务创建后不可编辑
OpenZeppelin Defender 支持多个区块链网络;通过指定的通知模式(例如电子邮件)提供有关交易的快速通知 ; 提供透明的方式来轻松管理任务 与其他智能合约自动化工具相比,使用起来更复杂

结论

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


原文作者:logrocket,LogRocket 就像网络和移动应用程序的 DVR,记录网络应用程序或网站中发生的所有情况。 你无需猜测问题发生的原因,而是可以汇总和报告关键前端性能指标、重放用户会话以及应用程序状态、记录网络请求并自动显示所有错误。现代化调试 Web 和移动应用程序的方式 — 开始免费监控

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

1 条评论

请先 登录 后评论
Meta
Meta
0x0148...de2f
Solidity