天下财经网

怎么样构建无服务器智能合约智能化项目

资讯 2021-07-25 06:04163www.lmzzkj.com未知

“智能合约”这个名字其实并不确切。尽管名字中有“智能”二字,但 以太币ereum 上的智能合约并不可以全自动实行。智能合约代码的运行需要借用外力的触发。换句话说,大家需要通过一些外部步骤来触发智能合约。

在本文中,大家将通过构建可行的解决方法来解决该问题,认识一下:

· 为何需要链下智能合约智能化
· 智能合约智能化的用例
· 怎么样借用无服务器构造来部署无服务器功能

最后,大家还将介绍 serverless-ethers——全功能的智能合约智能化服务,部署后可直接用。大家可以以此服务为基础,构建符合自己需要的自概念智能合约智能化项目。

1. 问题是:名叫智能合约,却没办法自动实行

假设大家想要达成一个可以每小时自动实行一次的智能合约。要如何做呢?

现实就是:根本做不到。仅靠 Solidity 智能合约是做不到这一点的。尽管名叫“智能合约”,但 以太坊 中的智能合约并不可以自动实行,大家需要借用外部源(人或机器)来调用智能合约并实行其代码。

合约最多能做到的是:在不同任务间插入一小时间隔,比如:

function runMe public {
require;
...
}

以上“require”语句可确保两次实行至少间隔一小时。但,仍需要在开始时人为触发智能合约,然后代码才会正常运行。

2. 来谈一谈“自动e实行”

从技术层面上来看,有一些操作是可以用函数修改器来自动实行的。譬如说Compound Governance的COMP分配。一旦地址获得了0.001COMP,之后所有些Compound买卖(比如提供资产,或转移cToken)都会自动将COMP转到其钱包中。

大家可以在函数修改器中达成上述逻辑,将修改器放在函数前,并在调用函数时自动实行逻辑。由调用方来支付有关的附加成本。
然而,并非所有些智能合约系统都可以使用这种办法。因为这部分修改器只能在特定条件下运行,因此可能会致使出人预料的gas成本。同时,还可能会向用户随机收取额外的gas成本,以达成合约“平衡性”。

并且,代码的运行仍然需要通过人为调用智能合约才能达成。

3. 智能合约智能化的容易见到用例

去中心化的金融协议依靠于某种链下智能合约智能化。MakerDAO依靠第三方来监控债务头寸的抵押担保比率,并清算担保不足的头寸。其他的去中心化的金融协议也都有类似的需要。

在链下智能合约智能化方面,有两个容易见到用例:

· 自动触发器(Automated Triggers):在特定状况下实行合约。
· 状况和事件监控(State and Event Monitoring):知道合约在何时出现特定状况。

1. 自动触发器

大家常常需要按期、或在特定条件下实行合约,比如:

· 周期性地恢复平衡池
· 结束DAO/治理过程中的投票
· 按比率支付安全代币股息

2. 状况和事件监控

有时大家需要知道合约是不是满足了某些条件,比如:

· 知道智能合约的价值是不是发生了变化
· 获得所有准入限制更改的公告
· 知道何时发出特定的智能合约事件

4. 解决方法:无服务器函数?

事实上,无服务器功能刚好适用于上面提到的这几个用例。有了无服务器化,大家便不需要在部署代码之前预配任何东西,并且之后也无需费心管理,很大地简化了问题的解决方法。

5. 迅速入门:借用Serverless Framework来达成无服务器化

无服务器构造(Serverless Framework)为大家提供了开发、部署、监控和保护无服务器应用程序所需的所有内容。让大家一块儿看看怎么才能以最容易的方法完成开发吧。

> npm install -g serverless
> serverless -v
x.x.x

第一,大家来迅速认识一下Serverless Framework的运作方法。

0. serverless.yml

所有Serverless服务中的Lambda函数和事件都可以在名为serverless.yml的配置文件中找到。该文件对服务(包含Functions和Events)进行了概念。

