手把手教你在本地構建 Nervos AppChain 全家桶

NervosNetwork發表於2018-09-29
本文來源 Nervos 粉-邱飛暘,緣起於一場 Nervos 贊助的 Hackathon。感謝飛暘哦
邱飛暘私人部落格:http://t.cn/EPuuaqa

本文主要定位給對區塊鏈有一定了解的,但是對 Nervos AppChain 這一系列產品知之甚少,想要入門的使用者。本文所使用的方法並不是最快的搭建一個 Dapp 的方法,在公共測試鏈上搭建 Dapp 會更加快速,可以跳過 CITA 鏈搭建步驟,請參考官方 Demo: First Forever

本文主要依據 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

這五種產品的關係如下:

手把手教你在本地構建 Nervos AppChain 全家桶



依賴

獲取 CITA

首先,我們需要獲取 CITA,CITA 是 AppChain 客戶端,目前僅支援聯盟鏈。CITA 是 Nervos AppChain 工具鏈的核心。獲取本地可用的 CITA 鏈有兩種方式:從原始碼編譯或者直接使用釋出包。

從原始碼編譯

由於官方文件已經闡述十分詳細,本章不作過多贅述,請參考 CITA - 編譯 CITA

使用釋出包

可在 CITA 正式釋出版本處找到目前所有已經發布的版本。通常選擇 cita_secp256k1_sha3.tar.gz 版本下載

建立、配置並啟動節點

請參考 CITA - 部署CITA

在本文中,將配置四個節點,並且使用 charge 經濟模型(具體說明見 CITA - config_tool的功能和用法)。如果不配置經濟模型,在建立鏈的時候預設就是 quotaquota 模型下鏈上沒有原生 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
複製程式碼

部署合約和發起交易時任選一個地址連線即可。

檢查本地鏈狀態

直接使用 JSON-RPC

參見 CITA - 驗證

使用 cita-cli

使用 cita-cli 首先應安裝 rustcargo。可以參見 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 經濟模型下(剛剛說過)只有超級管理員和節點的地址才有餘額釋出合約。

如果在前文配置節點的時候沒有配置超級管理員,那麼預設的超級管理員的地址和私鑰為:

  • address: 0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523
  • privkey: 5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6

詳情參考 CITA - 系統合約

節點的私鑰儲存在進行節點配置時生成的 test-chain 資料夾下的節點資料夾裡面,檔名叫做 privkey。節點地址在test-chain 資料夾下的 template/init_data.yml 檔案裡面。

編譯合約

單合約編譯時,solcjssolc 沒有什麼太大區別。當多合約編譯的時候,這兩個工具有些區別。

多合約編譯時,假設 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_2YOUR_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 使用者可以通過下列命令安裝 nodenpm

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/,可以看見如下圖所示,最近交易列表無法顯示:

手把手教你在本地構建 Nervos AppChain 全家桶



更多資訊請參考 Mircroscope 文件

使用 ReBirth 提供快取資料庫服務

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_webre-birth_webre-birth_web 和一個 PostgreSQL 的容器。

更多資訊請參考 ReBirth 文件

3. 重新配置 Microscope

在瀏覽器中鍵入 http://localhost:8080/,點選如下圖紅框所示按鈕:

手把手教你在本地構建 Nervos AppChain 全家桶



在如圖所示 Other Chain 處鍵入剛剛設定好的 ReBirth 快取伺服器地址 http://localhost:8888

手把手教你在本地構建 Nervos AppChain 全家桶



可以發現瀏覽器的功能變得全面:

手把手教你在本地構建 Nervos AppChain 全家桶



參考文獻

[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 dexhunter.github.io/tutorial/20…


相關文章