Fisco Bcos从入门到国一,宝宝版教学

搭链

1.配置搭链环境

1.1配置openssl

sudo apt install -y openss | curl

2.拉取搭链脚本build_chain.sh

curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod u+x build_chain.sh

3.部署联盟链网络

bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545  -e ./fisco-bcos
​
-l 指定节点ip
-p 指定起始端口,分别是p2p_port,channel_port,jsonrpc_port
-e 指定本机已存在的fisco-bcos二进制文件

输出:命令执行成功会输出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

启动脚本之后,就会生成节点目录,目录结构如下:

(1)cert文件夹下存放链的根证书和机构证书。

(2)以IP命名的文件夹下存储该服务器所有节点相关配置、fisco-bcos可执行程序、SDK所需的证书文件。

(3)每个IP文件夹下的node*文件夹下存储节点所需的配置文件。其中config.ini为节点的主配置,conf目录下存储证书文件和群组相关配置。

​ 配置文件详情,每个节点中还提供start.sh和stop.sh脚本,用于启动和停止节点。

(4)每个IP文件夹下(nodes/127.0.0.1( IP ))的提供start_all.sh和stop_all.sh两个脚本用于启动和停止所有节点。

nodes/
├── 127.0.0.1
│   ├── fisco-bcos # 二进制程序
│   ├── node0 # 节点0文件夹
│   │   ├── conf # 配置文件夹
│   │   │   ├── ca.crt # 链根证书
│   │   │   ├── group.1.genesis # 群组1初始化配置,该文件不可更改
│   │   │   ├── group.1.ini # 群组1配置文件
│   │   │   ├── node.crt # 节点证书
│   │   │   ├── node.key # 节点私钥
│   │   │   ├── node.nodeid # 节点id,公钥的16进制表示
|   |   |   ├── channel_cert # 节点与SDK通信的RSA证书,FISCO-BCOS 2.9.0+支持
|   |   |       ├── ca.crt
|   |   |       ├── node.crt
|   |   |       └── node.key
│   │   ├── config.ini # 节点主配置文件,配置监听IP、端口等
│   │   ├── start.sh # 启动脚本,用于启动节点
│   │   └── stop.sh # 停止脚本,用于停止节点
│   ├── node1 # 节点1文件夹
│   │.....
│   ├── node2 # 节点2文件夹
│   │.....
│   ├── node3 # 节点3文件夹
│   │.....
│   ├── sdk # SDK与节点SSL连接配置,FISCO-BCOS 2.5及之后的版本,添加了SDK只能连本机构节点的限制,操作时需确认拷贝证书的路径,否则建联报错
│   │   ├── ca.crt # SSL连接根证书
│   │   ├── sdk.crt # SSL连接证书
│   │   └── sdk.key # SSL连接证书私钥
|   |   ├── gm # SDK与节点国密SSL连接配置,注意:生成国密区块链环境时才会生成该目录,用于节点与SDK的国密SSL连接
|   |   │   ├── gmca.crt # 国密SSL连接根证书
|   |   │   ├── gmensdk.crt # 国密SSL连接加密证书
|   |   │   ├── gmensdk.key # 国密SSL连接加密证书私钥
|   |   │   ├── gmsdk.crt # 国密SSL连接签名证书
|   |   │   └── gmsdk.key # 国密SSL连接签名证书私钥
├── cert # 证书文件夹
│   ├── agency # 机构证书文件夹
│   │   ├── agency.crt # 机构证书
│   │   ├── agency.key # 机构私钥
│   │   ├── agency.srl
│   │   ├── ca-agency.crt
│   │   ├── ca.crt
│   │   └── cert.cnf
|   |   └── channel/ # 节点与SDK通过RSA证书SSL通信的根证书,FISCO-BCOS 2.9.0+支持
|   |      ├── ca.crt
|   |      ├── ca.key
|   |      └── ca.srl
│   ├── ca.crt # 链证书
│   ├── ca.key # 链私钥
│   ├── ca.srl
│   └── cert.cnf
​

4.启动FISCO BCOS链

bash nodes/127.0.0.1/start_all.sh

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

try to start node0
try to start node1
try to start node2
try to start node3
 node1 start successfully
 node2 start successfully
 node0 start successfully
 node3 start successfully

5.检查进程

  • 检查进程是否启动1

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.ini
fisco       5459     1  1 17:11 pts/0    00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
fisco       5464     1  1 17:11 pts/0    00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini
fisco       5476     1  1 17:11 pts/0    00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini

6. 检查日志输出

  • 查看节点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=3
info|2019-01-21 17:31:08.316922| [P2P][Service] heartBeat,connected count=3
info|2019-01-21 17:31:18.317105| [P2P][Service] heartBeat,connected count=3
  • 检查是否在共识

tail -f nodes/127.0.0.1/node0/log/log*  | grep +++

正常情况会不conf停输出++++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...

7、docker部署

​ docker部署需要安装docker环境,并且配置docker用户组,开启docker服务

service docker start

​ 建链采用docker (指定build_chain.sh文件-d参数即可)

bash build_chain.sh -l 127.0.0.1:4 -d -p 30300,20200,5845 -e fisco-bcos

​ 开启节点时候,会有节点的显示

​ 使用docker命令查看区块链系统状态

docker ps -a | egrep fiscobcso

8、多群组部署

9、并行多组部署

例 : 四节点两群组饼并行

  • 搭建默认的group1的区块链系统

    ./build_chain.sh -l 127.0.0.1:4 -o multi_nodes -p 20000,20100,7545
  • 启动所有节点

