区块链的搭建和运维4
(1) 搭建基于MySQL分布式存储的区块链
1.构建单群组网络节点
使用开发部署工具构建单群组网络节点,命令如下:
bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545
2. 启动 MySQL 并设置账户密码
输入如下命令,启动 MySQL 服务,右下角出现 [OK] 字样表示启动成功
service mysql start
MySQL 服务启动成功后,在终端输入如下命令,登录 mysql
mysql -uroot -p
输入如下命令,设置 root 账户的密码为 ”123456“
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
输入如下命令,退出 MySQL
quit;
3.配置 MySQL
在终端输入如下命令,编辑 MySQL 配置文件(/etc/mysql/my.cnf),并在键盘输 入”i“,进入输入模式
vim /etc/mysql/my.cnf
在文件末尾添加如下内容,输入完成后,在键盘左上角按 ”ESC“ 键,输入”:wq“ 保 存退出,如下图
[mysqld]
max_allowed_packet = 1024M
sql_mode = STRICT_TRANS_TABLES
ssl = 0
default_authentication_plugin = mysql_native_password
输入如下命令,重启 MySQL 服务
service mysql restart
1.7 验证参数
输入如下命令,登录 MySQL 数据库,需要输入之前设置的密码
mysql -uroot -p
输入如下命令,查看 max_allowed_packet 的值
show variables like 'max_allowed_packet%';
输入如下命令,查看 sql_mode 的值
show variables like 'sql_mode%';
输入如下命令,查看 default_authentication_plugin 的值
show variables like 'default_authentication_plugin';
Cb5.png&pos_id=img-wNAbqHJg-1723008968840)
输入如下命令,退出 MySQL 数据库
quit;
4.修改节点存储配置
修改 node0 的数据存储配置,输入以下命令,并在键盘输入”i“,当左下角出现 ”-- 插入–“ 时进入输入模式
vim nodes/127.0.0.1/node0/conf/group.1.ini
其他节点同样操作
5.启动节点
输入如下命令,启动所有节点
bash nodes/127.0.0.1/start_all.sh
(2) 配置控制台
再终端输入如下命令,解压控制台压缩包,
tar -zxvf console.tar.gz
在终端输入如下命令,将节点 sdk 证书拷贝到控制台 conf 目录下
cp nodes/127.0.0.1/sdk/* console/conf/
输入如下命令,将控制台 conf 目录下的 config-example.toml 文件重命名为 config.toml 文件
cp console/conf/config-example.toml console/conf/config.toml
输入如下命令,启动控制台
bash console/start.sh
(3) 委员账户权限操作
1.账户准备
在控制台输入如下命令,生成账户地址
newAccount
在新打开的终端输入如下命令(私钥文件根据实际情况输入),使用创建的账户启 动控制台
bash fisco/console/start.sh 1
fisco/console/account/ecdsa/0x742bceda913fdc79595198c86634b45802754
5bc.pem
在控制台再次输入如下命令,生成账户地址
newAccount
在新打开的终端输入如下命令(私钥文件根据实际情况输入),使用创建的账户启 动控制台
在第一个控制台输入如下命令,查看控制台加载的账户地址
listAccount
为方便理解,本实验规定如下:
加载 “0xa29f51b0…” 账户的为 1 号控制台,账户地址用 A 表示
加载 “0x742bceda…” 账户的为 2 号控制台,账户地址用 B 表示
加载 “0x3eddcbf7…” 账户的为 3 号控制台,账户地址用 C 表示
2.添加委员
在 1 号控制台输入如下命令,添加账户A为委员 需要注意的是,初始系统无权限设置记录,任何账户均可使用权限设置,一旦设置权限 后,只有委员才可授权委员账号;另外,添加委员操作需要投票决定,由于初始系统无 委员账户,任意地址投票即可生效
grantCommitteeMember 0xa29f51b088808a08497d04897da9700475a6716d
在 1 号控制台输入如下命令,可查看系统中的委员账户
listCommitteeMembers
在 2 号控制台中输入如下命令,尝试将账户B添加为委员
grantCommitteeMember 0x742bceda913fdc79595198c86634b458027545bc
在新打开的终端中输入如下命令,使用 root 账户登录 MySQL,并连接到 db_node0 数据库
mysql -uroot -p123456 -A db_node0
在 MySQL 输入如下命令,查看权限表(sys_table_access)
select * from _sys_table_access_;
可以看到,委员账户A 对 sys_config、sys_consensus、sys_table_access 三个 表具有写入权限。
在控制台 1 输入如下命令,将账户B添加为委员 添加委员操作需要投票决定,此时系统中只有一位委员(账户A),生效阈值=有效票/ 总票数=1/1=1>0.5,所以立即生效。
grantCommitteeMember 0x742bceda913fdc79595198c86634b458027545bc
在 1 号控制台输入如下命令,可查看系统中的委员账户
listCommitteeMembers
此时系统中已经有两个委员账户,分别为账户A和账户B。
在 MySQL 输入如下命令,再次查看权限表(sys_table_access)
select * from _sys_table_access_;
可以看到,委员账户(账户B)对 sys_config、sys_consensus、 sys_table_access 三个表具也具有写入权限。
3.撤销委员
在 1 号控制台输入如下命令,撤销账户B的委员角色
grantCommitteeMember 0x742bceda913fdc79595198c86634b458027545bc
在 1 号控制台输入如下命令,查看系统中的委员账户
listCommitteeMembers
此时系统中有两个委员账户(账户A和账户B),账户A账户投票后的生效阈值=有效票/ 总票数=1/2=0.5,而 FISCO BCOS 的默认有效阈值必须大于 0.5 才可生效,所以账户A 投票后, 账户B仍是委员。
在 2 号控制台输入如下命令,撤销账户B的委员角色
grantCommitteeMember 0x742bceda913fdc79595198c86634b458027545bc
在 1 号控制台输入如下命令,查看系统中的委员账户
listCommitteeMembers
当账户B也投票后,有效阈值=有效票/总票数=2/2=1>0.5,撤销账户B委员的提议通 过,因此再次查询委员账户列表只有账户A。
在 MySQL 输入如下命令,再次查看权限表(sys_table_access)变化情况
select * from _sys_table_access_;
撤销委员并不会删除权限表中的数据,而是以 status 字段来标注该账户是否可用,0 表示该账户地址可用,1 表示不可用。
4.修改委员权重
在 1 号控制台输入如下命令,添加账户C为委员
grantCommitteeMember 0x3eddcbf715b02701a1d061ade21fe938642f50a4
在 1 号控制台输入如下命令,可查看系统中的委员账户
listCommitteeMembers
此时系统中只有一位委员(账户A),生效阈值=有效票/总票数=1/1=1>0.5,所以立即 生效。
在 1 号控制台输入如下命令,修改账户A的权重为 2
updateCommitteeMemberWeight
0xa29f51b088808a08497d04897da9700475a6716d 2
此时系统中存在两个委员(账户A和账户C),因此账户A投票后不能立即生效,还需要 账户C进行投票才能生效。
在 3 号控制台输入如下命令,修改账户A的权重为 2
updateCommitteeMemberWeight
0xa29f51b088808a08497d04897da9700475a6716d 2
账户C投票后,有效阈值=有效票/总票数=2/2=1>0.5,立即生效,账户A的权重修改为 2。
在 1 号控制台输入如下命令,查看账户A的权重
queryCommitteeMemberWeight
0xa29f51b088808a08497d04897da9700475a6716d
在 1 号控制台输入如下命令,查看账户C的权重
queryCommitteeMemberWeight
0x3eddcbf715b02701a1d061ade21fe938642f50a4
在 1 号控制台输入如下命令,添加账户 B 为委员
grantCommitteeMember 0x742bceda913fdc79595198c86634b458027545bc
在 1 号控制台输入如下命令,可查看系统中的委员账户
listCommitteeMembers
修改权重后,账户A的权重为2,账户A投票后,有效阈值=有效票/总票数=2/3>0.5,立 即生效,即不需要账户C再进行投票。
5.修改生效阈值
在 1 号控制台输入如下命令,修改系统的有效阈值为75(默认为50)
updateThreshold 75
此时系统中有三个委员(账户A权重为2,账户B权重为1,账户C权重为1),生效阈值 =有效票/总票数=2/4=0.5=默认有效阈值(0.5),即还需要其他委员投票才能生效。
在 2 号控制台输入如下命令,修改系统的有效阈值为75(默认为50)
updateThreshold 75
在账户B投票成功后,生效阈值=有效票/总票数=3/4=0.75>0.5,修改系统有效阈值的 提议通过。
在 1 号控制台输入如下命令,查询系统有效阈值
queryThreshold
在 1 号控制台输入如下命令,撤销账户C的委员角色
revokeCommitteeMember 0x3eddcbf715b02701a1d061ade21fe938642f50a4
此时系统中有三个委员(账户A权重为2,账户B权重为1,账户C权重为1),生效阈值 =有效票/总票数=2/4=0.5<0.75,即还需要其他委员投票才能生效。
在 2 号控制台输入如下命令,撤销账户C的委员角色
revokeCommitteeMember 0x3eddcbf715b02701a1d061ade21fe938642f50a4
在账户B投票成功后,生效阈值=有效票/总票数=3/4=0.75=0.75,即还需要账户C投票 才能生效。
在 3 号控制台输入如下命令,撤销账户C的委员角色
revokeCommitteeMember 0x3eddcbf715b02701a1d061ade21fe938642f50a4
在账户C投票成功后,生效阈值=有效票/总票数=4/4=1>0.75,立即生效。
(4) 运维账户权限操作
1.新增运维
在 1 号控制台输入如下命令,新增账户C为运维账户
grantOperator 0x3eddcbf715b02701a1d061ade21fe938642f50a4
运维账户的新增和撤销不需要投票操作,由委员账户授权即可。
在 1 号控制台输入如下命令,查看运维账户列表
listOperators
2.部署调用合约
在 3 号控制台输入如下命令,使用运维账户部署合约
deploy HelloWorld
台输入如下命令,调用刚才部署的合约(合约地址根据自己的实际情 况输入)
call HelloWorld 0x0bbc3309b7eddb87f59c233d4e7dec5280934b21 get
3.冻结和解冻合约
在 3 号控制台输入如下命令,冻结刚才部署的合约(合约地址根据自己的实际情 况输入)
freezeContract 0x0bbc3309b7eddb87f59c233d4e7dec5280934b21
在 3 号控制台输入如下命令,尝试调用合约
call HelloWorld 0x0bbc3309b7eddb87f59c233d4e7dec5280934b21 get
在 3 号控制台输入如下命令,解冻合约(合约地址根据自己的实际情况输入)
unfreezeContract 0x0bbc3309b7eddb87f59c233d4e7dec5280934b21
4.撤销运维账户
在 1 号控制台输入如下命令,撤销账户C的运维权限
revokeOperator 0x3eddcbf715b02701a1d061ade21fe938642f50a4
在 1 号控制台输入如下命令,查看运维账户列表
listOperators