搭链
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