service: serverless-ethers
provider:
name: aws
runtime: nodejs12.x
environment:
CH人工智能N_ID: 3
DEFAULT_GAS_PRICE: 60000000000

functions:
myFunc:
handler: functions/myFunc.handler
events:
- schedule: rate

大家可以在function属性下,对无服务器函数进行概念。在上面的例子中:

· 大家有名为myFunc的Function
· handler属性指向包含你想在函数中运行的代码的文件和模块
· events属性为要实行的函数指定Event触发器

一个服务中可以包含多个函数。

1.Functions

Function是AWS Lambda函数,是一个像微服务的独立部署单元。作为一段部署在云中的代码,一般被用于实行单个作业。
// functions/myFunc.js
exports.handler = async function {
// Do anything
};

Functions只不过一般的JS函数,可以将事件对象作为有效负载。

2. Events

Events是触发函数运行的事件,隶是每一个Function,可以在serverless.yml中的事件属性中找到。
大家可以用Scheduled Events触发器来按期自动实行函数。比如,大家指定每2小时运行一次myFunc函数:

# serverless.yml

functions:
myFunc:
handler: functions/myFunc.handler
events:
- schedule: rate

大家还可以借用cron schedule expression来指定安排计划

# serverless.yml

events:
- schedule: cron # 12PM UTC

假如你用的是AWS的话,事件即为AWS中可以出发AWS Lambda函数的任意事件,譬如:

· AWS API Gateway HTTP端点请求(比如,REST API)
· AWS S3存储桶上传(比如,图像)
· CloudWatch计时器(比如,每5分钟运行一次)
· AWS SNS主题(比如,信息)
· 等等……

