教程 | 手把手教你在本地构建Nervos AppChain全家桶

简介:

本文主要依据 A Hands-on Tutorial on Building Your First DAPP with CITA (Nervos) 这篇博文做了一些补充,同时也参考了 Nervos AppChain 官方文档。

主要环境:

 ●  CITA 0.18
 ●  Ubuntu 18.04

Nervos AppChain 全家桶简介

Nervos Network 包含了 Nervos CKB (layer 1) 和 Nervos AppChain (layer 2)。引用 Nervos AppChain 官方文档的一句话介绍:

「Nervos AppChain」是一套开源的应用公链解决方案。

官方文档种已经包含了各种系列工具的介绍。本教程主要利用以下工具构建一个麻雀虽小,五脏俱全的 Dapp:

 ●  CITA
 ●  ReBirth
 ●  Microscope
 ●  nervos.js
 ●  cita-cli

这五种产品的关系如下:

b47eb34c32a8823255adb07c166038e934355946

依赖

docker(安装方法请参考 CITA - 安装Docker)

获取 CITA

首先,我们需要获取 CITA,CITA 是 AppChain 客户端,目前仅支持联盟链。CITA 是 Nervos AppChain 工具链的核心。获取本地可用的 CITA 链有两种方式:从源码编译或者直接使用发布包。

 ●  从源码编译

由于官方文档已经阐述十分详细,本章不作过多赘述,请参考 CITA - 编译 CITA。

 ●  使用发布包

可在 CITA 正式发布版本 处找到目前所有已经发布的版本。通常选择cita_secp256k1_ sha3.tar.gz版本下载。

创建、配置并启动节点

请参考 CITA - 部署CITA。

在本文中,将配置四个节点,并且使用 charge 经济模型(具体说明见 CITA - config_tool 的功能和用法)。

如果不配置经济模型,在创建链的时候默认就是 quota 。 quota 模型下链上没有原生 Token ,交易也不消耗 Token ,而 charge 模型就和平时我们使用 Ethereum 的体验基本一致了。

在使用 create_cita_config.py 工具进行节点配置的时候,应当同时指定配置参数。脚本如下:

1 ./env.sh ./scripts/create_cita_config.py create \
2 --chain_name test-chain \
3 --jsonrpc_port 1337 \
4 --ws_port 4337 \
5 --grpc_port 5000 \
6 --nodes "127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002,127.0.0.1:4003" \
7 --contract_arguments "SysConfig.chainId=2" \
8 "SysConfig.economicalModel=1"

后面需要用到的是 jsonrpc_port ,由于我们是在本地搭链,配置了四个节点,所以 JSON-RPC 地址应分别为

1 http://127.0.0.1:1337

2 http://127.0.0.1:1338

3 http://127.0.0.1:1339

4 http://127.0.0.1:1340

部署合约和发起交易时任选一个地址连接即可。

检查本地链状态

 ●  直接使用 JSON-RPC

参见 CITA - 验证。

 ●  使用 cita-cli

使用 cita-cli 首先应安装 rust 和 cargo 。可以参见 Rust 程序设计语言 - 安装。

然后安装 cita-cli :

1 git clone https://github.com/cryptape/cita-cli.git

2 cd cita-cli/cita-cli

3 cargo install

然后可以运行 ~/.cargo/bin/cita-cli 或者进入 cita-cli/cita-cli 运行 cargo run 命令。运行界面如下:

1 # default is http://127.0.0.1:1337

2 # the following is a test chain provided by nervos

3 cita> switch--host http://121.196.200.225:1337

4 cita> rpc blockNumber ...

5 cita> exit

命令参见 CITA JSON-RPC。

 ●  可能的错误

节点无法启动。

在 cita 根目录下键入:

1 cd <YOUR_CHAIN_NAME>/0/logs
2 cat cita-network.log

cita-network.log 末尾打印出来的结果中有:

1 Thread main panicked at failed to open url amqp://guest:guest@localhost/test-chain/0 : Protocol("Connection reset by peer (os error 104)"), /opt/.cargo/git/checkouts/cita-common-1aad419f3e80ba17/67c715f/pubsub_rabbitmq/src/lib.rs:59

说明 RabbitMQ 服务没有启动起来,此时,需要检查一下是不是有其他的 rabbitmq 的进程,具体原因可以参见官方文档配置节点下的 Note。我们先结束掉 docker 容器,使用:

1 docker ps # 查看目前运行的docker容器
2 docker stop <CONTAINER_ID> # 结束掉和CITA有关的所有容器

然后查看是否还有 RabbitMQ 服务,

1 ps -aux | grep rabbitmq

如果有的话用 kill -9 结束掉进程。还可以使用 systemd 查看是否有 RabbitMQ 服务被注册:

1 sudo systemctl status rabbitmq-server

如果有的话,用户可自行决定是否关闭自启动。

此时,再重新执行配置操作:

1 ./env.sh ./bin/cita setup test-chain/0

2 ./env.sh ./bin/cita setup test-chain/1

3 ./env.sh ./bin/cita setup test-chain/2

4 ./env.sh ./bin/cita setup test-chain/3

然后启动节点即可。

部署合约

本文按照官方 Demo: First Forever 进行部署。具体步骤不再赘述,只是指出几个注意事项。

 ●  部署合约使用的地址和私钥

部署合约需要用到公私钥对,并且在我们 charge 经济模型下(刚刚说过)只有超级管理员和节点的地址才有余额发布合约。

如果在前文配置节点的时候没有配置超级管理员,那么默认的超级管理员的地址和私钥为:

 ●  address:

0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523

 ●  privkey:

5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6

详情参考 CITA - 系统合约。

节点的私钥存储在进行节点配置时生成的 test-chain 文件夹下的节点文件夹里面,文件名叫做 privkey 。节点地址在 test-chain 文件夹下的 template/init_data.yml 文件里面。

 ●  编译合约

单合约编译时, solcjs 与 solc 没有什么太大区别。当多合约编译的时候,这两个工具有些区别。

多合约编译时,假设 YOUR_CONTRACT_1 import 了 YOUR_CONTRACT_2 :

 ●  如果使用 solcjs ,请使用

1 solcjs --optimize --abi --bin <YOUR_CONTRACT_1> <YOUR_CONTRACT_2>

 ●  如果使用 solc ,请使用

2 solc --optimize --abi --bin <YOUR_CONTRACT_1>

但是要确保YOUR_CONTRACT_2和YOUR_ CONTRACT_1位于同一目录或者YOUR_CONTRACT_1所在目录的子目录,否则,应当使用 --allow-paths 参数指定YOUR_CONTRACT_2所在目录。

在Dapp中调用合约

这一步可以使用nervos.js在web网页中调用合约方法,参考Demo First Forever和@nervos/chain文档。

搭建区块浏览器

Microscope 是专门为 Nervos AppChain 设计的区块浏览器,使用它可以看到任意给定链的块和交易的详细信息。

ReBirth 是基于 PostgreSQL 的一个缓存服务器,Microscope 中的某些功能,例如列出最近10笔交易,必须使用ReBirth。

我们将使用 Microscope + ReBirth 组合搭建区块链浏览器。

 ●  使用 Microscope 搭建区块浏览器前端

1. 下载 Microscope 的 Github 仓库

1 git clone https://github.com/cryptape/Microscope/

2. 安装仓库依赖

1 yarn install

没有 yarn 的可以利用 npm i yarn -g 来安装。Ubuntu 用户可以通过下列命令安装 node 和 npm :

1 sudo apt-get install

2 npm npm i n -g

3 n latest

3. 生成 DLL 包

1 yarn run dll

4. 添加配置文件

1 cp ./.env.example ./.env

5. 修改配置文件

打开 .env ,默认配置如下:

1 # public content server 地址

2 PUBLIC=localhost:8082

3 # 默认 AppChain JSON-RPC 地址,就使用刚刚配置好的节点RPC地址即可

4 CHAIN_SERVERS=http://47.96.231.19:4000

5 # 区块浏览器名称

6 APP_NAME=Microscope

7 LNGS=zh,en,ja-JP,ko,de,it,fr

本文使用的配置如下:

1 # https://cdn.cryptape.com/ 是Nervos官方的CDN

2 PUBLIC=https://cdn.cryptape.com/

3 CHAIN_SERVERS=http://127.0.0.1:1337/

4 APP_NAME=Microscope

5 LNGS=zh,en,ja-JP,ko,de,it,fr

6. 开发模式运行服务器

1 yarn start

其中一行输出如下:

1 Project is running at http://localhost:8080/

然后等待 webpack 打包,时间可能会比较长。之后看到如下输出:

1 webpack: Compiled successfully.

说明服务器已经成功运行。

在浏览器中键入 http://localhost:8080/,可以看见如下图所示,最近交易列表无法显示:

98e27cbe53b4f4b86ea45acc13035cfeb1ca9eb2

更多信息请参考 Mircroscope 文档。

 ●  使用 ReBirth 提供缓存数据库服务

1. 设置配置文件

配置文件是 re-birth 根目录下的 .env ,一般应当另建一个 .env.local 文件,本文我们直接修改 .env ,将 CITA_URL 字段设为 http://127.0.0.1:1337/

2. 运行 ReBirth

1 git clone https://github.com/cryptape/re-birth.git

2 cd re-birth

3 make setup # 第一次运行使用这个命令

