安装

本章将介绍使用FISCO BCOS所需的必要安装和配置。本章通过在单机上部署一条4节点的FISCO BCOS联盟链,帮助用户掌握FISCO BCOS部署流程。

单群组FISCO BCOS联盟链的搭建

本节以搭建单群组FISCO BCOS链为例操作。使用build_chain.sh脚本在本地搭建一条4节点的FISCO BCOS链,以Ubuntu 16.04系统为例操作。

注解

  • 搭建多群组的链操作类似,感兴趣可以 参考这里
  • 本节使用预编译的静态fisco-bcos二进制文件,在CentOS 7和Ubuntu 16.04上经过测试。

准备环境

  • 安装依赖build_chain.sh脚本依赖于openssl, curl,使用下面的指令安装。CentOS将下面命令中的apt替换为yum执行即可。macOS执行brew install openssl curl即可。
  1. sudo apt install -y openssl curl
  • 创建操作目录
  1. cd ~ && mkdir -p fisco && cd fisco
  • 下载build_chain.sh脚本
  1. curl -LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/`curl -s https://api.github.com/repos/FISCO-BCOS/FISCO-BCOS/releases | grep "\"v2\." | sort -u | tail -n 1 | cut -d \" -f 4`/build_chain.sh && chmod u+x build_chain.sh

搭建单群组4节点联盟链

在fisco目录下执行下面的指令,生成一条单群组4节点的FISCO链。需要保证机器的30300~30303,20200~20203,8545~8548端口没有被占用。

  1. bash build_chain.sh -l "127.0.0.1:4" -p 30300,20200,8545

注解

  • 其中-p选项指定起始端口,分别是p2p_port,channel_port,jsonrpc_port,出于安全考虑jsonrpc/channel默认监听127.0.0.1,需要外网访问请添加-i参数

如果命令执行成功会输出All completed。如果执行出错,请检查nodes/build.log文件中的错误信息。

  1. Checking fisco-bcos binary...
  2. Binary check passed.
  3. ==============================================================
  4. Generating CA key...
  5. ==============================================================
  6. Generating keys ...
  7. Processing IP:127.0.0.1 Total:4 Agency:agency Groups:1
  8. ==============================================================
  9. Generating configurations...
  10. Processing IP:127.0.0.1 Total:4 Agency:agency Groups:1
  11. ==============================================================
  12. [INFO] FISCO-BCOS Path : bin/fisco-bcos
  13. [INFO] Start Port : 30300 20200 8545
  14. [INFO] Server IP : 127.0.0.1:4
  15. [INFO] State Type : storage
  16. [INFO] RPC listen IP : 127.0.0.1
  17. [INFO] Output Dir : /home/ubuntu16/fisco/nodes
  18. [INFO] CA Key Path : /home/ubuntu16/fisco/nodes/cert/ca.key
  19. ==============================================================
  20. [INFO] All completed. Files in /home/ubuntu16/fisco/nodes

启动FISCO BCOS链

  • 执行下面指令,启动所有节点
  1. bash nodes/127.0.0.1/start_all.sh

启动成功会输出类似下面内容的相应。否则请使用netstat -an | grep tcp检查机器的30300~30303,20200~20203,8545~8548端口是否被占用。

  1. try to start node0
  2. try to start node1
  3. try to start node2
  4. try to start node3
  5. node1 start successfully
  6. node2 start successfully
  7. node0 start successfully
  8. node3 start successfully

检查进程

  • 执行下面指令,检查进程是否启动
  1. ps -ef | grep -v grep | grep fisco-bcos

正常情况会的到类似下面的输出,如果进程数不为4,那么进程没启动的原因一般是端口被占用。

  1. fisco 5453 1 1 17:11 pts/0 00:00:02 /home/fisco/fisco/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini
  2. fisco 5459 1 1 17:11 pts/0 00:00:02 /home/fisco/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
  3. fisco 5464 1 1 17:11 pts/0 00:00:02 /home/fisco/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini
  4. fisco 5476 1 1 17:11 pts/0 00:00:02 /home/fisco/fisco/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini

