本文來源 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