区块广播:

DAPP 网络使用攻略之一:如何使用 Zeus 和 vRAM

LiquidApps船员发布在 区块链社区
 632  1


正在阅读本文的你,很可能已经听说过 DAPP 网络, DAPP 网络提供了 vRAM和其他类型的服务,帮助开发者创建新一代可扩展、易使用的 dApp。

从本篇开始的 DAPP 网络使用攻略系列文章中,在我们的引导下,你能够在 dApp 之中使用 DAPP 网络的服务,为你的应用增添诸多强大功能,在 DAPP 网络出现之前,这些功能之前是无法以去中心化方式获得的。

开发者可以在 DAPP 网络的自由市场上选择由 DAPP 服务提供商(简称为 DSP)所提供的服务包,为了方便开发者, LiquidApps 还提供了 Zeus SDK 开发工具箱, 可以让你的 dApp 使用 DAPP 网络上的服务更加便捷。

DAPP 网络目前部署在 EOS 主网之上,在撰写本文时,有 13 个不同的 DSP 提供了总计 34 种服务包,其中,大部分属于 vRAM 类型的服务。

DAPP 网络中提供了大量的服务,为了方便开发者们理解,我们写下了这一系列文章,用于解释如何使用 DAPP 网络提供的丰富多样的功能:例如,网络和跨链预言机服务(LiquidOracles), CRON 任务排程服务(LiquidScheduler), 随机数生成,虚拟账号 (LiquidAccounts),以及 vRAM 服务(https://liquidapps.io/vRam) 等。

为了更好的使用这些服务,我们需要先了解基础工具的使用方法:如何使用 Zeus SDK 。

Zeus SDK 是一个使用简单、扩展性强的开发框架,允许 dApp 开发人员只需添加最少量的智能合约代码就能使用 DAPP 网络的产品和功能。

注意:本攻略中会包含大量终端命令,适合开发者阅读。 $ 符号是指示下一个命令的开始位置,请不要在每行的开头输入或复制/粘贴该符号。

设置和使用 NVM

如果你已经配置好了 NVM,本部分可以跳过。

NVM 是 Node 版本管理器,用作 Node.js 的开发版本管理。如果你还没有安装,建议你先安装配置该软件,NVM 可以帮助你很方便的使用和切换 node 版本。

备注: 不建议在 Mac 上使用 Homebrew install 的方式安装 NVM.

如果你在 MacOS 上开发,在如下步骤中,可能会提示您安装 Xcode 命令行工具。

使用 Zeus SDK,推荐使用 10.x 的 Node.js 版本(目前是 10.15.3)。切换方式如下:

$ nvm install 10.x
$ nvm use 10.x
$ nvm install-latest-npm

在 Linux 上安装 Zeus 依赖环境

在 Linux 上, 你可能需要安装一些依赖程序:

Ubuntu/Debian:

$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test$ sudo apt update
$ sudo apt upgrade -y libstdc++6
$ sudo apt install -y make cmake build-essential python

Centos/Fedora/AWS Linux:

$ sudo yum install -y make cmake3 python git gcc-c++ wget
$ export CMAKE_PREFIX_PATH=/usr/opt/eosio.cdt/1.6.1/lib/cmake/eosio.cdt

Centos / Fedora附加命令:

$ wget https://github.com/Kitware/CMake/releases/download/v3.14.3/cmake-3.14.3.tar.gz
$ tar xvfx cmake-3.14.3.tar.gz$ cd cmake-3.14.3
$ ./bootstrap
$ gmake
$ sudo make install
$ cd ..

安装和部署Zeus

安装 Zeus 时,如果使用 -g 标志,会全局安装:

$ npm install -g @liquidapps/zeus-cmd

不过,即使 Zeus 是全局安装的方式,也只有 zeus unbox 命令可以在全局范围内使用。

诸如 zeus test, zeus migrate 和 zeus compile 类的命令属于扩展类型,只会在通过 zeus unbox 的命令所得到的解包的文件夹之中,这些命令才会生效。

Zeus 安装完成后,可以解包 Helloworld 合约进行测试,确保一切正常。

创建或选择一个用于存在解包之后的文件夹,然后运行如下命令:

**$** zeus unbox helloworld
**$** cd helloworld
**$** zeus test

执行 zeus unbox 操作,会在 helloworld 文件夹之中,创建许多文件和文件夹,并产生 zeus-box.json 文件。


Zeus SDK 之中,自带了许多其他的示例,可以通过如下命令查看:

zeus list-boxes

例如展示如何使用 vRAM 的 “coldtoken”,以及deepfreezevgrabcardgame, 和 registry等,还包括了microauctions(微拍卖)eos-detective-reports(EOS 侦探报告), token (用于部署标准 eosio.token 合约而创建) 等更多的例子。

用于展示新增服务类型 的一些参考合约,也包含在 Zeus 的列表之中。


将 vRAM 添加到智能合约之中

现在,Zeus SDK 已经设置好,接下来,就可以将它用于我们的 EOSIO 开发工作之中。

首先,我们看看如何为元素之战教程添加vRAM

作为参考,你也可以获取完整的元素之战教程的全部代码,这个版本由 BlockOne 提供,不包含 vRAM: https://github.com/EOSIO/eosio-card-game-repo/tree/lesson-8

运行 zeus unbox cardgame 命令,可以获得 vRAM 版本的元素之战代码。

请注意:由于网络原因,中国用户使用 zeus unbox 命令获取相关代码时可能会需要较长时间,请耐心等待

假设你还在 helloworld 文件夹中:

cd ../
$ zeus unbox cardgame
$ cd cardgame

zeus unbox 输出的最后一部分提供了一些有用的指导,告诉我们下一步做些什么:

(OUTPUT)
Enter new directory:
 cd cardgame
Please try these sample commands:
 ?Deploy contract: zeus migrate
 ?Run frontend locally: zeus run frontend main
 ?Build frontend: zeus build frontend main
 ?Deploy frontend: zeus deploy frontend main
 ?Deploy and register frontend: zeus deploy frontend main — ipfs — register cardgame1111

解释下上述内容:

(OUTPUT)
输入新文件夹名称:
 cd cardgame
尝试如下示例命令:
 ?部署合约: zeus migrate
 ?本地运行前端功能: zeus run frontend main
 ?创建前端: zeus build frontend main
 ?前端部署: zeus deploy frontend main
 ?部署和注册前端: zeus deploy frontend main — ipfs — register cardgame1111

运行命令, 将开始编译并迁移合约,然后打开前端(localhost:3015):

$ zeus migrate && zeus run frontend main

如何为合约启用 vRAM

要了解如何将此合约转换为启用 vRAM 的合约,需先来看看 cardgame.hpp 这一文件。

添加 vRAM 的话,我们的cardgame.cppgameplay.cpp文件甚至不用更改,只需要更改 cardgame.hpp 文件中的代码即可。

请注意: 解压之后的 cardgame 合约之中,可能包含一些额外的特征,我们在本教程之中并未提及,不用担心,在后面的攻略中,会对此加以介绍。

$ cd cardgame/contracts/eos/cardgame
$ nano cardgame.hpp

在文件之中,我们可以看到,添加 vRAM 遵循了许多简单的步骤。如果你不了解 EOS CDT 最近的一些更改,则会附上一些附注。

1) 首先,使用标准的 #include <eosio/eosio.hpp> 方式引入 EOSIO 头文件,然后,我们看到了导入 vRAM DAPP 服务所需的库,以及许多新的预处理器指令:

附注: 在 CDT 1.7 之前的版本以及原来的元素之战代码中,第一行代码并非 #include <eosio/eosio.hpp> 而是 #include <eosiolib/eosio.hpp>, 不过, #include <eosiolib/eosio.hpp> 这一方法已经弃用。

#include "../dappservices/multi_index.hpp"
#define DAPPSERVICES_ACTIONS() \
 XSIGNAL_DAPPSERVICE_ACTION \
 IPFS_DAPPSERVICE_ACTIONS
#define DAPPSERVICE_ACTIONS_COMMANDS() \
 IPFS_SVC_COMMANDS() 
#define CONTRACT_NAME() cardgame

如果我们需要其他服务,我们可以在此处引入。例如,如果此合约还需要Oracle 预言机服务

·/* ORACLES EXAMPLE ONLY NOT FOR VRAM */
#include "../dappservices/multi_index.hpp"
#include "../dappservices/oracle.hpp"
#define DAPPSERVICES_ACTIONS() \ XSIGNAL_DAPPSERVICE_ACTION \ IPFS_DAPPSERVICE_ACTIONS \ ORACLE_DAPPSERVICE_ACTIONS
#define DAPPSERVICE_ACTIONS_COMMANDS() \ IPFS_SVC_COMMANDS() \ ORACLE_SVC_COMMANDS()
#define CONTRACT_NAME() cardgame

我们将在后续文章中介绍如何使用 vRAM 之外的其他服务。

2 )在我们所有的指令(包括使用陈述)之后,我们告诉 Zeus 我们的合约可以开始:

CONTRACT_START()

3) 我们修改了“users” 数据表的类型,将其类型定义(typedef)修改为 dapp::multi_index 类型,在原始代码中,该数据表的类型为 eosio::multi_index。我们使用 dapp::multi_index 将其替换,就为 users 数据表启用了 vRAM 服务。这是合约中用于供许多对其惟一表 users_table _users 进行引用访问的一个表。

附注:name(“users”) 的表达方式和 “users”_n 等同。

typedef dapp::multi_index<name("users"), user_info> users_table;

4 )为了支持客户端查询,使用相同的user_info 结构体添加了一个新的 “.users” 表,以及一个现在由 shardbucket 结构体所定义的“users”表:

typedef eosio::multi_index<".users"_n, user_info> users_table_v_abi;
TABLE shardbucket { std::vector<char> shard_uri; uint64_t shard; uint64_t primary_key() const { return shard; } };
typedef eosio::multi_index<"users"_n, shardbucket> users_table_abi;

附注:在原始的元素之战示例程序的代码中, 使用了 struct[[eosio::table]] 代替 TABLE 。这些表达方式是等价的; TABLE 是一个宏,可以通过编译器转换为 struct[[eosio::table]] 。

5)最后,我们在文件末尾对 EOSIO_DISPATCH 的宏作略微修改,
这里,用到了 CONTRACT_END(),表示合约结束,与我们早些时候在文件开始部分所写的 CONTRACT_START() 相对应:

CONTRACT_END((login)(startgame)(playcard)(nextround)(endgame))

现在,Zeus 可以将我们的智能合约编译成支持 vRAM 的 dApp 了。 请注意,目前不支持用于 vRAM 上的二级索引。

和以前一样,我们现在可以将我们的合约部署到本地的测试网络上并使用本地的 DSP 提供服务,进行测试:

 zeus migrate && zeus run frontend main

想要了解更多信息,可以查看不断完善的LiquidApps 文档, ,如果有任何疑问,请加入我们的 Telegram 开发者频道

下一篇文章中,我们会介绍如何在麒麟测试网中部署 vRAM 版本的 dApp,如何抵押 DAPP 代币给 DAPP 服务商使用 vRAM 服务,以及如何在 EOS 主网部署应用。

  • 正序
  • 最新
只看帖主楼层直达
登录 账号发表你的看法,还没有账号?立即免费 注册