./bash start_all.sh
​
检查区块链系统状态
ps -aux | grep fisco-bcos
​
查看节点共识情况
tail -f node0/log/* | grep "g:1.*++"
  • 将group2加入区块链 ---- 并行多组区块链每个群组的genesis配置文件几乎相同,只需修改[group].id的

    在每个节点的conf目录下 进行

            —拷贝group1的配置并命名为 group.2.*

​ —修改群组id

​ sed -i "s/id=1/id=2/g" node0/conf/group.2.genesis

​ 查看修改情况

​ cat node0/conf/group.2.genesis | grep "id"

​ — 将配置拷贝到各个节点

​ cp .......

​ — 重启各个节点

  • 查看群组共识情况

查看所有节点与新加入的群组的共识情况
tail -f node0/log/* | grep "g:2.*++"
  • 配置控制台

    拷贝并配置config.toml文件
    修改控制台连接节点的端口为褡裢指定的channel_chain的端口,后面新建的群组则+1
    ​
    # 获取channel_port
    $ grep "channel_listen_port" multi_nodes/127.0.0.1/node0/config.ini
    multi_nodes/127.0.0.1/node0/config.ini:    channel_listen_port=20100
    ​
    # linux系统使用如下命令:
    $ sed -i 's/127.0.0.1:20200/127.0.0.1:20100/g' ~/fisco/console/conf/config.toml
    $ sed -i 's/127.0.0.1:20201/127.0.0.1:20101/g' ~/fisco/console/conf/config.toml 

10、单群组多机构不同端口部署

控制台

2、配置及使用控制台

​ 控制台2.6版本给予Java SDK实现,所以需要安装java并且配置环境

​ 链接FISCO-BCOS节点,,查询区块链状态,部署和调用合约

  • 准备依赖
    sudo apt install -y default-jdk 

    ​ 安装默认的java版本

  • 回到fisco目录
    cd ~/fisco
  • 拉取并执行fisco控制台的脚本文件
     cd  curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master-2.0/tools/download_console.sh && bash download_console.sh
  • 拷贝控制台配置文件
    cp -n console/conf/config-example.toml console/conf/config.toml
    ​
    cp source dept 拷贝文件指令 
    -n 如果存在目标文件,则不生效
  • 配置控制台证书

    cp -r nodes/127.0.0.1/sdk/* console/conf/
    ​
    cp -r source dept
    将nodes/127.0.0.1/sdk/* 的所有文件拷贝到 console/conf/下

3、启动并使用控制台

  • ​ 启动

    cd ~/fisco/console && bash start.sh
    ​
    =============================================================================================
    Welcome to FISCO BCOS console(2.6.0)!
    Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
     ________  ______   ______    ______    ______         _______    ______    ______    ______
    |        \|      \ /      \  /      \  /      \       |       \  /      \  /      \  /      \
    | $$$$$$$$ \$$$$$$|  $$$$$$\|  $$$$$$\|  $$$$$$\      | $$$$$$$\|  $$$$$$\|  $$$$$$\|  $$$$$$\
    | $$__      | $$  | $$___\$$| $$   \$$| $$  | $$      | $$__/ $$| $$   \$$| $$  | $$| $$___\$$
    | $$  \     | $$   \$$    \ | $$      | $$  | $$      | $$    $$| $$      | $$  | $$ \$$    \
    | $$$$$     | $$   _\$$$$$$\| $$   __ | $$  | $$      | $$$$$$$\| $$   __ | $$  | $$ _\$$$$$$\
    | $$       _| $$_ |  \__| $$| $$__/  \| $$__/ $$      | $$__/ $$| $$__/  \| $$__/ $$|  \__| $$
    | $$      |   $$ \ \$$    $$ \$$    $$ \$$    $$      | $$    $$ \$$    $$ \$$    $$ \$$    $$
     \$$       \$$$$$$  \$$$$$$   \$$$$$$   \$$$$$$        \$$$$$$$   \$$$$$$   \$$$$$$   \$$$$$$
    ​
    =============================================================================================
    ​
    启动成功

4、部署

​ (开启控制台)将自己写的合约存放在控制台的目录下

contracts/solidity/*

​ 部署合约

​ 从默认目录获取文件,默认目录为: contracts/solidity,比如:HelloWorld。

deploy 合约名
[group:1]> deploy HelloWorld
transaction hash: 0xd0305411e36d2ca9c1a4df93e761c820f0a464367b8feb9e3fa40b0f68eb23fa
contract address:0xb3c223fc0bf6646959f254ac4e4a7e355b50a344

获取节点信息

[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'
    }

调用合约相关函数call 合约名 合约地址 无参函数 | 有参函数 参数列表

5、创建和使用账户

  • 账户分为用户账户和合约账户。用户账户用来标识和区分每一个独立用户

  • 在公私钥体系的区块链系统中,每一个账户对应着一对公钥和私钥,公钥通过哈希等单向性算法得到账户地址(外部账户地址)

    1、用户的创建

    	获取生成账户脚本			
    
    
    
    curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/tools/get_account.sh && chmod u+x get_account.sh && bash get_account.sh -h
  • 生成账户

    bash get_account.sh
    ​
    Usage: ./get_account.sh
        default       generate account and store private key in PEM format file
        -p            generate account and store private key in PKCS12 format file
        -k [FILE]     calculate address of PEM format [FILE]
        -P [FILE]     calculate address of PKCS12 format [FILE]
        -h Help
      
    -default 默认生成pem格式私钥
    -k 指定已有的pem格式的私钥文件来计算账户地址
  • 执行输出

[INFO] Account Address   : 0xee5fffba2da55a763198e361c7dd627795906ead
[INFO] Private Key (pem) : accounts/0xee5fffba2da55a763198e361c7dd627795906ead.pem  
  • 指定PEM私钥文件计算账户地址

    bash get_account.sh -k accounts/0xee5fffba2da55a763198e361c7dd627795906ead.pem  
    ​
    输出
    [INFO] Account Address   : 0xee5fffba2da55a763198e361c7dd627795906ead
  • 指定PKSC12私钥格式

bash get_account.sh -p 
​
Enter Export Password:
Verifying - Enter Export Password:
[INFO] Account Address   : 0x02f1b23310ac8e28cb6084763d16b25a2cc7f5e1
[INFO] Private Key (p12) : accounts/0x02f1b23310ac8e28cb6084763d16b25a2cc7f5e1.p12
  • 生成的账户私钥文件在accounts目录下

    0x52fc6a526ded4562756df2db54ea0076b675f53d.pem         0xae50531e77312ea04fd82fce252847b0bd23e432.pem
    0x52fc6a526ded4562756df2db54ea0076b675f53d.public.pem  0xae50531e77312ea04fd82fce252847b0bd23e432.public.pem
    
    
    
2、账户的使用

​ 控制台加载私钥时需要指定私钥文件。如果不指定私钥文件,则默认使用控制台中account/ency中的账户

  • 控制台启动方式

./start.sh
./start.sh groupID
./start.sh groupID -pem pemName
./start.sh groupID -p12 p12Name
​
例 : bash start.sh 1 -pem accounts/0xebb824a1122e587b17701ed2e512d8638dfb9c88.pem

6、账户权限控制

基于角色的权限控制
委员

​ 链初始状态,没有任何权限账户记录。都是自由人

1、委员新增、撤销与查询

​ 委员权限:治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号

​ 增,删委员需要所有委员投票,有效票大于阈值才生效。大约0.5的水平.

使用账户1的账号添加账户1为委员
[group:1]> grantCommitteeMember 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a
{
    "code":0,
    "msg":"success"
}
​
使用账户1(在账户1控制台中)添加账户2为委员
[group:1]> grantCommitteeMember 0x72fc1fcb85331f62f29d78ad37d20fef8d8fe0d3
{
    "code":0,
    "msg":"success"
}
​
[group:1]> listCommitteeMembers 
---------------------------------------------------------------------------------------------
|                   address                   |                 enable_num                  |
| 0x52fc6a526ded4562756df2db54ea0076b675f53d  |                      1                      |
| 0x72fc1fcb85331f62f29d78ad37d20fef8d8fe0d3  |                      2                      |
---------------------------------------------------------------------------------------------
===========================================================================================================
​
撤销账号2的委员权限
账号1投票撤销账号2的委员权限
[group:1]> revokeCommitteeMember 0x72fc1fcb85331f62f29d78ad37d20fef8d8fe0d3
TransactionHash: 0xfb402484d161c6a8ff3f67880896cf804ef26ad3459441f6d4950ed719499e89
{
    "code":0,
    "msg":"Success"
}
​
账号2投票撤销账号2的委员权限
[group:1]> revokeCommitteeMember 0x72fc1fcb85331f62f29d78ad37d20fef8d8fe0d3
TransactionHash: 0xa69649e8534eb21b75029c74fd828afb3823d3511f9c7da8d5ec4df236221b34
{
    "code":1,
    "msg":"Success"
}

2、委员权重修改

​ 就是修改委员一次投票所拥有的有效投票数量 。 需要委员会的投票同意

updateCommitteeMemberWeight 账户地址 票数
​
[group:1]> updateCommitteeMemberWeight 0x52fc6a526ded4562756df2db54ea0076b675f53d 2
TransactionHash: 0x0b573cb88b4989a4ec61f09f535ade2343e5eaf6a076d693d31886d6e5d0f982
{
    "code":0,
    "msg":"Success"
}

3、委员投票生效阈值修改

当前环境 账号1:2票

​ 账号3 : 1票即只需要账号1同意账号2为委员即可生效

[group:1]> grantCommitteeMember 0x72fc1fcb85331f62f29d78ad37d20fef8d8fe0d3
TransactionHash: 0x4bdcbe5da325efa9f9fb7a0f4fd9816f4a06a7d9e83533ddb29899ed49c35112
{
    "code":1,
    "msg":"Success"
}

修改投票生效阈值

updateThreshold 阈值
[group:1]> updateThreshold 75
TransactionHash: 0x9e4ae5e7441204a706cafaf7aab7fc6abb666cab7be52472b04fff10d9e4a804
{
    "code":0,
    "msg":"Success"
}

运维

​ 部署合约、创建表、冻结解冻所部署的合约、使用CNS服务

1、运维新增、撤销与查询
新增账号4
bash get_account.sh
​
委员可单独添加运维账号,不需要投票即可
​
设置账号4为运维账号
[group:1]> grantOperator 0x283f5b859e34f7fd2cf136c07579dcc72423b1b2
{
    "code":0,
    "msg":"success"
}
​
[group:1]> listOperators
---------------------------------------------------------------------------------------------
|                   address                   |                 enable_num                  |
| 0x283f5b859e34f7fd2cf136c07579dcc72423b1b2  |                     15                      |
---------------------------------------------------------------------------------------------
​
撤销账号运维权限
[group:1]> revokeOperator 0x283f5b859e34f7fd2cf136c07579dcc72423b1b2
{
    "code":0,
    "msg":"success"
}
​
[group:1]> listOperators
Empty set.
​
  • ​ 运维账号部署HelloWold

    deploy HelloWold
    ​
    [group:1]> deploy HelloWorld 
    transaction hash: 0xb1d1086a81da1583535972adaba49c688a9117791e1bd812e0008c32710f879f
    contract address: 0x64151bb02928f3cb484e665d242eb21eb8acf949
    currentAccount: 0xbba2725cfd3ccb203933924650716a02bf812392
  • 非运维账号部署HelloWold

    [group:1]> deploy HelloWorld 
    transaction hash: 0xff32c07215526959003fdbc22ad79cc0f17c47a5e6fac9445c0dcb060811480f
    deploy contract for HelloWorld failed!
    return message: Permission denied
    return code:25
    Return values:null

基于表的权限控制

7、控制台常用命令

通过Java SDK于区块链节点建立连接,实现对区块链节点数据的读写访问请求。

  • 获取部署合约的区块信息 getBlockByHash 部署合约返回的交易hash

  • 查看交易回执 getTransactionReceip 交易hash

  • 控制台切换账号 loadAccount 账号地址

  • 设置系统中区块打包最大交易数量

    setSystemConfigByKey tx_count_limit 数量
  • 控制台中查看共识状态

getConsensusStatus


  • 控制台中查看同步状态

getSyncStatus

查看当前控制台连接区块链节点的id。以及当前控制台连接的节点的peers列表


  • 查看创世区块

    getBlockByNumber 0
    
    
    
  • 查看区块链节点的网络连接信息

    getPeers
    
    
    

8、控制台报错

  • 节点加入共识列表报错 ( "nodeId is not in network" )

    • 新加入的节点必须处于运行状态(节点已启动)

    • 新加入的节点与其他共识节点建立网络连接 。 即节点已经启动且 tail -f node/log/log* | grep connected 有输出

  • 控制台启动报错

    • 节点进程未启动 (检查节点进程 ps aux | grep fisco-bcos)

  • 新节点加入共识列表成功后,检查节点共识状态没输出

    • 群组配置文件未拷贝。节点共识时需要根据 群组配置文件

  • Permission denied错误

    • 当前群组内开启了权限控制。控制台当前用来发送交易的账户没有权限

扩容新节点

  • 共识节点 : 参与共识的节点

  • 观察者节点 : 不参与共识,但能实时同步链上数据的节点

  • 游离节点 : 已启动,待等待加入群组的节点。不能获取链上的数据

设置节点状态

addSealer:根据节点NodeID设置对应节点为共识节点
​
addObserver:根据节点NodeID设置对应节点为观察节点
​
removeNode:根据节点NodeID设置对应节点为游离节点
​
getSealerList:查看群组中共识节点列表
​
getObserverList:查看群组中观察节点列表
​
getNodeIDList:查看节点已连接的所有其他节点的NodeID

扩充节点步骤

1、为节点生成证书并启动

​ 节点间简历链接需要证书来支持 。 所以首先要签发证书

获取证书生成脚本

curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/gen_node_cert.sh

生成新节点私钥证书

bash gen_node_cert.sh -c ../cert/agency -o node4
​
-c : 指定机构证书以及私钥所在路径
-o : 指定输出指定文件夹。其中新节点/conf中有机构agency签发的证书和私钥

​ 节点需要有配置文件 启动脚本和停止脚本

准备节点配置文件

cp node0/conf/config.ini node0/start.sh node0/stop.sh node4/


修改配置文件的信息

修改所有端口号

修改node4/config.ini。对于[rpc]模块,修改channel_listen_port=20204和jsonrpc_listen_port=8549;对于[p2p]模块,修改listen_port=30304并在node.中增加自身节点信息


修改其余节点P2P节点连接列表

在其余节点中的config.ini主配置文件中加入新节点的信息,并重启节点


拷贝节点的group1.genesis和group1.ini文件到i新节点conf下

cp node0/conf/group.1.genesis node0/conf/group.1.ini node4/conf/

检验新节点是否于其他节点建立连接

tail -f node4/log/log* | grep "connected count"


2、将节点加入到群组
**获取新节点的公钥id**
cat node5/conf/node.nodeid

使用控制台addSealer

 **在控制台中**
 addSealer 新节点id 

缩减节点步骤

节点需要先退出群组在退出网络 。顺序需要用户自己保证

1、节点退出群组

​ 在控制台中使用removeNode node.id,将节点设置为游离节点

removeNode node.id

​ 在控制台中使用getSealerList查询节点是否还在共识列表中

get SealerList


2、节点退出网络

​ 在节点的config.ini配置文件中,将节点的P2P节点连接列表内容清空,重启节点

[p2p]
    listen_ip=0.0.0.0
    listen_port=30300
    ; nodes to connect
  #  node.0=127.0.0.1:30300
  #  node.1=127.0.0.1:30301
  #  node.2=127.0.0.1:30302
  #  node.3=127.0.0.1:30303

在其他节点config.ini配置文件中,将节点从其余节点的P2P列表中移除,并重启

CA黑白名单

CA黑名单

证书拒绝列表

在节点config文件中[certificate_blacklist]中配置,拒绝此NodeID节点发起的连接

CA白名单

证书接收列表

在节点config文件中[certificate_whitelist]中配置,拒绝除白名单之外的所有节点发起的连接

所属配置类型

  • 基于作用范围(网络配置/账本配置)维度可划分为网络配置,影响整个网络的节点连接建立过程;

  • 基于是否可改(可改配置/固定配置)维度可划分为可改配置,内容可改,重启后生效;

  • 基于存放位置(本地存储/链上存储)维度可划分为本地存储,内容记录在本地,不存于链上

  • 黑名单:拒绝写在黑名单中的节点连接

  • 白名单:拒绝所有未配置在白名单中的节点连接。白名单为空表示不开启,接受任何连接。

获取和续期证书

1、三级证书结构

​ 链证书 》机构证书 》节点证书

多群组架构中

  • 一条链拥有 链证书 和 链私钥 ,链私钥由联盟链委员会管理 (类似于链的集合体,每条链都需要将自己的私钥给其管理)

    联盟链委员会可以使用机构的证书请求文件 agency.csr 签发机构证书 agency.crt

    ca.crt 链证书
    ca.key 链私钥
    
    
    
  • 机构

    机构私钥由机构管理员持有,可以对机构下属节点签发节点证书

  • 节点

    节点证书是节点身份凭证、是与其他持有合法证书的节点建立SSL连接,并进行加密通信的基础

    进行SSL加密通信时,拥有相同链证书ca.crt的节点才可建立连接(在同一条链上的节点)

    节点证书node.crt包含了节点证书和机构证书的信息,节点与其他节点/SDK通信验证时会用自己的私钥node.key对消息进行签名,并发送自己的node.crt至对方验证

  • sdk

    sdk证书是sdk与节点通信的凭证、机构生成sdk证书,运行sdk与节点进行通信

2、证书生成流程

  • 生成链证书

    联盟链委员会使用openssl命令请求链私钥ca.key , 根据ca.key生成链证书

  • 生成机构证书

    机构使用openssl命令生成机构私钥 agency.key

    机构使用机构私钥agency.key,得到机构证书请求文件agency.csr,将其发送到联盟链委员会

    联盟链委员会使用链私钥ca.key,根据得到的机构证书请求文件生成机构证书并发回

  • 生成节点/SDK证书

    节点生成私钥node.key 和证书请求文件node.csr,机构管理员使用私钥agency.key和证书请求文件node.csr为节点颁发证书,生成sdk证书相同

3、续期证书

获取检测证书有效期脚本,在node2/conf/scrpts目录下输入

curl -#LO https://gitee.com/FISCO-BCOS/generator/raw/master/scripts/check_certificates.sh && chmod u+x check_certificates.sh


检测证书有效期

bash check_certificates.sh -t 证书
​
-t 指定证书签发的有效期和当前系统时间对证书进行检测
成功末尾提示check ca.crt time successful
​
root@test1-virtual-machine:~/fisco/nodes/127.0.0.1/node2/scripts# bash check_certificates.sh -t ../conf/ca.crt 
check ca.crt time started
ca.crt valid time is NOT BEFORE Sep 30 03:10:51 2023 GMT and NOT AFTER Sep  6 03:10:51 2123 GMT
check ca.crt time successful
​

验证证书

bash check_certificates.sh -v 根证书 节点证书
​
-v 根据用户指定的根证书从而验证节点证书
成功末尾提示use ../conf/ca.crt verify node.crt successful
​
​
root@test1-virtual-machine:~/fisco/nodes/127.0.0.1/node2/scripts# bash check_certificates.sh -v ../conf/ca.crt ../conf/node.crt
check ca.crt time started
ca.crt valid time is NOT BEFORE Sep 30 03:10:51 2023 GMT and NOT AFTER Sep  6 03:10:51 2123 GMT
check ca.crt time successful
check node.crt time started
node.crt valid time is NOT BEFORE Sep 30 03:10:52 2023 GMT and NOT AFTER Sep  6 03:10:52 2123 GMT
check node.crt time successful
use ../conf/ca.crt verify node.crt successful
​

获取和续期证书 — FISCO BCOS v2 v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io)

压力测试

执行HelloWorld 合约测试

npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig benchmarks/samples/fisco-bcos/helloworld/config.yaml  --caliper-networkconfig networks/fisco-bcos/4nodes1group/fisco-bcos.json

执行Solidity版转账合约测试

npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig benchmarks/samples/fisco-bcos/transfer/solidity/config.yaml  --caliper-networkconfig networks/fisco-bcos/4nodes1group/fisco-bcos.json

执行预编译版转账合约测试

npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig benchmarks/samples/fisco-bcos/transfer/precompiled/config.yaml  --caliper-networkconfig networks/fisco-bcos/4nodes1group/fisco-bcos.json

caliper benchmark run

执行此命令,需要到benchmarks目录下

user@ubuntu:~/benchmarks$ npx caliper benchmark run --help
caliper benchmark run --caliper-workspace ~/myCaliperProject --caliper-benchconfig my-app-test-config.yaml --caliper-networkconfig my-sut-config.yaml
​
Options:
  --help                   Show help  [boolean]
  -v, --version            Show version number  [boolean]
  --caliper-benchconfig    Path to the benchmark workload file that describes the test client(s), test rounds and monitor.  
  用于指定测试配置文件 ,测试配置文件中包含测试的具体参数 , 交易发送方式,发送速率控制器类型,性能监视器等
  
  [string]
  --caliper-networkconfig  Path to the blockchain configuration file that contains information required to interact with the SUT
  用于指定网络配置文件 , 网络配置文件中会指定Caliper 与受测系统的连接方式及要部署测试的合约 
  
 [string]
  --caliper-workspace      Workspace directory that contains all configuration information  [string]
    指定caliper-cli的工作目录 ,如果没有绑定工作目录, 可以通过该选项动态指定工作目录

实战情况

  • 当前存放了caliper-benchmarks的文件夹

  • 执行 npx caliper benchmark run --caliper-workspace 【caliper工作目录】

    • --caliper-workspace caliper-benchmarks

  • 附带 --caliper-networkconfig 【网络配置文件路径,实在caliper工作目录里头的network文件夹】

    • --caliper-networkconfig networks/fisco-bcos/test-nw/fisco-bcos.json

  • 附带 --caliper-benchconfig 【测试配置文件 ,实在 caliper 工作目录里头的benchmarks文件夹】

    • --caliper-benchconfig benchmars/samples/fisco-bcos/合约文件夹/config.yaml

测试Trace 合约的 newFood方法

  • 首先,查看 caliper工作目录 / benchmarks/samples/fisco-bcos 有没有存放了该合约的测试配置文件夹 (config.yaml 。测试配置文件 ) 。 (测试方法.js 文件) 。如果没有,则拷贝helloworld的进行修改 (config.yaml , get.js (调用读取的方法) , set.js (调用写的方法))

    • config.yaml 文件

     rounds:
        - label: new-food
          description: Test performance of <newFood> name
          txNumber:
            - 10
          rateControl:
            - type: fixed-rate
              opts:
                tps: 1
          callback: benchmarks/samples/fisco-bcos/trace/newFood.js
    ​
    主要修改txNumber 和tps通过率。
    callback指定要测试的合约的方法的js文件路径。从工作目录下的benchmarks开始
  • 修改get.js文件

    • module.exports.run = function () {
          return bc.queryState(contx, 'helloworld', 'v0', null, 'get()');
      };
      ​
      --contx 不变
      --合约名 小写
      -- v0  不变
      -- 形参 
      -- 方法名
  • 修改set.js文件

    • function generateWorkload() {
          let workload = [];
          for (let i = 0; i < txnPerBatch; i++) {
              let w = {
                  'transaction_type': 'set(string)',
                  'name': 'hello! - from ' + process.pid.toString(),
              };
              workload.push(w);
          }
          return workload;
      }
      ​
      --'transaction_type' :指定合约 '方法名(方法形参)'
      设置测试合约的方法的参数
      '方法形参' : "参数值"
      '方法形参' : "参数值"
  • 查看要测试的合约

    • 合约存放路径 : caliper工作路径 /src/fisco-bcos/小写合约名文件夹/合约.sol

  • 复制要测试的合约路径后,配置caliper网络配置文件。指定caliper测试的合约路径

    • vim caliper-benchmarks/networks/fisco-bcos/test-nw/fisco-bcos.json

​ id 为 合约文件夹

​ path 为 存放合约的路径 (默认 caliper工作目录 / 开始 )

​ language 指定两种类型的合约 : solidity合约 | 预编译合约 ,

​ -- solidity 合约 :"language" : "solidity"

​ -- 预编译合约 : "language" : "precomplied"

​ -- 额外i添加字段 "address": "合约地址"

WeBASE 可视化平台部署

1、 webase.front

  • 节点前置平台部署

    • 解压安装包 unzip webase-front.zip

    • 拷贝sdk证书文件 。 (在build_chain 生成)

      • 链sdk包含ca.crt , sdk密钥文件

      • 拷贝 : cp -r nodes/${ip}/sdk/* ./conf/

  • 状态检查

1、检查进程

ps -ef | grep webase.front

2、检查进程端口

netstat -anlp | grep 5002

3、检查服务日志

grep "main run success" log/WeBASE-Front.log
​
2020-12-09 15:47:25.383 [main] INFO  Application() - main run success...

2、一键部署WeBASE

  • 前置条件 mysql 、python3环境、java环境、等

  • 修改配置文件

    • vim common.properties
      若为可视化部署 则修改visual-deploy.properties
      ​
      主要修改数据库配置和链配置
    • 使用已有链/搭建新链

      修改properties配置文件
      if.exist.fisco = no/yes
      ​
      配置已有链
      在properties配置文件中。
      已有链路径 ,start_all.sh脚本所在路径。且路径下存在sdk目录
      fisco.dir=/data/app/nodes/127.0.0.1
  • 状态检查

    • 检查各子系统进程

      ps -ef | grep 服务
      节点进程 ndoe
      节点前置进程 webase.front
      节点管理服务进程 webase.node.mgr
      节点管理平台 webase-web ==》 nginx
      签名服务进程 webase.sign
    • 检查进程端口

      netstat -anlp | grep 服务端口
      节点channel端口 20200
      webase-front 5002
      webase-node-mgr 5001
      webase-web 5000
      webase-sign 5004
      ​
      输出
      tcp        0      0 0.0.0.0:20200           0.0.0.0:*               (状态)LISTEN      (进程id)29069/fisco-bcos

3、数据库用户设置

  • 创建用户

    create USER 'username'@'ip' IDENTIFIED BY 'password';
    ​
    ip -- localhost 限制此用户只能从本地主机访问
    ip -- % 用户可以从任何主机上访问此数据库

    mysql中创建新的用户,新用户只有USAGE权限(只允许进行基本的连接MYSQL服务器和认证,没有对具体数据库或表的其他权限

  • 查看用户命令

    SHOW GRANTS FOR 'username'@'ip';
  • 赋予用户权限

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost';
赋予用户所有数据库权限
​
GRANT ALL PRIVILEGES ON 'database_name'.* TO 'username'@'localhost';
赋予用户特定数据库的权限
​
GRANT ALL PRIVILEGES ON 'database_name'.'table_name' TO 'username'@'localhost'
赋予用户特定数据库特定表的权限
​

  • 设置root用户远程访问

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION
​
*.*  --所有数据库和所有表
​
'用户'@'远程访问此主机数据库的ip' --%表示所有ip          
  • 创建test用户并且授权本地访问

GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
​
flush PRIVILEGES;

4、可视化部署

是只通过WeBASE管理平台,在多台主机上快速部署FISCO-BCOS底层节点和WeBASE-Front前置

1、系统环境
  • 可视化部署搭建至少2节点的区块链服务。WeBASE宿主机至少1G空闲内存(节点管理和签名服务)

  • 节点机。一个节点+前置镜像至少1G空闲内存。

  • 查询主机内存情况 Linux命令

    free -mh
  • 释放主机内存Linux命令

    echo [1|2|3] > /proc/sys/vm/drop_caches (释放所有内存)

2、系统环境

配置系统依赖分成宿主机(WeBASE管理平台)和节点主机(节点所在机)

宿主机 : 安装WeBASE-Node_Manager主机,配置Ansible , 配置Ansible 免密登录节点机

节点主机 : 用于安装节点的主机 ,配置docker 及docker用户组 ,配置Ansible 用户的sudo权限,安装Fisco-Bocs依赖

宿主机 也需要安装节点时,则需要同时配置

3、宿主机配置
  • 配置Ansible

    • 安装ansible (仅在宿主机安装节点时,则仅需安装ansible,无需host和免密配置。因为不需使用Ansible来管理远程主机)

    • 配置Ansible host列表

    • 配置Ansible 免密登录到节点主机

3.1安装Ansible
apt-get update
apt-get isntall ansible
​
验证
ansible --version
3.2配置Ansible host_key_checking
vi /etc/ansible/ansible.cfg
​
去掉注释
host_key_checking = Flase
3.3免密登录配置
  • 生成秘钥对

    ssh-keygen -t rsa -m PEM
    ​
    直接两次回车即可生成
  • 将公钥文件上传到需要免密登录的主机

    ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub root@[IP]
    ​
    ssh-copy-id 复制文件到远程注解上
    -o StriciHostKeyChecking=no  关闭严格主机密钥检查,第一次连接新服务器时,SSH会询问你是否信任该服务器,并将其添加到已知主机文件中,如果选择no,SSH将不会询问你,而是自动接收新的主机
    -i 指定要复制到远程服务器的公钥文件的位置
    ​
    输出结果出现 Number of key(s) added: 1 结果,表示免密登录配置成功
    检查 ssh -o StrictHostKeyChecking=no root@[IP]
  • 配置 Ansible Hosts与免密登录

    在/etc/ansible/hosts 中添加IP组 (节点主机的IP、免密登录账号、数组机私钥路径、SSH端口)
    ​
    vi /etc/ansible/hosts
    [webase]
    {远程主机ip} ansible_ssh_private_key_file={宿主机私钥文件路径} ansible_ssh_user={免密登录账号} ansible_ssh_port={ssh端口}
    • 测试Ansible

      执行Ansible的 --list-hosts命令查看是否已经添加陈功
      ​
      ansible ip组 --list-hosts
      ​
      oot@admin:~/.ssh# ansible webase --list-hosts
        hosts (1):
          192.168.44.154
    • 检测添加到hosts中各个远程主机能否被访问、免密配置是否已生效

      ansible ip组 -m ping
      ​
      192.168.44.154 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/bin/python"
          },
          "changed": false,
          "ping": "pong"
      }

4、节点机配置

配置Docker 需要在每个安装节点的主机上都要执行

4.1 配置Docker
  • 安装Docker服务

    # 该脚本是 Docker 官方提供的 Linux 自动安装脚本
    bash <(curl -s -L get.docker.com) 
  • 配置docker用户组(docker ps 必须使用sudo才能运行,则需要如下修改)

    • 检测docker ps 命令 
      
      若docker ps 报错 Permisstion Denied 则需要配置docker 用户组
      
      创建docker用户组
      sudo groupadd docker
      将当前用户添加到docker用户组 
      sudo usermod -aG docker &USER
      重启docker服务
      sudo systemctl restart docker
      切换或者退出当前账户,重新登录
      
      
      
  • 拉取docker镜像

比赛样式环境

安装ansible

生成ssh密钥文件

发送公钥到远程主机上

配置ansible hosts列表

修改 visual-deploy.properties 文件

数据库配置

修改节点管理服务配置文件 webase-node-mgr/conf/application.yaml 1. 部署方式 : deployType = 1 2. 签名子服务的ip

5、一键Docker部署

  • webase-deploy文件夹

1 、docker部署mysql (可选)
  • 若未安装mysql。可以在配置文件进行docker 拉取 mysql镜像 并 实例化一个docker容器的设置 。 (修改common.properties)

  • 配入 :*docker.mysql=1

不使用Docker启动Mysql ,则配置

节点管理子系统与当前主机mysql数据库连接信息

# 节点管理子系统mysql数据库配置
mysql.ip=127.0.0.1
mysql.port=3306
mysql.user=dbUsername
mysql.password=dbPassword
mysql.database=webasenodemanager

# 签名服务子系统mysql数据库配置
sign.mysql.ip=localhost
sign.mysql.port=3306
sign.mysql.user=dbUsername
sign.mysql.password=dbPassword
sign.mysql.database=webasesign


2 、部署
python3 deploy.py installDockerAll
​
​
# 一键部署
部署并启动所有服务        python3 deploy.py installDockerAll
停止一键部署的所有服务    python3 deploy.py stopDockerAll
启动一键部署的所有服务    python3 deploy.py startDockerAll
# 节点的启停
启动所有FISCO-BCOS节点:      python3 deploy.py startNode
停止所有FISCO-BCOS节点:      python3 deploy.py stopNode
# WeBASE服务的启停
启动所有WeBASE服务:      python3 deploy.py dockerStart
停止所有WeBASE服务:      python3 deploy.py dockerStop

3、状态检查
docker ps | grep 服务容器名
节点容器 fiscobcos
节点前置容器 webase-front
节点管理服务容器 webase-node-manager
节点平台容器 webase-web
签名服务容器 webase-sign


Docker 知识

  • docker ps 检测

    • 若docker ps 报错 Permission Denied 则需要配置docker 用户组

      • 创建docker用户组
        groupadd docker
        将当前登录的用户添加到docker用户组
        usermod -aG docker $USER
        重启docker服务
        serveice docker restart
        
        
        

Truffle测试

区块链浏览器

展示区块链系统的界面

一键部署

  • 前提条件

  • 依赖要求 : openssl curl wget git nginx dos2unix 等软件

  • 拉取安装脚本

    wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/fisco-bcos-browser/releases/download/v2.2.5/browser-deploy.zip
    ​
    解压安装包
    unzip browser-deploy.zip
    进入目录
    cd browser-deploy
  • 修改配置

    vim common.properties
    ​
    数据库的配置
    数据库IP:sed -i "s/127.0.0.1/${your_db_ip}/g" common.properties
    数据库端口:sed -i "s/3306/${your_db_port}/g" common.properties
    数据库用户名:sed -i "s/dbUsername/${your_db_account}/g" common.properties
    数据库密码:sed -i "s/dbPassword/${your_db_password}/g" common.properties
    数据库名称:sed -i "s/db_browser/${your_db_name}/g" common.properties
    ​
    前端服务端口:sed -i "s/5100/${your_web_port}/g" common.properties
    后端服务端口:sed -i "s/5101/${your_server_port}/g" common.properties
    ​
    例子(将数据库IP由127.0.0.1改为0.0.0.0):sed -i "s/127.0.0.1/0.0.0.0/g" application.yml
  • 部署服务

    python3 deploy.py installAll  部署并启动所有服务
    python3 deploy.py startAll  启动所有服务
    python3 deploy.py stopAll 停止所有服务
  • 状态检查

    检查后端server进程
    ps -ef | grep org.bcos.browser
    ​
    检查前端nginx进程
    ps -ef | grep browser | grep nginx
    ​
    检查进程端口
    netstat -anlp | grep 5101
    netstat -anlp | grep 5100
  • 访问

    https://ip:5100/
    
    
    

运维部署工具

功能 : 部署,管理,监控多机构多群组联盟链

FISCO_BCOS网络搭建

使用MySQL存储引擎

  • 安装mysql

    sudo apt install -y mysql-server mysql-client libmysqlclient-dev
  • 启动mysql

    service mysql start
    ​
    mysql -uroot -p
    设置root账户密码 (mysql 8.0版本禁止了)
    set password for '用户'@'访问主机' = password('密码');
  • 配置MySQL

    修改MySQL配置文件
    ​
    在/etc/mysql/my.cnf 配置文件中的[mysqld]添加
    [mysqld]
    max_allowed_packet = 1024M
    sql_mode =STRICT_TRANS_TABLES
    ssl=0
    default_authentication_plugin = mysql_native_password
  • 重启MySQL服务

    service mysql restart
  • 登录MySQL客户端验证

    mysql -uroot -p
    #执行下面命令,查看max_allowed_packet的值
    MariaDB [(none)]>  show variables like 'max_allowed_packet%';
    +--------------------+------------+
    | Variable_name      | Value      |
    +--------------------+------------+
    | max_allowed_packet | 1073741824 |
    +--------------------+------------+
    1 row in set (0.00 sec)
    ​
    #执行下面命令,查看sql_mode的值
    MariaDB [(none)]>  show variables like 'sql_mode%';
    +---------------+---------------------+
    | Variable_name | Value               |
    +---------------+---------------------+
    | sql_mode      | STRICT_TRANS_TABLES |
    +---------------+---------------------+
    1 row in set (0.00 sec)
    ​
    # 查看default_authentication_plugin的值
    MariaDB [(none)]> show variables like 'default_authentication_plugin';
    +-------------------------------+-----------------------+
    | Variable_name                 | Value                 |
    +-------------------------------+-----------------------+
    | default_authentication_plugin | mysql_native_password |
    +-------------------------------+-----------------------+
    1 row in set (0.01 sec)
  • 搭建链之后,在(群组配置文件中)修改存储配置为MySQL

    # 修改存储类型为mysql
    sed -i 's/type=rocksdb/type=mysql/g' ~/fisco/nodes/127.0.0.1/node*/conf/group.1.ini
    ​
    # 配置数据库用户名和密码(本教程中,所有节点均以root的用户名连接同一个数据库,root用户密码为123456)
    sed -i 's/db_username=/db_username=root/g' ~/fisco/nodes/127.0.0.1/node*/conf/group.1.ini
    sed -i 's/db_passwd=/db_passwd=123456/g' ~/fisco/nodes/127.0.0.1/node*/conf/group.1.ini
    ​
    # -----配置每个区块链节点在MySQL中创建的库名-----
    # 配置node0的数据库名称为db_node0
    sed -i 's/db_name=/db_name=db_node0/g' ~/fisco/nodes/127.0.0.1/node0/conf/group.1.ini
    ​
    # 配置node1的数据库名称为db_node1
    sed -i 's/db_name=/db_name=db_node1/g' ~/fisco/nodes/127.0.0.1/node1/conf/group.1.ini
    ​
    # 配置node2的数据库名称为db_node2
    sed -i 's/db_name=/db_name=db_node2/g' ~/fisco/nodes/127.0.0.1/node2/conf/group.1.ini
    ​
    # 配置node3的数据库名称为db_node3
    sed -i 's/db_name=/db_name=db_node3/g' ~/fisco/nodes/127.0.0.1/node3/conf/group.1.ini

docker

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值