就现在而言,知晓这部分已经足够。假如还想知道更多关于Serverless framework的内容的话,可以看一下这个文件(https://www.serverless.com/framework/docs/?ref=hackernoon.com)

在知道了Serverless Framework的入门知识后,大家来看一看serverless-ethers服务吧。

6. serverless-ethers是什么

serverless-ethers是一个全功能Serverless服务,部署后即可直接用。
git clonegit@github.com:yosriady/serverless-ethers.git
cd serverless-ethers
nvm use
npm install

大家可以将此项目作为构建自概念智能合约智能化的基础。其预先配置的是AWS,但修改后也适用于其他云提供商(如GCP、Azure等)。
serverless-ethers项目的结构如下:

├── contracts/
│ ├── abis/
│ ├── abis.js
│ └── addresses.js
├── functions/
│ └── exec.js
└── serverless.yml

· contracts/包含智能合约ABI和地址。
· functions/包含达成业务逻辑的JS函数。
· serverless.yml描述服务配置。

下面,大家将深入认识一下各个部分。

7. 合约样本示例

为了进行测试,我撰写并部署了一个智能合约示例:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.6.10;

contract DummyStorage {
event Write;

uint internal _currentValue;

function get public view returns {
return _currentValue;
}

function put public {
emit Write;
_currentValue = value;

该DummyStorage智能合约具备以下功能:

get是一个能反馈合约目前值的只读函数。
put是一个用于更新合约目前值的写入函数。

该示例合约已经过验证并在Ropsten上运行。大伙可以用它来测试我们的函数!

1. 智能合约ABIs

合约目录中包含与函数交互的合约ABIs。在示例项目中,它包含DummyStorage合约的ABI。

├── contracts/
│ ├── abis/
│ │└── DummyStorage.json
│ ├── abis.js
│ └── addresses.js

大家可以将ABI看作是智能合约的公共API规范,像OpenAPI规范。大家需要用ABI来调用合约函数。
合约/目录结构能帮助大家导入合约ABI和地址:

// functions/exec.js

const { abis, addresses } = require;

const DummyStorageABI = abis.DummyStorage;
const DummyStorageAddress = addresses.DummyStorage

这都是大家在下面的函数部分中将要用到的。

2. Functions

exec函数借助ETHs来加载合约ABI并调用智能合约:

// Initialize contract
const contract = new ethers.Contract

// Call smart contract function `put`
const RANDOM_INTEGER = Math.floor * 100); // returns a random integer from 0 to 99
const tx = await contract.put

加载合约ABI和地址后,大家将得到一个拥有智能合约所有函数的ethers.Contract抽象,包括get和put.

在示例exec函数中,大家用一个随机整数来调用contract.put。

3. serverless.yml

在运行exec函数之前,大家需要在serverless.yml中指定几个环境变量:

# serverless.yml

service: serverless-ethers
provider:
name: aws
runtime: nodejs12.x
region: ap-southeast-1
timeout: 30
environment:
DEFAULT_GAS_PRICE: 60000000000
MNEMONIC: ...
SLACK_HOOK_URL: ...

serverless-ethers用了以下环境变量:

· DEFAULT_GAS_PRICE:事务写入时用的默认gas价格。
· MNEMONIC:用于导出以太坊地址的12个助记词。假如计划将数据写入以太坊的话,要确保确保其由ETH进行支付。
· SLACK_HOOK_URL:示例中用Incoming Webhooks向Slack发送消息。你可以从我们的Slack仪表板上获得此URL。

你可以从AWS Lambda控制台更改已部署函数的环境变量。

注意:切记不要在构建过程中用明文存储密钥。在存储助记词和API密钥等凭证时,要用安全的参数存储,如AWS Secrets Manager。由于每一个项目的安全需要和设置不同,所以请依据自己实质状况来决定密码存储方法。

8. 当地运行

大家可以用无服务器CLI命令在当地运行函数。

> serverless invoke local -f exec
Starting...
Contract ABIs loaded
ETHs wallet loaded
Contract loaded
Sending transaction...
:white_check_mark: Transaction sent https://ropsten.etherscan.io/tx/0x72204f07911a319b4e5f7eb54ad15ed666cfc1403b53def40c9d60188b176383
Completed
True

9. 部署到AWS

运行serverless deploy即可轻松达成部署:

> serverless deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
........
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service serverless-ethers.zip file to S3 ...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.....................
Serverless: Stack update finished...
Service Information
service: serverless-ethers
stage: dev
region: ap-southeast-1
stack: serverless-ethers-dev
resources: 8
api keys:
None
endpoints:
None
functions:
exec: serverless-ethers-dev-exec
layers:
None

目前,一个无服务器函数就完成了,大家可以用它来对智能合约进行智能化和监控,并且可以在这个示例项目的基础上构建是我们的智能合约智能化。

10. 写在最后

祝贺你掌握了以下内容:

· 为何需要链下智能合约智能化
· 智能合约智能化的用例
· Serverless构造
· serverless-ethers示例应用程序的运行原理

11. 补充:用Slack 达成ChatOps

除去serverless-ethers,大家还可以通过postToSlack函数来集成Slack。

const successMessage = `:white_check_mark: Transaction sent https://ropsten.etherscan.io/tx/${tx.hash}`;
await postToSlack;

postToSlack函数借助了你从Slack console获得的SLACK_HOOK_URL环境变量。设置完成后,只须买卖成功发送,就会立刻公告Slack,轻轻松松监控函数。

12. 补充:监控智能合约事件

截至现在,大家只介绍了“自动触发”用例,那要如何监控智能合约状况和事件呢?

大家可以用ETHs v5 Events API来按期监控特定事件。可以在函数中实行以下操作:

// Given the following Event:
// event Transfer

// Get the filter
const filter = contract.filters.Transfer;

// Query the filter
const logs = contract.queryFilter; // from block 0 to latest block

// Print out all the values:
logs.forEach => {
console.log;
}

假设大家期望让这个函数周期性实行(比如每5分钟一次),还需要存储一个标记,对该函数自上次实行后所看到的最后一个块进行跟踪。

该智能合约在监控Access Control白名单时很有用。有了事件监控功能,可以在白名单中添加新地址时公告Slack。

出处: 区块链大本营 作者:Yos Riady

天下财经网-专业金融|投资|区块链|财经资讯门户网站 Copyright © 2002-2021 天下财经网 (http://www.jmyiwangtong.com) 网站地图 TAG标签 备案号