FISCO BCOS | 搭建第一個區塊鏈網路

BSN研習社發表於2022-11-25
本章介紹FISCO BCOS所需的必要安裝和配置。本章透過在單機上部署一條4節點的FISCO BCOS聯盟鏈,幫助使用者掌握FISCO BCOS部署流程。

1. 搭建單群組FISCO BCOS聯盟鏈

本節以搭建單群組FISCO BCOS鏈為例操作。使用開發部署工具 build_chain.sh指令碼在本地搭建一條4 節點的FISCO BCOS鏈,以Ubuntu 16.04 64bit系統為例操作。

*註解

  • 若需在已有區塊鏈上進行升級,請轉至版本及相容章節。

  • 搭建多群組的鏈操作類似。

  • 本節使用預編譯的靜態`fisco-bcos`二進位制檔案,在CentOS 7和Ubuntu 16.04 64bit上經過測試。

  • 使用docker模式搭建 ,供有豐富docker經驗和容器化部署需求的使用者參考。

第一步. 安裝依賴

開發部署工具 build_chain.sh指令碼依賴於openssl, curl,根據您使用的作業系統,使用以下命令安裝依賴。
安裝macOS依賴
    
    # 最新homebrew預設下載的為openssl@3,需要指定版本openssl@1.1下載
    
    brew install openssl@1.1 curl
    
    
    
    openssl version OpenSSL 1.1.1n  15 Mar 2022
    安裝ubuntu依賴
      sudo apt install -y openssl curl
      安裝centos依賴
        sudo yum install -y openssl openssl-devel
        第二步. 建立操作目錄, 下載安裝指令碼
          
          ## 建立操作目錄
          
          cd ~ && mkdir -p fisco && cd fisco
          
          
          
          ## 下載指令碼 curl -#LO && chmod u+x build_chain.sh

          *註解

          • 如果因為網路問題導致長時間無法下載build_chain.sh指令碼,請嘗試: 

            curl -#LO && chmod u+x build_chain.sh

          第三步. 搭建單群組4節點聯盟鏈

          在fisco目錄下執行下面的指令,生成一條單群組4節點的FISCO鏈。請確保機器的30300~30303,20200~20203,8545~8548埠沒有被佔用。
          *註解

          • 國密版本請執行:
            bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -g -G
          • 其中-g表示生成國密配置,-G表示使用國密SSL連線

            bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545
            *註解

            • 其中-p選項指定起始埠,分別是:
              p2p_port,channel_port,jsonrpc_port
            • 出於安全性和易用性考慮,v2.3.0版本最新配置將listen_ip拆分成jsonrpc_listen_ip和channel_listen_ip,但仍保留對listen_ip的解析功能
            • 為便於開發和體驗,channel_listen_ip參考配置是 0.0.0.0 ,出於安全考慮,請根據實際業務網路情況,修改為安全的監聽地址,如:內網IP或特定的外網IP

            命令執行成功會輸出All completed。如果執行出錯,請檢查nodes/build.log檔案中的錯誤資訊。

              Checking fisco-bcos binary...Binary check passed.==============================================================Generating CA key...==============================================================Generating keys ...Processing IP:127.0.0.1 Total:4 Agency:agency Groups:1==============================================================Generating configurations...Processing IP:127.0.0.1 Total:4 Agency:agency Groups:1==============================================================[INFO] Execute the download_console.sh script in directory named by IP to get FISCO-BCOS console.e.g.  bash /home/ubuntu/fisco/nodes/127.0.0.1/download_console.sh==============================================================[INFO] FISCO-BCOS Path   : bin/fisco-bcos[INFO] Start Port        : 30300 20200 8545[INFO] Server IP         : 127.0.0.1:4[INFO] Output Dir        : /home/ubuntu/fisco/nodes[INFO] CA Key Path       : /home/ubuntu/fisco/nodes/cert/ca.key==============================================================[INFO] All completed. Files in /home/ubuntu/fisco/nodes
              第四步. 啟動FISCO BCOS鏈

              • 啟動所有節點

                bash nodes/127.0.0.1/start_all.sh
                啟動成功會輸出類似下面內容的響應。否則請使用netstat -an | grep tcp檢查機器的30300~30303,20200~20203,8545~8548埠是否被佔用。
                  try to start node0try to start node1try to start node2try to start node3 node1 start successfully node2 start successfully node0 start successfully node3 start successfully
                  第五步. 檢查程式

                  • 檢查程式是否啟動

                    ps -ef | grep -v grep | grep fisco-bcos
                    正常情況會有類似下面的輸出;如果程式數不為4,則程式沒有啟動(一般是埠被佔用導致的)
                      fisco       5453     1  1 17:11 pts/0    00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node0/../fisco-bcos -c config.inifisco       5459     1  1 17:11 pts/0    00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.inifisco       5464     1  1 17:11 pts/0    00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.inifisco       5476     1  1 17:11 pts/0    00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini
                      第六步. 檢查日誌輸出

                      • 如下,檢視節點node0連結的節點數

                        tail -f nodes/127.0.0.1/node0/log/log*  | grep connected
                        正常情況會不停地輸出連線資訊,從輸出可以看出node0與另外3個節點有連線。
                          info|2019-01-21 17:30:58.316769| [P2P][Service] heartBeat,connected count=3info|2019-01-21 17:31:08.316922| [P2P][Service] heartBeat,connected count=3info|2019-01-21 17:31:18.317105| [P2P][Service] heartBeat,connected count=3

                          • 執行下面指令,檢查是否在共識

                            tail -f nodes/127.0.0.1/node0/log/log*  | grep +++
                            正常情況會不停輸出++++Generating seal,表示共識正常。
                              info|2020-12-22 17:24:43.729402|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=2e133146...info|2020-12-22 17:24:47.740603|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=eb199760...

                              2. 配置及使用控制檯

                              在控制檯連結FISCO BCOS節點,實現查詢區塊鏈狀態、部署呼叫合約等功能,能夠快速獲取到所需要的資訊。2.6版本控制檯指令詳細介紹參考這裡,1.x版本控制檯指令詳細介紹參考這裡。

                              第一步. 準備依賴

                              • 安裝java (推薦使用java 14).

                                
                                # ubuntu系統安裝java
                                
                                sudo apt install -y default-jdk
                                
                                
                                
                                #centos系統安裝java sudo yum install -y java java-devel

                                • 獲取控制檯並回到fisco目錄

                                  cd ~/fisco && curl -LO 
                                  *註解

                                  • 如果因為網路問題導致長時間無法下載,請嘗試:
                                    cd ~/fisco && curl -#LO && bash download_console.sh
                                  • 複製控制檯配置檔案

                                  若節點未採用預設埠,請將檔案中的20200替換成節點對應的channel埠。
                                    # 最新版本控制檯使用如下命令複製配置檔案cp -n console/conf/config-example.toml console/conf/config.toml

                                    • 配置控制檯證照

                                    *註解

                                    使用1.x版本控制檯時:

                                    • 搭建國密版時,如果使用國密SSL請執行:

                                      cp nodes/127.0.0.1/sdk/gm/* console/conf/

                                    • 搭建國密版時,請修改applicationContext.xml中encryptType修改為1

                                      cp -r nodes/127.0.0.1/sdk/* console/conf/

                                      第二步. 啟動並使用控制檯

                                      • 啟動

                                        cd ~/fisco/console && bash start.sh
                                        輸出下述資訊表明啟動成功 否則請檢查conf/config.toml中節點埠配置是否正確
                                          
                                          =============================================================================================
                                          
                                          Welcome to FISCO BCOS console(
                                          2.6.
                                          0)!
                                          
                                          Type 
                                          'help' 
                                          or 
                                          'h' 
                                          for help. Type 
                                          'quit' 
                                          or 
                                          'q' to quit console.
                                          
                                           _______
                                          _  _____
                                          _   _____
                                          _    _____
                                          _    _____
                                          _         ______
                                          _    _____
                                          _    _____
                                          _    _____
                                          _
                                          
                                          
                                          |        \|      \ /      \  /      \  /      \       
                                          |       \  /      \  /      \  /      \
                                          
                                          
                                          | $$$$$$$$ \$$$$$$
                                          |  $$$$$$\|  $$$$$$\
                                          |  $$$$$$\      | $$$$$$$\
                                          |  $$$$$$\|  $$$$$$\
                                          |  $$$$$$\
                                          
                                          
                                          | $$_
                                          _      
                                          | $$  | $$__
                                          _\$$
                                          | $$   \$$| $$  
                                          | $$      | $$_
                                          _/ $$
                                          | $$   \$$| $$  
                                          | $$| $$__
                                          _\$$
                                          
                                          
                                          | $$  \     | $$   \$$    \ 
                                          | $$      | $$  
                                          | $$      | $$    $$
                                          | $$      | $$  
                                          | $$ \$$    \
                                          
                                          
                                          | $$$$$     
                                          | $$   _\$$$$$$\| $$   _
                                          _ 
                                          | $$  | $$      
                                          | $$$$$$$\| $$   _
                                          _ 
                                          | $$  | $$ 
                                          _\$$$$$$\
                                          
                                          
                                          | $$       _| $$
                                          _ 
                                          |  \__| $$
                                          | $$__/  \| $$_
                                          _/ $$      
                                          | $$__/ $$| $$_
                                          _/  \
                                          | $$__/ $$|  \_
                                          _
                                          | $$
                                          
                                          
                                          | $$      
                                          |   $$ \ \$$    $$ \$$    $$ \$$    $$      | $$    $$ \$$    $$ \$$    $$ \$$    $$
                                          
                                           \$$       \$$$$$$  \$$$$$$   \$$$$$$   \$$$$$$        \$$$$$$$   \$$$$$$   \$$$$$$   \$$$$$$
                                          
                                          
                                          
                                          =============================================================================================
                                          若1.x控制檯啟動失敗,參考 Web3SDK啟動失敗場景

                                          • 用控制檯獲取資訊

                                            
                                            # 獲取客戶端版本
                                            
                                            [group:1]> getNodeVersion
                                            
                                            ClientVersion{
                                            
                                                version='2.6.0',
                                            
                                                supportedVersion='2.6.0',
                                            
                                                chainId='1',
                                            
                                                buildTime='20200819 15:47:59',
                                            
                                                buildType='Darwin/appleclang/RelWithDebInfo',
                                            
                                                gitBranch='HEAD',
                                            
                                                gitCommitHash='e4a5ef2ef64d1943fccc4ebc61467a91779fb1c0'
                                            
                                            }
                                            
                                            # 獲取節點資訊
                                            
                                            [group:1]> getPeers
                                            
                                            [
                                            
                                                PeerInfo{
                                            
                                                    nodeID='c1bd77e188cd0783256ee06838020f24a697f9af785438403d3620967a4a3612e3abc4bbe986d1e9dddf62d4236bff0b7d19a935a3cd44889f681409d5bf8692',
                                            
                                                    ipAndPort='127.0.0.1:30302',
                                            
                                                    agency='agency',
                                            
                                                    topic=[
                                            
                                            
                                            
                                                   ],        node='node2'    },    PeerInfo{        nodeID='7f27f5d67f104eacf689790f09313e4343e7887a1a7b79c31cd151be33c7c8dd57c895a66086c3c8e0b54d2fa493407e0d9646b2bd9fc29a94fd3663a5332e6a',        ipAndPort='127.0.0.1:57266',        agency='agency',        topic=[            _block_notify_1        ],        node='node1'    },    PeerInfo{        nodeID='862f26d9681ed4c12681bf81a50d0b8c66dd5b6ee7b0b42a4af12bb37b1ad2442f7dcfe8dac4e737ce9fa46aa94d904e8c474659eabf575d6715995553245be5',        ipAndPort='127.0.0.1:30303',        agency='agency',        topic=[
                                                   ],        node='node3'    } ]
                                            [group:1]>

                                            3. 部署及呼叫HelloWorld合約

                                            第一步. 編寫HelloWorld合約

                                            HelloWorld合約提供兩個介面,分別是get()和set(),用於獲取/設定合約變數name。合約內容如下:
                                              
                                              pragma solidity ^0.4.24;
                                              
                                              
                                              
                                              contract HelloWorld {    string name;
                                                 function HelloWorld() {        name = "Hello, World!";    }
                                                 function get()constant returns(string) {        return name;    }
                                                 function set(string n) {        name = n;    } }
                                              第二步. 部署HelloWorld合約
                                              為了方便使用者快速體驗,HelloWorld合約已經內建於控制檯中,位於控制檯目錄下contracts/solidity/HelloWorld.sol,參考下面命令部署即可。
                                                # 在控制檯輸入以下指令 部署成功則返回合約地址[group:1]> deploy HelloWorldtransaction hash: 0xd0305411e36d2ca9c1a4df93e761c820f0a464367b8feb9e3fa40b0f68eb23facontract address:0xb3c223fc0bf6646959f254ac4e4a7e355b50a344

                                                第三步. 呼叫HelloWorld合約

                                                  
                                                  # 檢視當前塊高
                                                  
                                                  [group:1]> getBlockNumber
                                                  
                                                  1
                                                  
                                                  
                                                  
                                                  # 呼叫get介面獲取name變數 此處的合約地址是deploy指令返回的地址 [group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 get --------------------------------------------------------------------------------------------- Return code: 0 description: transaction executed successfully Return message: Success --------------------------------------------------------------------------------------------- Return values: [    "Hello,World!" ] ---------------------------------------------------------------------------------------------
                                                  # 檢視當前塊高,塊高不變,因為get介面不更改賬本狀態 [group:1]> getBlockNumber 1
                                                  # 呼叫set設定name [group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 set "Hello, FISCO BCOS" transaction hash: 0x7e742c44091e0d6e4e1df666d957d123116622ab90b718699ce50f54ed791f6e --------------------------------------------------------------------------------------------- transaction status: 0x0 description: transaction executed successfully --------------------------------------------------------------------------------------------- Output Receipt message: Success Return message: Success --------------------------------------------------------------------------------------------- Event logs Event: {}
                                                  # 再次檢視當前塊高,塊高增加表示已出塊,賬本狀態已更改 [group:1]> getBlockNumber 2
                                                  # 呼叫get介面獲取name變數,檢查設定是否生效 [group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 get --------------------------------------------------------------------------------------------- Return code: 0 description: transaction executed successfully Return message: Success --------------------------------------------------------------------------------------------- Return values: [    "Hello,FISCO BCOS" ] ---------------------------------------------------------------------------------------------
                                                  # 退出控制檯 [group:1]> quit

                                                  文章來源: FISCO BCOS
                                                  文章原標題:《 搭建第一個區塊鏈網路》

                                                  如有侵權請與我們聯絡刪除。

                                                  來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012206/viewspace-2925160/,如需轉載,請註明出處,否則將追究法律責任。

                                                  相關文章