4 make up # 开启 docker daemon

命令会自动拉取 docker 镜像并运行容器,默认运行的地址为 http://localhost:8888 。

输入docker ps,应该可以看见至少有 4 个容器在运行,分别为re-birth_web,re-birth_web,re-birth_web和一个PostgreSQL的容器。

更多信息请参考 ReBirth 文档。

3. 重新配置 Microscope

在浏览器中键入http://localhost:8080/,点击如下图红框所示按钮:

079e8f2f2a5d7700f268603f7e8b582baf1e09d2

在如图所示Other Chain处键入刚刚设置好的ReBirth缓存服务器地址:

http://localhost:8888

12e1041f5421bd509bbd7a05743d2cdf91dd6331

可以发现浏览器的功能变得全面:

5d75a1a6e481e0063a9f3c3f58021496780c5c96


原文发布时间为:2018-10-16
本文来自云栖社区合作伙伴“ 数据派THU”,了解相关信息可以关注“ 数据派THU”。
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 前端开发 JavaScript
NG全家桶全栈项目实践总结
Angular在国内使用的人并不像国外那么多,基本都是外企在用,但其框架的思想却仍可以为我们所借鉴,在某些问题没有思路的时候可以参考ng相关的处理,ng处理方式和思维确实比较超前,但也因此而曲高和寡。本文旨在通过ng全家桶项目(前端Angular10 + 后端NestJS7)的实践来总结对于ng架构中一些亮点的关注与思考,Angular和Nest在前后端框架的处理上同出一脉,对比起来更有借鉴意义。
174 0
|
安全 测试技术
Fiddler入门教程全家桶,建议收藏
Fiddler入门教程全家桶,建议收藏
145 1
|
XML SpringCloudAlibaba Java
“阿里爸爸”又爆新作!Github新开源303页Spring全家桶高级笔记
Spring全家桶 不知道各位Java好大哥们闲的时候会不会去关注Spring目前的官网,你会发现他的slogan是: Spring makes Java Simple。它让Java的开发变得更加简单。某种意义上来说:是Spring成就了Java!但随之而来的就是:由他之后诞生出来的各种组件;SpringBoot,SpringCloud,SpringSecurity啥的都成了我们Java程序员必须要掌握的技能;每次面试也都是必问。
|
Java 程序员 Spring
真香!阿里最新公开的200页Spring全家桶进阶指南及视频汇总
在哪里,对自己的技术水平和能力认知也很清晰,都很迫切想要学习提高,奈何自己盲目学习的过程很费力,效果也不佳,遇到好些困难和阻碍。 比如大部分正在学Spring的程序员兄弟们就反馈: 虽然Spring全家桶的官方文档很全面,但面对庞杂的知识体系,很多兄弟不知从何下手 市面上Spring全家桶的书籍很多,但平铺直叙的风格很难让人快速抓住重点 网上分析Spring全家桶源码的文章也有,但太分散,都是围绕几个常见知识点“炒冷饭”,不成体系 想要深度掌握单个框架或组件已经很难,还要将Spring全家桶整体结合到一起理解学习就更难了 这样的反馈实在太多了,Spring又确实是面试和工作都绕不开
338 0
|
域名解析 缓存 网络协议
IP 基础知识“全家桶”,45 张图一套带走
共分为三道菜: 首先是前菜 「 IP 基本认识 」 其次是主菜 「IP 地址的基础知识」 最后是点心 「IP 协议相关技术」
IP 基础知识“全家桶”,45 张图一套带走
|
消息中间件 NoSQL Java
3天带你走向实战!阿里顶配版Spring全家桶面试进阶笔记有多强?
Spring框架自从诞生以来就一直备受开发者青睐,它涵盖了Spring、Springboot、SpringCloud等诸多解决方案,一般我们都会统称为Spring全家桶!出于Spring框架在Java开发者心中中的统治地位,所以不管是面试还是工作,Spring都是绕不开的重点也是难点! 关于Spring的描述网上的博客数不胜数,其家族所有成员想必大家也在很多的网站跟博客平台都看过了,今天LZ也就不过多的赘述了,就主要跟大家来聊聊最近大家面试被问的比较多的几个。我去看了一下后台大概统计了一下,粉丝们给我的反馈是出去面试被问的最多的就是Spring源码,SpringBoot跟SpringClou
|
前端开发 JavaScript API
分享 15 个 Vue3 全家桶开发的避坑经验 下
分享 15 个 Vue3 全家桶开发的避坑经验 下
939 0
|
JavaScript 编译器 API
分享 15 个 Vue3 全家桶开发的避坑经验 上
分享 15 个 Vue3 全家桶开发的避坑经验 上
506 0
存储 缓存 JavaScript
194 0