最近在搭建FISCO BCOS 多服務器平台上花了些許時間,寫篇博客記錄一下,方便項目里的其他小伙伴借鑒。官方文檔上是在一台服務器上模擬多服務器進行搭建的,要在實際生成環境中進行部署,有些許不同。接下來我將在兩台服務器上進行搭建。以下部分內容摘自官方文檔,不再贅述:
FISCO BCOS官方文檔:使用企業級部署工具
下載安裝
下載
cd ~/ && git clone https://github.com/FISCO-BCOS/generator.git
安裝
cd ~/generator && bash ./scripts/install.sh
獲取二進制節點
拉取最新fisco-bcos二進制文件到meta中
./generator --download_fisco ./meta
錯誤解決
這一步有可能出現兩個問題,一個是網絡錯誤,如下面這樣
這個問題是因為github由於眾所周知的原因,網絡不是很穩定,所以下載失敗,但是其實應該也不至於這么穩定,總之可以在后面加上--cdn
指令,從國內的鏡像進行下載。
還有一個問題則是由--cdn
導致的,從cdn下載的壓縮文件似乎損壞了,導致解壓會出問題,如下圖:
解決這個問題的辦法是用直接瀏覽器在github下載二進制文件,也可以直接在服務器使用wget下載,地址如下:
https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.4.0/fisco-bcos.tar.gz
然后使用winrar等解壓軟件,或直接在linux使用如下命令進行解壓:
tar -xzvf fisco-bcos.tar.gz
然后會得到一個fisco-bcos
文件,移動到generator
目錄下,並賦予運行權限:
chmod +x fisco-bcos
即可跳過./generator --download_fisco ./meta
這一步
檢查二進制版本
./meta/fisco-bcos -v
若看到版本號信息則說明二進制文件已經生效可用
初始化鏈證書
這里我就直接用機構A來初始化證書了,首先進入到generator目錄下
cd ~/generator
執行命令:
./generator --generate_chain_certificate ./dir_chain_ca
不出問題的話,在dir_chain_ca目錄下應該出現了證書文件:
root@blockchain-1:~/plumk/generator# ls dir_chain_ca/
ca.crt ca.key
ca.crt為鏈證書,ca.key為鏈私鑰
機構A、B構建群組1
初始化機構A
教程中為了簡化操作直接生成了機構證書和私鑰,實際應用時應該由機構本地生成私鑰agency.key,再生成證書請求文件,向證書簽發機構獲取機構證書agency.crt。 ————官方文檔如是說到
由於我直接在機構A生成證書了,那就直接在機構A的generator目錄下進行操作
生成機構A的證書:
./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyA
執行完命令后機構A證書應該就生成到dir_agency_ca/agencyA/
目錄下了,我們查看一下:
root@blockchain-1:~/plumk/generator# ls dir_agency_ca/agencyA/
agency.crt agency.key ca.crt
然后將這些文件移動到機構A的meta目錄下,這里我就直接移動到本機目錄下
cp ./dir_agency_ca/agencyA/* ./meta/
初始化機構B
同樣的操作,生成證書,並移動到機構B目錄下,我這里直接用scp傳送過去了
./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyB
scp ./dir_agency_ca/agencyB/* root@10.13.1.12:~/generator/meta/
一條聯盟鏈中只能用到一個根證書ca.crt,多服務器部署時不要生成多個根證書和私鑰。一個群組只能有一個群組創世區塊group.x.genesis ———— 官方文檔如是提醒
機構A修改配置文件
編輯機構A下generator/conf/node_deployment.ini
文件:
這里並不全是填一樣的ip,一般來講P2P填的是外網ip,而RPC填的是內網ip,這里由於分配到的服務器只有內網ip,我就全填內網了,也只有內網的機子能訪問,實際開發過程中RPC切記不能填外網ip,關於配置文件中的3個接口的詳細資料,具體可看這篇文章
[group]
group_id=1
[node0]
; Host IP for the communication among peers.
; Please use your ssh login IP.
p2p_ip=[機構A ip]
; Listening IP for the communication between SDK clients.
; This IP is the same as p2p_ip for the physical host.
; But for virtual host e.g., VPS servers, it is usually different from p2p_ip.
; You can check accessible addresses of your network card.
; Please see https://tecadmin.net/check-ip-address-ubuntu-18-04-desktop/
; for more instructions.
rpc_ip=[機構A ip]
channel_ip=0.0.0.0
p2p_listen_port=30300
channel_listen_port=20200
jsonrpc_listen_port=8545
[node1]
p2p_ip=[機構A ip]
rpc_ip=[機構A ip]
channel_ip=0.0.0.0
p2p_listen_port=30301
channel_listen_port=20201
jsonrpc_listen_port=8546
機構B修改配置文件
機構B同上
機構A生成並發送節點信息
以下為在機構A上generator目錄下的操作
./generator --generate_all_certificates ./agencyA_node_info
命令操作完可以在agencyA_node_info
目錄下發現以下文件:
# 從左至右分別為需要交互給機構A的節點證書,節點P2P連接地址文件(根據node_deployment.ini生成的本機構節點信息)摘自官方
root@blockchain-1:~/plumk/generator# ls agencyA_node_info
cert_10.13.1.11_30300.crt cert_10.13.1.11_30301.crt peers.txt
機構生成節點,需要指定其他節點的P2P連接地址,這里我是用scp將P2P地址連接文件發送給機構B
scp ./agencyA_node_info/peers.txt root@10.13.1.12:~/generator/meta/peersA.txt
機構B生成並發送節點信息
與上一步一樣,這里不過多贅述,放上命令
./generator --generate_all_certificates ./agencyB_node_info
生成創世區塊的機構需要節點證書,示例中由A機構生成創世區塊,因此B機構除了發送節點P2P連接地址文件外,還需發送節點證書至機構A
scp ./agencyB_node_info/cert*.crt root@10.13.1.11:~/generator/meta/
同樣的,發送節點P2P連接地址文件:
scp ./agencyB_node_info/peers.txt root@10.13.1.11:~/generator/meta/peersB.txt
機構A生成群組1創世區塊
修改機構A的conf文件夾下的group_genesis.ini,初始內容如下:
[group]
group_id=1
[nodes]
node0=127.0.0.1:30300
node1=127.0.0.1:30301
node2=127.0.0.1:30302
node3=127.0.0.1:30303
修改為如下,這里要結合個人主機的ip地址來看,注意端口要對上,與前面node_deployment.ini
文件中端口的對應:
;命令解釋
[group]
;群組id
group_id=1
[nodes]
;機構A節點p2p地址
node0=10.13.1.11:30300
;機構A節點p2p地址
node1=10.13.1.11:30301
;機構B節點p2p地址
node2=10.13.1.12:30300
;機構B節點p2p地址
node3=10.13.1.12:30301
教程中選擇機構A生成群組創世區塊,實際生產中可以通過聯盟鏈委員會協商選擇。 ————摘自官方文檔
接下來就是用命令生成群組創世區塊,這步會用到A機構meta文件下面的節點證書,包括A和B
./generator --create_group_genesis ./group
然后我們將這個群組創世區塊分發至機構B
scp ./group/group.1.genesis root@10.13.1.12:~/generator/meta
機構A生成所屬節點
此命令在機構A上操作,會根據node_deployment.ini
文件生成節點配置文件:
./generator --build_install_package ./meta/peersB.txt ./nodeA
注意,此步指定的節點P2P連接信息peers.txt為群組內其他節點的鏈接信息,多個機構組網的情況下需要將其合並。 ————摘自官方
此時nodeA文件夾下應該已經有文件了
root@blockchain-1:~/plumk/generator# ls nodeA/
monitor node_10.13.1.11_30300 node_10.13.1.11_30301 scripts start_all.sh stop_all.sh
機構A啟動節點:
bash ./nodeA/start_all.sh
啟動成功:
try to start node_10.13.1.11_30300
try to start node_10.13.1.11_30301
node_10.13.1.11_30301 start successfully
node_10.13.1.11_30300 start successfully
機構B生成所屬節點
與機構A類似,不贅述,放代碼:
./generator --build_install_package ./meta/peersA.txt ./nodeB
啟動
bash ./nodeB/start_all.sh
查看群組1節點運行狀態
查看節點log:
tail -f ./node*/node*/log/log* | grep +++
出現下面這樣的字符串說明成功了
info|2020-05-19 22:40:46.229945|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=5d19a569...
info|2020-05-19 22:40:47.237060|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=b95fc203...
info|2020-05-19 22:40:50.255719|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=8f9eb369...
info|2020-05-19 22:40:51.260244|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=2c82cb3f...
info|2020-05-19 22:40:54.276552|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=f1f629d9...
搭建控制台
首先安裝一下JAVA JDK
sudo apt install -y default-jdk
輸入java -version
出現類似一下版本信息就是成功了
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
機構A、B下載控制台程序
我們先下載控制台程序,這個命令會自動為我們配置好控制台的配置文件
./generator --download_console ./
錯誤解決
這里可能會出現之前下安裝二進制文件的錯誤,處理起來比較麻煩,需要手動操作,首先從下面鏈接下載:
https://github.com/FISCO-BCOS/console/releases/download/v1.0.9/console.tar.gz
然后直接解壓可得console
文件夾,如果說文件格式錯誤,多半是下載的時候文件出錯了,多下幾次即可
配置A機構控制台(B機構同理):生成sdk證書
./generator --generate_sdk_certificate ./dir_sdk_ca ./dir_agency_ca/agencyA
執行完命令后,在dir_sdk_ca/sdk目錄下可以看到如下文件:
root@blockchain-1:~/plumk/generator# ls dir_sdk_ca/sdk
ca.crt node.crt node.key sdk.crt sdk.key
將文件復制至console目錄下的conf文件夾:
cp -rf dir_sdk_ca/sdk/* console/conf/
然后復制樣例文件applicationContext-sample.xml
為新文件:
cp applicationContext-sample.xml applicationContext.xml
在applicationContext.xml
中應該可以看到一個value標簽,修改value標簽為兩個:
<value>[你的ip]:20200</value>
<value>[你的ip]:20201</value>
這樣就配置完了
啟動控制台
回到console目錄,執行:
./start.sh
過一會就能看見控制台了
=============================================================================================
Welcome to FISCO BCOS console(1.0.9)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
________ ______ ______ ______ ______ _______ ______ ______ ______
| | \/ \ / \ / \ | \ / \ / \ / \
| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\
| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$
| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \
| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\
| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$
| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$
\$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$
=============================================================================================
[group:1]>
嘗試deploy一個HelloWorld,應該可以看到類似如下內容:
[group:1]> deploy HelloWorld
contract address: 0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx