1.1配置openssl
sudo apt install -y openss | curl
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
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
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
检查进程是否启动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
查看节点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...
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
例 : 四节点两群组饼并行
搭建默认的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
控制台2.6版本给予Java SDK实现,所以需要安装java并且配置环境
链接FISCO-BCOS节点,,查询区块链状态,部署和调用合约
sudo apt install -y default-jdk
安装默认的java版本
cd ~/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/下
启动
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. ________ ______ ______ ______ ______ _______ ______ ______ ______ | \| \ / \ / \ / \ | \ / \ / \ / \ | $$$$$$$$ \$$$$$$| $$$$$$\| $$$$$$\| $$$$$$\ | $$$$$$$\| $$$$$$\| $$$$$$\| $$$$$$\ | $$__ | $$ | $$___\$$| $$ \$$| $$ | $$ | $$__/ $$| $$ \$$| $$ | $$| $$___\$$ | $$ \ | $$ \$$ \ | $$ | $$ | $$ | $$ $$| $$ | $$ | $$ \$$ \ | $$$$$ | $$ _\$$$$$$\| $$ __ | $$ | $$ | $$$$$$$\| $$ __ | $$ | $$ _\$$$$$$\ | $$ _| $$_ | \__| $$| $$__/ \| $$__/ $$ | $$__/ $$| $$__/ \| $$__/ $$| \__| $$ | $$ | $$ \ \$$ $$ \$$ $$ \$$ $$ | $$ $$ \$$ $$ \$$ $$ \$$ $$ \$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ ============================================================================================= 启动成功
(开启控制台)将自己写的合约存放在控制台的目录下
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 合约名 合约地址 无参函数 | 有参函数 参数列表
账户分为用户账户和合约账户。用户账户用来标识和区分每一个独立用户
在公私钥体系的区块链系统中,每一个账户对应着一对公钥和私钥,公钥通过哈希等单向性算法得到账户地址(外部账户地址)
获取生成账户脚本
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
控制台加载私钥时需要指定私钥文件。如果不指定私钥文件,则默认使用控制台中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
链初始状态,没有任何权限账户记录。都是自由人
委员权限:治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号
增,删委员需要所有委员投票,有效票大于阈值才生效。大约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"
}
就是修改委员一次投票所拥有的有效投票数量 。 需要委员会的投票同意
updateCommitteeMemberWeight 账户地址 票数
[group:1]> updateCommitteeMemberWeight 0x52fc6a526ded4562756df2db54ea0076b675f53d 2
TransactionHash: 0x0b573cb88b4989a4ec61f09f535ade2343e5eaf6a076d693d31886d6e5d0f982
{
"code":0,
"msg":"Success"
}
当前环境 账号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服务
新增账号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
通过Java SDK于区块链节点建立连接,实现对区块链节点数据的读写访问请求。
获取部署合约的区块信息 getBlockByHash 部署合约返回的交易hash
查看交易回执 getTransactionReceip 交易hash
控制台切换账号 loadAccount 账号地址
设置系统中区块打包最大交易数量
setSystemConfigByKey tx_count_limit 数量
控制台中查看共识状态
getConsensusStatus
控制台中查看同步状态
getSyncStatus 查看当前控制台连接区块链节点的id。以及当前控制台连接的节点的peers列表
查看创世区块
getBlockByNumber 0
查看区块链节点的网络连接信息
getPeers
节点加入共识列表报错 ( "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
节点间简历链接需要证书来支持 。 所以首先要签发证书
获取证书生成脚本
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"
**获取新节点的公钥id** cat node5/conf/node.nodeid
使用控制台addSealer
**在控制台中** addSealer 新节点id
节点需要先退出群组在退出网络 。顺序需要用户自己保证
在控制台中使用removeNode node.id,将节点设置为游离节点
removeNode node.id
在控制台中使用getSealerList查询节点是否还在共识列表中
get SealerList
在节点的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列表中移除,并重启
证书拒绝列表
在节点config文件中[certificate_blacklist]中配置,拒绝此NodeID节点发起的连接
证书接收列表
在节点config文件中[certificate_whitelist]中配置,拒绝除白名单之外的所有节点发起的连接
基于作用范围(网络配置/账本配置)维度可划分为网络配置,影响整个网络的节点连接建立过程;
基于是否可改(可改配置/固定配置)维度可划分为可改配置,内容可改,重启后生效;
基于存放位置(本地存储/链上存储)维度可划分为本地存储,内容记录在本地,不存于链上
黑名单:拒绝写在黑名单中的节点连接
白名单:拒绝所有未配置在白名单中的节点连接。白名单为空表示不开启,接受任何连接。
链证书 》机构证书 》节点证书
多群组架构中
一条链拥有 链证书 和 链私钥 ,链私钥由联盟链委员会管理 (类似于链的集合体,每条链都需要将自己的私钥给其管理)
联盟链委员会可以使用机构的证书请求文件 agency.csr 签发机构证书 agency.crt
ca.crt 链证书 ca.key 链私钥
机构私钥由机构管理员持有,可以对机构下属节点签发节点证书
节点证书是节点身份凭证、是与其他持有合法证书的节点建立SSL连接,并进行加密通信的基础
进行SSL加密通信时,拥有相同链证书ca.crt的节点才可建立连接(在同一条链上的节点)
节点证书node.crt包含了节点证书和机构证书的信息,节点与其他节点/SDK通信验证时会用自己的私钥node.key对消息进行签名,并发送自己的node.crt至对方验证
sdk证书是sdk与节点通信的凭证、机构生成sdk证书,运行sdk与节点进行通信
生成链证书
联盟链委员会使用openssl命令请求链私钥ca.key , 根据ca.key生成链证书
生成机构证书
机构使用openssl命令生成机构私钥 agency.key
机构使用机构私钥agency.key,得到机构证书请求文件agency.csr,将其发送到联盟链委员会
联盟链委员会使用链私钥ca.key,根据得到的机构证书请求文件生成机构证书并发回
生成节点/SDK证书
节点生成私钥node.key 和证书请求文件node.csr,机构管理员使用私钥agency.key和证书请求文件node.csr为节点颁发证书,生成sdk证书相同
获取检测证书有效期脚本,在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)
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
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
执行此命令,需要到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 ofname 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": "合约地址"
节点前置平台部署
解压安装包 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...
前置条件 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
创建用户
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;
是只通过WeBASE管理平台,在多台主机上快速部署FISCO-BCOS底层节点和WeBASE-Front前置
可视化部署搭建至少2节点的区块链服务。WeBASE宿主机至少1G空闲内存(节点管理和签名服务)
节点机。一个节点+前置镜像至少1G空闲内存。
查询主机内存情况 Linux命令
free -mh
释放主机内存Linux命令
echo [1|2|3] > /proc/sys/vm/drop_caches (释放所有内存)
配置系统依赖分成宿主机(WeBASE管理平台)和节点主机(节点所在机)
宿主机 : 安装WeBASE-Node_Manager主机,配置Ansible , 配置Ansible 免密登录节点机
节点主机 : 用于安装节点的主机 ,配置docker 及docker用户组 ,配置Ansible 用户的sudo权限,安装Fisco-Bocs依赖
宿主机 也需要安装节点时,则需要同时配置
配置Ansible
安装ansible (仅在宿主机安装节点时,则仅需安装ansible,无需host和免密配置。因为不需使用Ansible来管理远程主机)
配置Ansible host列表
配置Ansible 免密登录到节点主机
apt-get update apt-get isntall ansible 验证 ansible --version
vi /etc/ansible/ansible.cfg 去掉注释 host_key_checking = Flase
生成秘钥对
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"
} 配置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
webase-deploy文件夹
若未安装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
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
docker ps | grep 服务容器名 节点容器 fiscobcos 节点前置容器 webase-front 节点管理服务容器 webase-node-manager 节点平台容器 webase-web 签名服务容器 webase-sign
docker ps 检测
若docker ps 报错 Permission Denied 则需要配置docker 用户组
创建docker用户组 groupadd docker 将当前登录的用户添加到docker用户组 usermod -aG docker $USER 重启docker服务 serveice docker restart
展示区块链系统的界面
前提条件
依赖要求 : 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/
功能 : 部署,管理,监控多机构多群组联盟链
安装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