节选自b站内容和公司内部培训内容,并通过fisco-bcos实战,可初步了解区块链的一些技术体系
一、区块链发展概述及类型和特征
1.1 区块链的概念
区块链是黑科技,其实并没有发明新技术,是一系列技术的组合。区块链:信任的机器.
1.2 区块链的起源
1.3 区块链的发展历程
1.4 区块链的类型和特征
区块链浏览器
https://mempool.space/zh/
二、区块链的常见技术架构
2.1 技术架构
2.2 核心技术
三、区块链的常见应用
3.1 生态环境监测
3.2 医疗废弃物追踪解决
3.3 区块链在电子政务领域的应用
3.4 在物流与物流金融上的应用
3.5 在大数据物联网结合的应用
四、区块链的应用系统价值和趋势
4.1 区块链应用系统的价值
4.2 区块链的核心商业模式
4.3 区块链的发展趋势和挑战
挑战
五、密码学基础
5.1 对称密码体系
对称密码是一种加密方法,其中使用相同的密钥进行加密和解密。这种加密方法的优点是速度快,适合大量数据的加密。但是,它的主要缺点是密钥的分发和管理非常困难,因为每个通信双方需要共享一个唯一的密钥,而且这个密钥必须保密。如果密钥被泄露,那么加密的数据就可能被破解。常见的对称加密算法有DES、AES、RC4等。谍战片中的密码
5.2 公钥密码体系
公钥密码体系是一种加密方法,其中使用一对密钥进行加密和解密。这对密钥由一个公钥和一个私钥组成,公钥用于加密数据,私钥用于解密数据。这种加密方法的优点是密钥的分发和管理相对容易,因为公钥可以公开,而私钥只需要保密。此外,它还提供了数字签名的功能,可以验证消息的来源和完整性。但是,它的主要缺点是加密和解密的速度相对较慢,不适合大量数据的加密。常见的公钥加密算法有RSA、ECC等
5.3 哈希算法
哈希算法是一种将任意长度的数据映射为固定长度的输出的算法,通常用于数据的完整性验证和密码存储。哈希算法的主要特性是:
确定性:相同的输入总是产生相同的输出。
快速计算:对任意给定的数据能够快速计算出其哈希值。
抗碰撞性:难以找到两个不同的输入,使得它们有相同的输出。
雪崩效应:输入的微小变化会导致输出的巨大变化。
哈希算法在密码学中有着广泛的应用,例如在数字签名、数据完整性验证和安全存储密码等领域。常见的哈希算法有MD5、SHA-1、SHA-256等
六、区块链中的英文专业术语
七、FISCO BCOS 实战
FISCO BCOS 2.0 技术文档
https://fisco-bcos-documentation.readthedocs.io/zh-cn/latest/
WeBASE 技术文档
https://webasedoc.readthedocs.io/zh-cn/latest/index.html
7.1 搭建单群组网络FISCO BCOS联盟链
openssl version
wget --version
sudo apt install -y openssl curl
mkdir fisco && cd fisco
curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.11.0/build_chain.sh && chmod u+x build_chain.sh
ls0f -i:30300-30303
lsof -i:20200-20203
lsof -i:8545-8548
bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545
pkill -9 fisco-bco
./nodes/127.0.0.1/start_all.sh
ps -ef | grep -v grep | grep fisco-bcos
ss -ntlp |grep fisco-bcos
# 查看节点连接数
tail -f nodes/127.0.0.1/node0/log/log* | grep connected
# 查看节点共识
tail -f nodes/127.0.0.1/node0/log/log* | grep +++
7.2 搭建星型拓扑网络FISCO BCOS联盟链
区块链是一种分布式数据库技术,它通过去中心化的方式记录和验证交易信息。在区块链网络中,节点是参与网络的计算机或服务器,它们共同维护着整个区块链的状态。
机构通常指的是组织、公司或政府等实体,它们可以作为区块链网络中的参与者,拥有自己的节点,并参与到区块链的交易和共识过程中。这些机构可以通过区块链技术实现去中心化的数据交换、智能合约执行等功能。
群组是指一组具有共同目标或兴趣的人或实体,他们可以在区块链网络上形成一个子网络,共享信息和资源。群组可以是公开的,任何人都可以加入;也可以是私有的,只有特定的成员才能加入。群组的成员可以通过共识机制来达成共识,共同管理和维护群组内的区块链网络。
总的来说,区块链节点是区块链网络的基本组成部分,机构和群组则是区块链网络中的参与者和组织形式。通过这些参与者和组织,区块链可以实现去中心化的信任机制,确保数据的安全性和可靠性。
vim ipconf
......
127.0.0.1:1 A 1,2,3
127.0.0.1:1 B 1,
127.0.0.1:1 C 2
127.0.0.1:1 D 3
......
#p2p channel jsonrpc
bash build_chain.sh -f ipconf -p -30300,20200,8545
# 启动
bash nodes/127.0.0.1/start_all.sh
# 查看进程
ps -ef | grep -v grep | grep fisco-bcos
# 查看节点连接数
tail -f nodes/127.0.0.1/node0/log/log* | grep connected
# 查看节点共识
tail -f nodes/127.0.0.1/node0/log/log* | grep +++
7.3 搭建并行多组网络FISCO BCOS联盟链
# -o 指定生成文件所在目录
bash build_chain.sh -l 127.0.0.1:4 -o multi_nodes -p 30300,20200,8545
bash multi_nodes/127.0.0.1/start_all.sh
# 查看节点共识
tail -f nodes/127.0.0.1/node0/log/log* | grep +++
# 将群组2加入区块链.
# nodes/127.0.0.1/node0/conf/
# 并行多组区块链中,每个群组的ini文件相同,但genesisi中【group.id】不同,
# 减少路径输入麻烦,先进入路径
cd multi_nodes/127.0.0.1
# cp
cp node0/conf/group.1.genesisi node0/conf/group.2.genesisi
sed -i "s/id=1/id=2/g" node0/conf/group.2.genesisi
cp node0/conf/group.2.genesisi node1/conf/group.2.genesisi
cp node0/conf/group.2.genesisi node2/conf/group.2.genesisi
cp node0/conf/group.2.genesisi node3/conf/group.2.genesisi
cp node0/conf/group.1.ini node0/conf/group.2.ini
cp node0/conf/group.2.ini node1/conf/group.2.ini
cp node0/conf/group.2.ini node2/conf/group.2.ini
cp node0/conf/group.2.ini node3/conf/group.2.ini
stop_all.sh && start_all.sh
tail -f nodes/127.0.0.1/node0/log/log* | grep +++
方法2
vim ipconf
.........
127.0.0.1:4 A 1,2
........
bash build_chain.sh -o multi_nodes -f ipconf -p 30300,20200,8545
国密版FISCO BCOS联盟
bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -g -G
7.4 RPC 调用和配置及使用控制台
RPC(Remote ProcedureCall)是一种远程过程调用协议,它允许一台计算机上的程序调用另一台计算机上的程序的子程序或函数。
RPC的主要目的是让分布式系统中的各个节点能够像调用本地函数一样调用其他节点上的函数或服务
#创建一个 JSON-RPC 请求对象,包含以下字段:
#jsonrpc: 协议版本,通常为 "2.0"。
#method: 要调用的远程方法的名称。
#params: 传递给远程方法的参数(可选)
#2.0启用了多账本机制,本规范要求传入的第一个参数必须为群组ID。
#id: 请求的唯一标识符(可选,但推荐使用)
#|jq:将curl命令的输出通过管道传递给jq命令进行处理。
#jq是一个轻量级且灵活的命令行JSON处理器,用于解析、过滤和格式化JSON数据。
# 获取节点版本信息
# 8545为node0的信息
curl -X POST --data '{"jsonrpc": "2.0",
"method": getClientVersion,"params":[1],"id":1}'
http://127.0.0.1:8545 |jq
# 获取节点连接信息
getPeers
# 查看区块高度
getBlockNumber
# 查看区块信息
getBlockByNumber
配置和使用控制台
tar -xf consle.tar.gz
tree consle
#将节点sdk证书拷贝到控制台conf下
#-r 文件和文件夹
cp nodes/127.0.0.1/sdk/* consle/conf/
cp -r nodes/127.0.0.1/sdk/* console/conf/
#将conf下config-example.toml文件重命名config.toml
#-n 不覆盖存在的
cp consle/conf/config.toml consle/conf/config.toml
cp -n console/conf/config-example.toml console/conf/config.toml
ls consle/conf/
# 启动控制台
bash console/start.sh
在FISCO-BCOS区块链系统中,有三种不同类型的节点,它们在网络中各自承担着不同的角色和功能。具体包括:
记账节点(共识节点):记账节点是网络中参与共识算法,并负责验证交易、打包区块的节点。这些节点通过共识算法来确认交易的有效性,并将有效的交易打包成区块添加到区块链上。记账节点的数量可以根据实际需求进行配置,但必须至少为一个。
观察节点:观察节点不参与共识流程,但它们可以同步区块信息和交易数据,起到观察和备份的作用。这种类型的节点适用于只需要查看链上数据,而不需要参与共识的场景。
群组节点:群组节点则是承载某个群组内多个相关联组织的节点集合,这些组织可能共享某些业务数据或需要在同一群组内进行协同工作。群组节点有助于实现跨组织的数据共享和业务合作。
#查看群组共识节点列表
getSealerList
#查看群组观察节点列表
getOberverList
#查看连接p2p节点的nodeID列表
getNodeIDList
# 查看node0的nodeid
cat fisco/nodes/127.0.0.1/node0/conf/node.nodeid
# 获取节点连接信息中有id和端口
getPeers
#设置共识节点
addSealer c1bd77e188cd07。。。。。。
#设置观察节点
addObserver c1bd77e188cd07。。。。。。
#设置游离节点
removeNode c1bd77e188cd07。。。。。。
# 验证游离节点 quit
vim console/conf/config.toml
.........
peers=["127.0.0.1:20201"]
.........
# 启动控制台游离节点登录失败
bash console/start.sh
7.5 区块链扩容和退出
# -c 指定机构证书及私钥所在路径
# -o 输出到指定文件夹,其中node4/conf 中会保存机构agency新签的发证和私钥
bash gen_node_cert.sh -h
bash gen_node_cert.sh -c nodes/cert/agency -o nodes/127.0.0.1/node4
tree nodes/127.0.0.1/node4
# 准备节点配置文件
cd nodes/127.0.0.1
cp node0/conf/group.1.genesis node0/conf/group.1.ins node4/conf/
cp node0/config.ini node0/start.sh node0/stop.sh node4/
## 只需加一node4
vim node4/config.ini
.........
[rpc]
channel_listen_port=20204
jsonrpc_listen_port=8549
[p2p]
node.4=127.0.0.1:30304
.........
# 将新节点加入区块链
bash node4/start.sh
# 注意复制log等级info
tail -f node4/log/log*|grep connected
# 将节点加入群组
cat node4/conf/node.nodeid
bash ../../console/start.sh
#控制台输入
addSealer node.nodeid
#查看
getSealerList
#控制台加入查看共识
tail -f node4/log/log*|grep +++
#退出
removeNode node.nodeid
quit
#分号注释掉
vim node4/config.ini
..........
[p2p]
;node.1=127.0.0.1:30301
;node.2=127.0.0.1:30302
;node.3=127.0.0.1:30303
;node.4=127.0.0.1:30304
........
bash node4/stop.sh && bash node4/start.sh
# connect=0 退网成功
tail -f node4/log/log*|grep connected
7.6 基于mysql分布式存储区块链
# 安装nodes console后,安装配置mysql
apt install msyql-server mysql-client libmysqlclient-dev
service mysql start
systemctl start mysql.services
mysql -uroot -p
#用户密码存储在mysql数据库的user表中,对应的字段是authentication_string。authentication_string字段中存储的是经过加密的密码,不应直接对其进行修改。如果需要修改用户密码,请使用alter user命令进行修改
>ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
# 注意需要加WITH mysql_native_password
> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
>quit
vim /etc/msyql/my.cnf
.........
22 [mysqld]
23 max_allowed_packet = 1024M
24 sql_mode = STRICT_TRANS_TABLES
25 ssl = 0
26 default_authentication_plugin = mysql_native_password
.........
> show variables like 'max_allowed_packet';
vim nodes/127.0.0.1/node0/conf/group.1.ini
.........
19 [storage]
21 type=mysql
35 db_ip=127.0.0.1
36 db_port=3306
37 db_username=root
38 db_passwd=123456
39 db_name=db_node0
........
# 启动
bash nodes/127.0.0.1/start_all.sh
#使用控制台操作curd
bash consele/start.sh
create table t_demo(name varchar,it_name varchar,it_id varchar primary key(name))
insert into t_demo(name,it_name,it_id) values (fruit,orage,1)
7.7 基于控制台理解账户和角色
# 脚本生成账户
# 生成pem格式存储的账户私钥
bash ./console/get_account.sh
# 从私钥文件计算账户地址
bash ./console/get_account.sh -k account/*.pem
# 生成pkcs12格式存储的私钥
bash ./console/get_account.sh -p
# 从私钥文件计算账户地址
bash ./console/get_account.sh -P account/*.12
newAccount
newAccount p12 123456
listAccount
loadAccount ...*...
# 按某用户启动
bash console/start.sh 1 console/account/ecdsa/*.pem
bash console/start.sh 1 -p12 console/account/ecdsa/*.p12
角色
#增加委员
grantCommitteeMember id
listCommitteeMember id
#撤销委员
revokeCommitteeMember id
#修改权重
updateCommitteeMemberWeight id 2
#查询权重
queryCommitteeMemberWeight id
#查询阈值
queryThreshold
#mysql中查询
>select*from _sys_table_access_;
#新增运维账户
grantOperator id
listOperator
revokeOperator id
# 部署合约
deploy HelloWorld
# 调用合约
call HelloWorld contractaddress get
黑白名单
#
cat nodes/127.0.0.1/node1/conf/node.node.id
vim nodes/127.0.0.1/node0/config.ini
# 黑名单能够拒绝与指定节点的配置,
# 白名单不配置,可与任意节点连接
#混合设置会在白名单的基础上拒绝黑名单里的节点连接
.........
[certificate_blacklist]
crl.0=
crl.1=
[certificate_whitelist]
crl.0=
.........
bash nodes/127.0.0.1/node0/stop.sh && start.sh
curl -X POST --data '{"jsonrpc": "2.0",
"method": "getPeers","params":[1],"id":1}'
http://127.0.0.1:8545 |jq
# 或设置控制台只运行连接node0
vim console/conf/config.toml
.........
21 [network]
22 #peers=["127.0.0.1:20200", "127.0.0.1:20201"] # The peer list to connect
23 peers=["127.0.0.1:20200"] # The peer list to connect
.........
bash console/start.sh
getPeers
##SDK白名单设置
# 不通过
vim nodes/127.0.0.1/node0/conf/group.1.ini
.......
73 [sdk_allowlist]
77 public_key.0=b8acb51b9fe84f88d70646be36f31c52e67544ce56faf3dc8ea4cf1b0ebff0864c6b218fdcd9cf9891ebd414a995847911bd26a77of4293000 85f37e1131f36
.......
bash nodes/127.0.0.1/node0/scripts/reload_sdk_allowlist.sh
# 通过
cat nodes/127.0.0.1/node0/sdk/sdk.publikey
vim nodes/127.0.0.1/node0/conf/group.1.ini
bash nodes/127.0.0.1/node0/scripts/reload_sdk_allowlist.sh
7.8 共识异常模拟
关闭node2,node3后共识异常
将异常点改为观察点
# 关闭node0,node1
# 分别在node0 ,和node1上修改观察者。
update _sys_consensus_ set type='observer' where id ='10006'
# 重新再启动node0,node1后可以执行合约
#node2,node3恢复后,在node2,node3上将改为共识节点
7.9 WeBASE管理平台
#节点前置服务部署
unzip webase-front.zip
cp ../nodes/127.0.0.1/sdk/* ./conf/
bash start.sh
bash status.sh
tail -f log/WeBASE-Front.log |grep success
http://localhost:5002/WeBASE-Front
# 管理部署
unzip webase-deploy.zip
cd webase-deploy
vim common.properties
........
配置数据库
if.exist.fisco=yes
fisco.dir=//
........
python3 deploy.py installALL
localhost:5800