“智能合约”的名称并不完全相同。尽管名称中有“art”一词,但以太坊上的智能合约并不是完全自动化的。智能合约代码的运行需要外力触发。换句话说,我们需要通过一些外部流程来触发智能合约。
在本文中,我们将通过构建可行的解决方案来解决这个问题
为什么需要链下智能合约的自动化
智能合约自动化的用例
如何利用无服务器架构部署无服务器功能
**,我们将介绍serverless ETHers,一个功能齐全的智能合约自动化服务,可以在部署后直接使用。基于此服务,我们可以定制智能合约自动化项目,以满足我们自己的需求。
问题是:它被称为智能合约,但不能自动执行
假设我们想要实现一个智能合约,它可以每小时自动执行一次。怎么做?
现实是:根本做不到。单靠可靠的智能合约是做不到这一点的。虽然被称为“智能合约”,但以太坊的智能合约无法自动执行。我们需要调用智能合约,在外部资源(人或机器)的帮助下执行其代码。
**的合同可以在不同的任务之间插入一个小的时间区间,例如:
函数runMe()public{require(阻止时间戳;gt;=lastTriggeredAt+1小时);…}
上面的“require()”语句确保两次执行之间至少有一个小时。但是,在代码正常运行之前,仍然需要在开始时手动触发智能合约。
我们来谈谈“自动电子执行”
从技术上讲,有些操作可以使用函数修饰符自动执行。例如,复合治理的薪酬分配。一旦将其所有的资产转移到comp.001或comp.001地址,就会自动将其转移到comp.001地址。
我们可以在函数修饰符中实现上述逻辑,把修饰符放在函数前面,在函数被调用时自动执行逻辑。额外费用由来电者支付。
然而,并不是所有的智能合约系统都能采用这种方法。由于这些改性剂只能在特定条件下运行,因此会导致意外的天然气成本。同时,用户可随意收取额外的GAS FEE,实现合同的“余额”
而且,代码还需要人工调用智能合约才能实现。
智能合约自动化的常见用例
DeFi协议依赖于某种链外智能合约自动化。Makerdao依靠第三方来监控债务头寸的抵押品覆盖率,并在担保头寸不足的情况下进行清算。其他DeFi协议也有类似的要求。
链下智能合约自动化有两种常见的用例
自动触发:在特定情况下执行合同。
状态和事件监视:了解合同何时具有特定状态。
1自动触发器
我们经常需要定期或在特定条件下执行合同,例如:
定期恢复余额池
在Dao/治理过程中进行近距离投票
按比例支付证券代币股息
2状态和事件监视
有时我们需要知道合同是否满足某些条件,例如:
了解智能合约的价值是否发生了变化
获取所有访问限制更改的通知
了解何时发布特定的智能合约事件
解决方案:没有服务器功能?
事实上,serverless特性正好适合上面提到的用例。在没有服务器的情况下,我们不需要在部署代码之前预先配置任何东西,在这之后,我们不需要担心管理,这大大简化了问题的解决方案。
快速入门:无服务器框架,无服务器
serverless框架为我们提供了开发、部署、监视和保护serverless应用程序所需的一切。让我们看看如何以最简单的方式完成开发。
gt;npm安装-g无服务器gt;无服务器-vx.x.x
首先,让我们快速了解一下serverless框架是如何工作的。
零无服务器.yml
可以调用无服务器服务中的所有lambda函数和事件无服务器.yml在的配置文件中。此文件定义服务,包括函数和事件。
服务:无服务器以太网提供程序:名称:aws运行时:node12.x环境:链ID:3默认气体价格:6000000000函数:myFunc:handler:functions/myFunc.处理程序;事件:-日程安排:费率(2小时)
我们可以在function属性下定义serverless函数。在上述示例中:
我们有一个叫做myfunction的函数
handler属性指向包含要在函数中运行的代码的文件和模块
events属性指定要执行的函数的事件触发器
一个服务可以包含多个功能。
1功能
LAMBERVICES DA是一个独立的功能,与AWS的一个功能类似。作为部署在云中的一段代码,它通常用于执行单个作业。
//功能/myFunc.exports.handler;=异步函数(事件、上下文){///执行任何操作};
函数只是普通的函数,可以将事件对象作为有效负载。
2事件
事件是触发函数运行的事件。它属于每个功能。你可以设置无服务器.yml中的事件属性中。
我们可以使用定时事件触发器定期自动执行函数。例如,我们指定每2小时运行一次myfunc函数:
#serverless.yml函数:myFunc:处理程序:函数/myFunc.处理程序;事件:-日程安排:费率(2小时)
我们还可以使用cron调度表达式来指定调度
#无服务器.ymlevents:-日程安排:cron(0-12**;?*)UTC下午12点
如果使用AWS,则事件是AWS中可以启动AWS lambda函数的任何事件,例如:
AWS-API**HTTP端点请求(例如,restapi)
AWS S3 bucket上传(例如图片)
Cloudwatch计时器(例如,每5分钟一次)
AWS SNS主题(例如,信息)
等待
现在,这就够了。如果您想了解有关serverless框架的更多信息,请查看以下文件(https://www.serverless.com/framework/docs/?参考=hackernoon.com网站)
在了解了serverless框架的基础知识之后,让我们看看serverless ETHers服务。
什么是无服务器以太网
无服务器以太网是一种全功能的无服务器服务,可在部署后直接使用。
git克隆[email protected]:yosriady/无服务器-以太网.gitcd无服务器以太网虚拟机使用npm安装
我们可以将此项目作为构建自定义智能合约自动化的基础。AWS是预先配置好的,但它也适用于其他云提供商(如GCP、azure等)的修改。
无服务器以太网项目的结构如下:
├—合同/│⑾├—abis/│├;abis.公司│└-;地址.├—功能/│└——;执行└;无服务器.yml
Contracts/包含智能合约的ABI和地址。
Functions/包含实现业务逻辑的函数。
无服务器.yml描述服务配置。
接下来,我们将仔细研究每个部分。
合同范本
为了测试,我编写并部署了一个智能合约示例:
//SPDX许可证标识符:GPL-3.0pragma SOLidity^0.6.10;合同DummyStorage{event-Write(地址索引源,uint256值);uint内部函数getcurrentvalue();_currentValue}函数put(uint value)public{emitWrite(消息发送者,value);currentValue=值;
虚拟存储智能合约具有以下功能:
Get是一个只读函数,它反馈合同的当前值。
Put是一个写函数,用于更新契约的当前值。
示例合同已经过验证并在ropsten上运行。你可以用它来测试你自己的功能!
1智能合约ABIS
协定目录包含与函数交互的协定ABI。在示例项目中,它包含虚拟存储契约的ABI。
├—合同/│└├—abis/││└–;DummyStorage.on│;abis.公司│└-;地址.
我们可以将ABI看作是智能合约的通用API规范,类似于OpenAPI规范。我们需要用ABI调用contract函数。
ABI可以帮助我们导入合同结构和目录:
//功能/执行const{abis,地址};杜米冷杉;constDummyStorageAddress=;地址.dummy存储
这是我们将在下一个函数部分使用的内容。
2功能
exec函数使用以太网加载契约ABI并调用智能合约
//Initializecontractcontractnew以太.合同(DummyStorageAddress,DummyStorageABI,wallet,)//Call art-contract-function`put(uint)`constRANDOMINTEGER=;数学地板( 数学随机()100);///返回;从0到99const tx的随机整数=等待;合约.卖出(随机整数)
加载合同ABI和地址后,我们将获得以太.合同抽象的,包括get()和put()
在exec函数的示例中,我们用一个随机整数来调用它合约.卖出()。
三无服务器.yml
在运行exec函数之前,我们需要无服务器.yml中指定了多个环境变量
#无服务器.yml服务::无服务器以太网提供程序:名称:aws运行时:node12.x区域:ap-southeast-1超时:30环境:6000000000助记符:….SLACKHOOKURL:。。。
无服务器以太网使用以下环境变量:
默认天然气价格:写入交易时使用的默认天然气价格。
助记符:用于导出以太坊地址的12个助记符。如果您计划将数据写入以太坊,请确保它是由以太支付的。
SLACK_uhook_uurl:示例使用传入的webhook向SLACK发送消息。您可以从自己的slack仪表板获取此URL。(可选)
您可以从AWS lambda控制台更改已部署函数的环境变量。
注意:记住在构建过程中不要以纯文本形式存储密钥。当存储诸如助记符和API密钥之类的凭据时,请使用安全参数存储,如AWS secrets manager。由于每个项目的安全要求和设置不同,请根据实际情况确定密码存储方式。
本地操作
我们可以使用无服务器的cli命令在本地运行函数。
gt;无服务器调用本地-f执行启动…合同ABIs已加载其他钱包已加载合同已加载发送交易…:白色复选标记:已发送交易;https://ropsten.ETHerscan.io/tx/0x72204f0791a319b4e5f7eb54ad15ed666cfc1403b53DeFi40c9d60188b176383 completedtrue
部署到AWS
运行serverless deploy轻松实现部署
gt;无服务器部署:打包服务…无服务器:不包括开发依赖项…无服务器:正在创建堆栈…无服务器:正在检查堆栈创建进度……。无服务器:堆栈创建完成…无服务器:正在上载;CloudInformation文件到S3…无服务器:上载工件…无服务器:上载服务无服务器-以太网.zip;文件到S3;(2.95 MB)…无服务器:正在验证模板…无服务器:正在更新堆栈…无服务器:正在检查堆栈更新;进度…………………….无服务器:堆栈更新完成…服务信息服务:无服务器以太网阶段:devregion:ap-东南-1堆栈:无服务器以太网开发资源:8api键:非终结点:非功能:执行:无服务器以太网开发层:无服务器以太网开发层
现在,一个无服务器的功能完成了。我们可以使用它来自动化和监控智能合约,并且可以基于这个示例项目构建我们自己的智能合约自动化。
写在结尾
祝贺您学习以下内容:
为什么需要链下智能合约的自动化
智能合约自动化的用例
无服务器架构
如何运行无服务器以太网示例应用程序
添加:使用slack实现聊天
除了无服务器以太网,我们还可以通过posttoslack函数集成slack。
constsuccesessage=`:白色支票标记:已发送交易;https://ropsten.ETHerscan.io/tx/$`;wait;postToSlack(成功消息);
posttoslack函数利用slack conSOLe_uhook_uurl环境变量中的slack。设置完成后,只要事务发送成功,就会立即通知slack,放松监控功能。
补充:监控智能合约事件
到目前为止,我们只介绍了“自动触发”用例。我们如何监控智能合约的状态和事件?
我们可以使用V5的API定期监视特定事件。可以在函数中执行以下操作:
//给定以下事件://Event-Transfer(bytes32索引节点,地址所有者)///Get过滤器(第二个空值可以省略)const-filter=;合同.过滤器.传输(userAccount,null);///查询;filtERConst日志=;合同查询过滤器(filter,0,quot;latestquot;);///从块0到新块//打印出所有;值:logs.forEach((日志)=>{;控制台.log( 日志.args. 至;日志.args. 值);}
假设我们希望这个函数周期性地执行(比如每五分钟一次),我们还需要存储一个标记来跟踪函数自上次执行以来看到的**一个块。
这个智能合约在监控访问控制白名单时非常有用。通过事件监视功能,当新地址添加到白名单时,可以通知slack。
文章标题:如何建立一个无服务器智能合约自动化项目
文章链接:https://www.btchangqing.cn/102896.html
更新时间:2020年09月13日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。