本文来源 Nervos 粉-邱飞旸,缘起于一场 Nervos 赞助的 Hackathon。感谢飞旸哦
邱飞旸私人博客:http://t.cn/EPuuaqa
本文主要定位给对区块链有必定了解的,可是对 Nervos AppChain 这一系列产品知之甚少,想要入门的用户。本文所使用的方法并非最快的搭建一个 Dapp 的方法,在公共测试链上搭建 Dapp 会更加快速,能够跳过 CITA 链搭建步骤,请参考官方 Demo: First Forever。html
本文主要依据 A Hands-on Tutorial on Building Your First DAPP with CITA (Nervos) 这篇博文作了一些补充,同时也参考了 Nervos AppChain 官方文档。前端
主要环境:node
Nervos Network 包含了 Nervos CKB (layer 1) 和 Nervos AppChain (layer 2)。引用 Nervos AppChain 官方文档的一句话介绍:webpack
「Nervos AppChain」是一套开源的应用公链解决方案。git
官方文档种已经包含了各类系列工具的介绍。本教程主要利用如下工具构建一个麻雀虽小,五脏俱全的 Dapp。github
这五种产品的关系以下:web
首先,咱们须要获取 CITA,CITA 是 AppChain 客户端,目前仅支持联盟链。CITA 是 Nervos AppChain 工具链的核心。获取本地可用的 CITA 链有两种方式:从源码编译或者直接使用发布包。docker
因为官方文档已经阐述十分详细,本章不做过多赘述,请参考 CITA - 编译 CITA。数据库
可在 CITA 正式发布版本处找到目前全部已经发布的版本。一般选择 cita_secp256k1_sha3.tar.gz
版本下载npm
请参考 CITA - 部署CITA。
在本文中,将配置四个节点,而且使用 charge
经济模型(具体说明见 CITA - config_tool的功能和用法)。若是不配置经济模型,在建立链的时候默认就是 quota
。quota
模型下链上没有原生 Token,交易也不消耗 Token,而 charge
模型就和平时咱们使用 Ethereum 的体验基本一致了。
在使用 create_cita_config.py
工具进行节点配置的时候,应当同时指定配置参数。脚本以下:
1 2 3 4 5 6 7 8 复制代码 |
./env.sh ./scripts/create_cita_config.py create \ --chain_name test-chain \ --jsonrpc_port 1337 \ --ws_port 4337 \ --grpc_port 5000 \ --nodes "127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002,127.0.0.1:4003" \ --contract_arguments "SysConfig.chainId=2" \ "SysConfig.economicalModel=1" 复制代码 |
后面须要用到的是 jsonrpc_port
,因为咱们是在本地搭链,配置了四个节点,因此 JSON-RPC
地址应分别为
1 2 3 4 复制代码 |
http://127.0.0.1:1337 http://127.0.0.1:1338 http://127.0.0.1:1339 http://127.0.0.1:1340 复制代码 |
部署合约和发起交易时任选一个地址链接便可。
参见 CITA - 验证。
使用 cita-cli
首先应安装 rust
和 cargo
。能够参见 Rust 程序设计语言 - 安装。
而后安装 cita-cli
:
1 2 3 复制代码 |
git clone https://github.com/cryptape/cita-cli.git cd cita-cli/cita-cli cargo install 复制代码 |
而后能够运行 ~/.cargo/bin/cita-cli
或者进入 cita-cli/cita-cli
运行 cargo run
命令。运行界面以下:
1 2 3 4 5 6 复制代码 |
# default is http://127.0.0.1:1337 # the following is a test chain provided by nervos cita> switch --host http://121.196.200.225:1337 cita> rpc blockNumber ... cita> exit 复制代码 |
命令参见 CITA JSON-RPC。
节点没法启动。
在 cita
根目录下键入
1 2 复制代码 |
cd <YOUR_CHAIN_NAME>/0/logs 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 2 复制代码 |
docker ps # 查看目前运行的docker容器 docker stop <CONTAINER_ID> # 结束掉和CITA有关的全部容器 复制代码 |
而后查看是否还有 RabbitMQ
服务,
1 复制代码 |
ps -aux | grep rabbitmq 复制代码 |
若是有的话用 kill -9
结束掉进程。还能够使用 systemd
查看是否有 RabbitMQ
服务被注册:
1 复制代码 |
sudo systemctl status rabbitmq-server 复制代码 |
若是有的话,用户可自行决定是否关闭自启动。
此时,再从新执行配置操做:
1 2 3 4 复制代码 |
./env.sh ./bin/cita setup test-chain/0 ./env.sh ./bin/cita setup test-chain/1 ./env.sh ./bin/cita setup test-chain/2 ./env.sh ./bin/cita setup test-chain/3 复制代码 |
而后启动节点便可。
本文按照官方 Demo: First Forever 进行部署。具体步骤再也不赘述,只是指出几个注意事项。
部署合约须要用到公私钥对,而且在咱们 charge
经济模型下(刚刚说过)只有超级管理员和节点的地址才有余额发布合约。
若是在前文配置节点的时候没有配置超级管理员,那么默认的超级管理员的地址和私钥为:
详情参考 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
,请使用 1 复制代码 |
solc --optimize --abi --bin <YOUR_CONTRACT_1> 复制代码 |
可是要确保 YOUR_CONTRACT_2
和 YOUR_CONTRACT_1
位于同一目录或者 YOUR_CONTRACT_1
所在目录的子目录,不然,应当使用 --allow-paths
参数指定 YOUR_CONTRACT_2
所在目录。
这一步能够使用 nervos.js
在web网页中调用合约方法,参考 Demo First Forever 和 @nervos/chain 文档。
Microscope 是专门为 Nervos AppChain 设计的区块浏览器,使用它能够看到任意给定链的块和交易的详细信息。
ReBirth 是基于 PostgreSQL 的一个缓存服务器,Microscope 中的某些功能,例如列出最近10笔交易,必须使用ReBirth。
咱们将使用 Microscope + ReBirth 组合搭建区块链浏览器。
1. 下载 Microscope 的 Github 仓库
1 复制代码 |
git clone https://github.com/cryptape/Microscope/ 复制代码 |
2. 安装仓库依赖
1 复制代码 |
yarn install 复制代码 |
没有 yarn
的能够利用 npm i yarn -g
来安装。Ubuntu 用户能够经过下列命令安装 node
和 npm
:
1 2 3 复制代码 |
sudo apt-get install npm npm i n -g n latest 复制代码 |
3. 生成 DLL 包
1 复制代码 |
yarn run dll 复制代码 |
4. 添加配置文件
1 复制代码 |
cp ./.env.example ./.env 复制代码 |
5. 修改配置文件
打开 .env
,默认配置以下:
1 2 3 4 5 6 7 复制代码 |
# public content server 地址 PUBLIC=localhost:8082 # 默认 AppChain JSON-RPC 地址,就使用刚刚配置好的节点RPC地址便可 CHAIN_SERVERS=http://47.96.231.19:4000 # 区块浏览器名称 APP_NAME=Microscope LNGS=zh,en,ja-JP,ko,de,it,fr 复制代码 |
本文使用的配置以下:
1 2 3 4 5 复制代码 |
# https://cdn.cryptape.com/ 是Nervos官方的CDN PUBLIC=https://cdn.cryptape.com/ CHAIN_SERVERS=http://127.0.0.1:1337/ APP_NAME=Microscope 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/
,能够看见以下图所示,最近交易列表没法显示:
更多信息请参考 Mircroscope 文档。
1. 设置配置文件
配置文件是 re-birth
根目录下的 .env
,通常应当另建一个 .env.local
文件,本文咱们直接修改 .env
,将 CITA_URL
字段设为 http://127.0.0.1:1337/
2. 运行 ReBirth
1 2 3 4 复制代码 |
git clone https://github.com/cryptape/re-birth.git cd re-birth make setup # 第一次运行使用这个命令 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/
,点击以下图红框所示按钮:
在如图所示 Other Chain
处键入刚刚设置好的 ReBirth 缓存服务器地址 http://localhost:8888
:
能够发现浏览器的功能变得全面:
[1] Dex Hunter. (2018, September 4). Dex Hunter blog. A hands-on tutorial on building your first DAPP with CITA (Nervos). Retrieved September 19, 2018, from https://dexhunter.github.io/tutorial/2018/09/04/tutorial-on-cita.html