检查日志输出

  • 执行下面指令,查看节点node0链接的节点数
  1. tail -f nodes/127.0.0.1/node0/log/log* | grep connected

正常情况会不停地输出链接信息,从输出可以看出node0与另外3个节点有链接。

  1. info|2019-01-21 17:30:58.316769| [P2P][Service] heartBeat connected count,size=3
  2. info|2019-01-21 17:31:08.316922| [P2P][Service] heartBeat connected count,size=3
  3. info|2019-01-21 17:31:18.317105| [P2P][Service] heartBeat connected count,size=3
  • 执行下面指令,检查是否在共识
  1. tail -f nodes/127.0.0.1/node0/log/log* | grep +++

正常情况会不停输出++++Generating seal表示共识正常。

  1. info|2019-01-21 17:23:32.576197| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++Generating seal on,blkNum=1,tx=0,myIdx=2,hash=13dcd2da...
  2. info|2019-01-21 17:23:36.592280| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++Generating seal on,blkNum=1,tx=0,myIdx=2,hash=31d21ab7...
  3. info|2019-01-21 17:23:40.612241| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++Generating seal on,blkNum=1,tx=0,myIdx=2,hash=49d0e830...

配置及使用控制台

控制台通过Web3SDK链接FISCO BCOS节点,实现查询区块链状态、部署调用合约等功能,能够快速获取到所需要的信息。控制台指令详细介绍参考这里

