概述
预言机是收集、验证链下信息,并将验证后的数据“投喂”给区块链上的智能合约,以此来触发链上智能合约的自动执行。
预言机通常由链上运行的智能合约和一些链下组件构成。 链上合约接收其他智能合约的数据请求,并将这些请求传送给链下组件(称为预言机节点)。 这类预言机节点可以查询数据源—例如使用应用程序接口 (API)—并发送交易将请求的数据存储在智能合约的存储中。关于预言机的更多介绍可以查看官方文档。
本文主要以去中心化预言机——Chainlink为例,介绍定时触发智能合约执行的详细步骤,文中的操作在以太坊测试网络Sepolia上进行。
原理
首先,Chainlink在每个网络中都部署了一个智能合约,以Sepolia为例,该合约的地址为0x86EFBD0b6736Bed994962f9797049422A3A8E8Ad。其次,用户调用该合约的方法生成一个新的合约,正是这个新生成的合约根据我们配置的条件(条件在注册Upkeep时提供)来触发我们的智能合约,为了后文方便说明,我们把这个新生成的合约叫作“触发合约”。
准备工作
类似于以太坊智能合约执行时需要消耗GAS,“触发合约”执行任务时需要消耗一种叫作LINK的token,它是一个 ERC677 token,它继承了ERC20 token标准的功能,并允许token传输包含数据有效负载。在sepolia测试网络中你可以在这里获取到LINK和ETH。
步骤
创建&部署合约
以下是官方给出的的一个简单的累加器合约。
合约代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract Counter {
/**
* Public counter variable
*/
uint public counter;
constructor() {
counter = 0;
}
function updateCounter(uint updateAmount) external {
counter += updateAmount;
}
}
合约部署
在remix编译、部署合约时EVIRONMENT选择“Injected Provider-MetaMask",并将MetaMask切换到你需要部署的目标网络,我是在Sepolia网络测试,因此选择Sepolia网络。
部署完成后复制合约的地址,后面会用到。
注册Upkeep
类似于接入三方应用,你需要在Chainlink平台注册一个应用。由于文中我们是一个周期性执行的基于时间的合约,因此我们需要注册一个Automation APP。
注册流程比较简单,这里只强调比较重要的几处。不过需要注意的一点是,假如上面的合约没有认证,那么需要提供合约的ABI。
设置执行周期
此处的设置比较简单,类似于Linux系统中Crontab的设置 。不过需要注意的一点是,这里的时间使用的格林威治时间,因此我们在配置时需要减去时差。比如我写这篇文章前为了测试,设置的执行时间是每年的1月19日北京时间早上11:00~12:00每5分钟执行一次。
抵押LINK
前面我们提到过,智能合约的触发需要消耗LINK,因此你需要提前抵押一定数量的LINK,具体数量视执行任务的复杂度及执行次数定。
整个注册流程完成前你需要至少在MetaMask确认两次交易,一次是创建定时任务合约,一次是向合约抵押LINK。
注册完成后你就可以在平台看到你注册的应用。当然创建完成后也可以再次编辑。注:我注册时抵押了10LINK,由于我截图时应用已经触发过几次智能合约,因此余额小于10。
”点开应用“,你可以看到应用的详情及执行历史。
执行结果
如果合约认证过,那么我们可以通过区块链浏览器来方便的查看合约中状态变量的变化情况:
当然,如果我们的合约没有认证,我们也可以通过Remix来查看状态变量值的变化,以下是我不同时刻观察到的状态变量值。
结语
通过文章中描述的内容相信大家对预言机的工作流程可以有一个整体的认识,尤其对于一些刚入门预言机的朋友,希望可以帮助到有需要的朋友。如有疑问或建议,欢迎留言交流。