0%

死磕chainLink automation原理

基本概念

理解下erc677标准:erc677

原文集锦:https://github.com/blockchainGuide

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

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

智能合约自动化使我们能够自动化若干Web3功能,如挖矿复投、跨链NFT铸币、清算抵押不足的贷款、博彩等等。而chainlink Automation 正是为了解决这个问题。

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

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

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

Chainlink Automation提供了许多好处:

  • 安全性和可靠性:Chainlink Automation的去中心化特性通过减少与中心化服务器相关的安全风险为应用程序提供了一个安全框架。Chainlink Automation利用透明池进行操作,有助于在开发者和DAO之间建立信任。
  • 成本效率:Chainlink Automation的基础设施提供了优化成本的功能,并提高了与执行智能合约相关的Gas费用的稳定性。
  • 增加的生产力:Chainlink Automation处理在智能合约上运行检查的链外计算,让开发者有更多时间专注于构建DApps

触发器

合约是由多个任务组成,如果满足特定的条件,那么可以调用智能合约函数,这些特定的条件叫做触发器,目前Chainlink Automation Network支持三种类型的触发器:

  1. 基于时间的触发器(Time-based trigger):
    • 根据预定的时间表执行函数
    • 也称为作业调度器(Job Scheduler)
    • 这个概念类似于以太坊闹钟(Ethereum Alarm Clock)
    • 使用这种触发器的合约不需要兼容 AutomationCompatibleInterface 接口
  2. 自定义逻辑触发器(Custom logic trigger):
    • 允许提供自定义的 Solidity 逻辑
    • 自动化节点(Automation Nodes)会离线评估这些逻辑
    • 根据评估结果决定何时在链上执行您的函数
    • 使用这种触发器的合约必须兼容 AutomationCompatibleInterface 接口
    • 示例包括:检查合约余额、仅在达到特定条件时执行限价订单等
  3. 日志触发器(Log trigger):
    • 使用日志数据作为触发条件和输入
    • 同样需要合约兼容 AutomationCompatibleInterface 接口

Automation架构

image-20240819165212947

这张图展示了Chainlink自动化(Automation)的一个核心工作流程,主要涉及到链下(off-chain)触发、链上(on-chain)执行以及数据验证等环节。通过将链下事件与链上合约交互,实现了一套可靠、高效的自动化系统。

核心组件及功能

  • 触发器(Trigger):

    • 位置: 链下
    • 功能: 作为自动化流程的起点,监视链下事件或达到特定条件时,触发自动化任务。
  • 链下节点(Off-chain Nodes):

    • 位置: 链下
    • 功能:
      • 接收触发器的信号。
      • 执行必要的计算或数据获取。
      • 判断是否需要执行链上操作。
      • 如果需要,则生成包含所需数据的报告。
  • 注册表(Registry):

    • 位置: 链上
    • 功能:
      • 存储自动化任务的配置信息。
      • 验证链下节点提交的报告的签名。
  • 转发器(Forwarder):

    • 位置: 链上
    • 功能:
      • 从注册表获取任务配置。
      • 调用链上合约(Keepers)执行具体的自动化任务。
  • Keeper合约(Upkeep contract):

    • 位置: 链上

    • 功能:

      • 执行具体的自动化任务,

        例如:

        • 更新数据
        • 启动其他合约
        • 触发外部系统

工作流程

  1. 链下触发:
    • 触发器监测到某个事件发生或条件满足。
    • 触发器向链下节点发送信号。
  2. 链下节点处理:
    • 链下节点接收到信号后,执行相应的逻辑。
    • 如果需要执行链上操作,则生成包含所需数据的报告,并对报告进行签名。
  3. 数据上链:
    • 链下节点将签名的报告发送给注册表。
    • 注册表验证报告的签名,确认数据的可靠性。
  4. 链上执行:
    • 注册表将验证通过的数据转发给转发器。
    • 转发器根据数据调用相应的Keeper合约。
    • Keeper合约执行具体的自动化任务。

案例

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

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

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

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

首先创建一个测试合约:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 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 要求实现的方法。

当我们把合约部署到以太坊测试网之后,导航到Chainlink Automation, 通过选择基于时间的触发器选项,并输入你部署的智能合约的地址来注册你的部署的智能合约

image-20240819180033675

接着填写合约ABI:

image-20240819180124348

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

image-20240819180154270

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

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

应用场景

  • 数据馈入: 将链下数据源(如价格数据、天气数据)喂入智能合约。
  • 自动化任务: 自动执行重复性的任务,如销毁过期的债券或更新利率。
  • 跨链交互: 在不同的区块链之间传递数据和执行操作。

引用