准备依赖

  1. # 回到fisco目录
  2. $ cd ~/fisco
  3. # 安装openjdk macOS执行 brew cask install java 安装java
  4. $ sudo apt install -y default-jdk
  5. # 获取控制台
  6. $ bash <(curl -s https://raw.githubusercontent.com/FISCO-BCOS/console/master/tools/download_console.sh)
  7. # 拷贝控制台配置文件,若节点未采用默认端口,请将文件中的20200替换成其他端口
  8. $ cp -n console/conf/applicationContext-sample.xml console/conf/applicationContext.xml
  9. # 配置控制台证书
  10. $ cp nodes/127.0.0.1/sdk/* console/conf/

重要

  • 如果控制台配置正确,但是在CentOS系统上启动控制台出现如下错误:

Failed to connect to the node. Please check the node status and the console configuration.

是因为使用了CentOS系统自带的JDK版本(会导致控制台与区块链节点认证失败),请从 OpenJDK官网Oracle官网 下载并安装Java 8或以上版本(具体安装步骤 参考附录 ),安装完毕后再启动控制台。

启动控制台

  1. # 回到控制台目录
  2. $ cd ~/fisco/console
  3. # 启动控制台
  4. $ ./start.sh
  5. # 输出下述信息表明启动成功 否则请检查conf/applicationContext.xml中节点端口配置是否正确
  6. =============================================================================================
  7. Welcome to FISCO BCOS console(1.0.3)!
  8. Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
  9. ________ ______ ______ ______ ______ _______ ______ ______ ______
  10. | \| \ / \ / \ / \ | \ / \ / \ / \
  11. | $$$$$$$$ \$$$$$$| $$$$$$\| $$$$$$\| $$$$$$\ | $$$$$$$\| $$$$$$\| $$$$$$\| $$$$$$\
  12. | $$__ | $$ | $$___\$$| $$ \$$| $$ | $$ | $$__/ $$| $$ \$$| $$ | $$| $$___\$$
  13. | $$ \ | $$ \$$ \ | $$ | $$ | $$ | $$ $$| $$ | $$ | $$ \$$ \
  14. | $$$$$ | $$ _\$$$$$$\| $$ __ | $$ | $$ | $$$$$$$\| $$ __ | $$ | $$ _\$$$$$$\
  15. | $$ _| $$_ | \__| $$| $$__/ \| $$__/ $$ | $$__/ $$| $$__/ \| $$__/ $$| \__| $$
  16. | $$ | $$ \ \$$ $$ \$$ $$ \$$ $$ | $$ $$ \$$ $$ \$$ $$ \$$ $$
  17. \$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$
  18.  
  19. =============================================================================================

使用控制台获取信息

  1. # 获取客户端版本
  2. [group:1]> getNodeVersion
  3. {
  4. "Build Time":"20190121 06:21:05",
  5. "Build Type":"Linux/clang/Debug",
  6. "FISCO-BCOS Version":"2.0.0",
  7. "Git Branch":"master",
  8. "Git Commit Hash":"c213e033328631b1b8c2ee936059d7126fd98d1a"
  9. }
  10. # 获取节点链接信息
  11. [group:1]> getPeers
  12. [
  13. {
  14. "IPAndPort":"127.0.0.1:49948",
  15. "NodeID":"b5872eff0569903d71330ab7bc85c5a8be03e80b70746ec33cafe27cc4f6f8a71f8c84fd8af9d7912cb5ba068901fe4131ef69b74cc773cdfb318ab11968e41f",
  16. "Topic":[]
  17. },
  18. {
  19. "IPAndPort":"127.0.0.1:49940",
  20. "NodeID":"912126291183b673c537153cf19bf5512d5355d8edea7864496c257630d01103d89ae26d17740daebdd20cbc645c9a96d23c9fd4c31d16bccf1037313f74bb1d",
  21. "Topic":[]
  22. },
  23. {
  24. "IPAndPort":"127.0.0.1:49932",
  25. "NodeID":"db75ab16ed7afa966447c403ca2587853237b0d9f942ba6fa551dc67ed6822d88da01a1e4da9b51aedafb8c64e9d208d9d3e271f8421f4813dcbc96a07d6a603",
  26. "Topic":[]
  27. }
  28. ]

部署及调用HelloWorld合约

HelloWorld合约

HelloWorld合约提供两个接口,分别是get()set(),用于获取/设置合约变量name。合约内容如下:

  1. pragma solidity ^0.4.24;
  2.  
  3. contract HelloWorld {
  4. string name;
  5.  
  6. function HelloWorld() {
  7. name = "Hello, World!";
  8. }
  9.  
  10. function get()constant returns(string) {
  11. return name;
  12. }
  13.  
  14. function set(string n) {
  15. name = n;
  16. }
  17. }

部署HelloWorld合约

为了方便用户快速体验,HelloWorld合约已经内置于控制台中,位于控制台目录下solidity/contracts/HelloWorld.sol,参考下面命令部署即可。

  1. # 在控制台输入以下指令 部署成功则返回合约地址
  2. [group:1]> deploy HelloWorld
  3. contract address:0xb3c223fc0bf6646959f254ac4e4a7e355b50a344

调用HelloWorld合约

  1. # 查看当前块高
  2. [group:1]> getBlockNumber
  3. 1
  4. # 调用get接口获取name变量 此处的合约地址是deploy指令返回的地址
  5. [group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 get
  6. Hello, World!
  7. # 查看当前块高,块高不变,因为get接口不更改账本状态
  8. [group:1]> getBlockNumber
  9. 1
  10. # 调用set设置name
  11. [group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 set "Hello, FISCO BCOS"
  12. 0x21dca087cb3e44f44f9b882071ec6ecfcb500361cad36a52d39900ea359d0895
  13. # 再次查看当前块高,块高增加表示已出块,账本状态已更改
  14. [group:1]> getBlockNumber
  15. 2
  16. # 调用get接口获取name变量,检查设置是否生效
  17. [group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 get
  18. Hello, FISCO BCOS
  19. # 退出控制台
  20. [group:1]> quit

注: 部署合约还可以通过deployByCNS命令,可以指定部署的合约版本号,使用方式参考这里。调用合约通过callByCNS命令,使用方式参考这里