前言
8月中旬参加了浙江省的区块链应用操作员竞赛,以下是当时学习的实操部分的代码笔记。该笔记的内容来自21年的课程,仅用参考,部分代码可能记的不太清楚,且因环境不同,部分代码可能会执行失败。
区块链运维
系统环境介绍
pwd #查看当前目录
ls #查看当前目录下内容
mkdir fabric #当前目录下创建fabric文件夹
cd fabric #进入fabric目录
vi test.yaml #创建test.yaml文件,并进入vi的编辑页面
shift+i #输入模式
esc #退出编辑模式
shift+: #出现一个冒号
wq #保存退出vi
cat test.yaml #输出test.yaml文件内容
cd .. #上级目录
rm -rf fabric #删除fabric文件夹和里面的文件
系统环境搭建准备
(1)git安装
yum install git -y #安装git
git version #查看git版本
(2)fabric-samples下载
git clone https://github.com/hyperledger/fabric-samples.git #下载fabric-samples代码
cd fabric-samples #进入文件夹
git checkout v1.4.3 #切换v1.4.3的tag分支
git branch #查看当前分支
wget https://github.com/hyperledger/fabric/releases/download/v1.4.3/hyperledger-fabric-linux-amd64-1.4.3.tar.gz #下载二进制工具文件,一个压缩包,tar格式
cp hyperledger-fabric-linux-amd64-1.4.3.tar.gz ../ #复制文件
tar -zxvf hyperledger-fabric-linux-amd64-1.4.3.tar.gz #解压,出两个文件夹
mv bin fabric-samples/ #移动文件夹
mv config fabric-samples/ #移动文件夹
ls fabric-samples #查看
(3)docker安装
yum update -y #更新yum包
yum install -y yum-utils #安装yu-utils工具
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos.docker-ce.repo #添加docker稳定的yum源
yum install docker-ce -y #安装docker
docker version #查看docker版本
systemctl start docker #启动docker服务
docker images #查看已下载镜像
(4)docker-compose安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` >/usr/local/bin/docker-compose #下载docker-compose文件,放到/usr/local/bin/下,docker-compose是一个二进制文件
chmod +x /usr/local/bin/docker-compose #给docker-compose增加执行权限
docker-compose
系统配置-配置方式
(1)docker镜像下载
#配置docker国内镜像源
vi /etc/docker/daemon.json #修改文件
shift+i #输入模式
#文件中写入
{
"registry-mirrors":["http://docker.mirrors.ustc.edu.cn"]
}
esc #退出编辑模式
shift+: #出现一个冒号
wq #保存退出vi
cat daemon.json #输出daemon.json文件内容
systemctl restart docker #重启docker服务,即设置完成
docker images
#下载docker镜像
docker pull hyperledger/fabric-orderer:latest
docker pull hyperledger/fabric-peer:latest
docker pull hyperledger/fabric-tools:latest
#完成后查看镜像
docker images
(2)yaml文件介绍
大小写敏感
缩进表示层级关系
缩进不允许tab,只允许空格,空格数不重要,相同层级元素左对齐
表示注释
对象键值对 key: value,冒号后面加空格
key:{key1: value, key2: value}
节点和客户服通信方式
(1)byfn.sh脚本介绍
./byfn.sh up -o solo -n #启动示例网络,使用单orderer共识,不装智能合约
./byfn.sh up -o solo #启动示例网络,使用单orderer共识,安装智能合约
./byfn.sh down #停止网络,清理环境
(2)byfn.sh脚本讲解
cd fabric-samples
cd first-network/
cat byfn.sh
./byfn.sh -h
#solo共识网络启动
docker images #检查镜像
systemctl start docker #若提示错误信息,说明docker未启动,输入指令启动
docker images #检查镜像
cd fabric-samples/first-network #进入目录
./byfn.sh up -o solo -n #启动solo共识网络,有个确认,输入y回车
docker ps #查看节点,可以看到起了四个peer
系统配置 区块链数据存储设置方式
(1)Fabric数据库介绍
levedb 键值对数据库
couchdb 文档型数据库,可以表示更加复杂的结构
- 分布式
- 面向文档
- 支持REST API
(2)启用couchdb数据库
systemctl start docker
#下载couchdb镜像,先修改docker源配置文件
rm -rf /etc/docker/daemon.json #删除文件
vi /etc/docker/daemon.json #修改/etc/docker/daemon.json 文件
#打开后在文件中写入
{
"registry-mirrors":["http://docker.mirrors.ustc.edu.cn"]
}
esc #退出编辑模式
shift+: #出现一个冒号
wq #保存退出vi
cat /etc/docker/daemon.json #输出daemon.json文件内容
systemctl restart docker #重启docker服务
docker images #检查镜像
docker pull hyperledger/fabric-couchdb:0.4.10 #下载couchdb
docker images #检查镜像
docker tag hyperledger/fabric-couchdb:0.4.10 hyperledger/fabric-couchdb:latest #给这个couchdb镜像加一个latest的tag
docker images #检查镜像
#不使用./byfn.sh up -o solo -n -s couchdb直接启动,而是一步一步启动
cd fabric-samples/first-network
/byfn.sh up generate #生成证书和配置文件,有个确认,输入y回车
docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d #启动yaml文件,启动节点
docker ps #查看节点,每个peer启动了一个couchdb容器
docker ps | grep couchdb #这个命令更直观
系统配置 共识方式选择
(1)Fabric共识方式
solo共识 只有一个orderer,主要用于开发测试
kafka共识 kafka集群必须中心部署
raft共识 容忍少于半数的共识节点失效
(2)Fabric共识配置
#启动 docker
systemctl start docker
#下载 kafka 和 zookeeper 镜像
docker pull hyperledger/fabric-kafka:latest
docker pull hyperledger/fabric-zookeeper:latest
docker images #检查镜像
cd fabric-samples/first-network/
./byfn.sh up -o kafka -n #启动kafka网络,有个确认,输入y回车
docker ps #查看节点,看到四个peer,一个orderer,一个cli,一个kafka,一个zookeeper节点容器
#raft共识网络启动
./byfn.sh down #清除刚才起的网络,有个确认,输入y回车
./byfn.sh up -o etcdraft -n #有个确认,输入y回车
./byfn.sh up -o kafka -n #启动kafka网络,有个确认,输入y回车
docker ps #查看节点,看到四个peer,一个cli,5个orderer
docker ps | grep orderer #命令查找orderer字段
区块链应用操作
账户创建与管理-数字证书创建/节点证书创建与用户权限管理
(1)Fabric MSP体系回顾
数字证书
身份账户体系
(2)使用工具生成MSP证书
cd fabric-samples/first-network
../bin/cryptogen generate --config=./crypto-config.yaml #创建证书
ls #看到生成了一个crypto-config文件夹
#安装tree工具
yum install tree -y
#使用 tree 命令查看 crypto-config 证书目录
tree crypto-config
#目录很深,包含了orderer和peer组织的所有证书
#查看证书内容
#查看peer0.org1的peer节点签名证书和私钥
cd crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts #进入证书目录
ls #可看到该证书
cat peer0.org1.example.com-cert.pem #可看到证书内容
#使用openssl解密证书
openssl x509 -in peer0.org1.example.com-cert.pem -text
#查看证书对应的私钥
cd../keystore/
ls #查看文件
cat<文件名> #查看私钥内容,该文件名每个人生成不同
账户创建与管理-通道管理
cd fabric-samples/first-network
yum install tree -y #安装tree工具(若版本错误)
../bin/cryptogen generate --config=./crypto-config.yaml
ls
#生成 byfn-sys-channel 和 mychannel 通道配置文件
../bin/configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
ls channel-artifacts #查看生成的文件
#生成 Anchor peer 配置
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
ls channel-artifacts #查看生成的文件
#启动fabric网络
systemctl start docker #启动docker服务
#再次启动网络,观察节点创建完成后的控制台输出
./byfn.sh up -o solo -n
docker ps #查看节点
#使用channel.tx文件创建mychannel通道
#各节点加入mychannel通道
#用Org1MSPanchors.tx和Org2MSPanchors.tx更新Org1,Org2anchor peer
应用接入方法-使用脚本进行合约安装
(1)生成脚本
#生成安装脚本
cd fabric-samples/first-network
#以 scripts.sh 为模板复制文件名为installchaincode.sh
cp scripts/script.sh scripts/installchaincode.sh
ls scripts/
#修改脚本
vi scripts/installchaincode.sh
shift+i #进入编辑模式
#用#号注释掉创建通道、加入通道、设置 Anchor Peer 的操作
#
#createChannel
#
#joinChannel
#
#updateAnchorPeers 0 1
#
#updateAnchorPeers 0 2
#再把合约操作部分 instantiateChaincode 0 2 后面合约交互的操作注释掉
if里
#
#chaincodeQuery 0 1 100
#chaincodeInvoke 0 1 0 2
#installchaincode 1 2
#chaincodeQuery 1 2 90
#保存关闭vi
esc #退出编辑模式
shift+: #出现一个冒号
wq #保存退出vi
(2)安装合约
systemctl start docker #启动docker服务
./byfn.sh up -o solo -n #启动示例网络
docker pull hyperledger/fabric-ccenv:1.4
docker pull hyperledger/fabric-baseos:amd64-0.4.21 #下载镜像
docker images
docker ps -a
docker exec cli scripts/installchaincode.sh #安装合约
docker images
应用接入方法-合约调用与升级
(1)Fabric链码调用
Invoke 上链操作调用
Query 查询操作调用
(2)脚本调用链码
#生成安装脚本
cd fabric-samples/first-network
#以 scripts.sh 为模板复制文件名为installchaincode.sh
cp scripts/script.sh scripts/installchaincode.sh
ls scripts/
#修改脚本
vi scripts/installchaincode.sh
shift+i #进入编辑模式
#用#号注释掉创建通道、加入通道、设置 Anchor Peer 的操作
#
#createChannel
#
#joinChannel
#
#updateAnchorPeers 0 1
#
#updateAnchorPeers 0 2
#再把合约操作部分 instantiateChaincode 0 2 后面合约交互的操作注释掉
if里
#
#chaincodeQuery 0 1 100
#chaincodeInvoke 0 1 0 2
#installchaincode 1 2
#chaincodeQuery 1 2 90
#保存关闭vi
esc #退出编辑模式
shift+: #出现一个冒号
wq #保存退出vi
#安装合约
systemctl start dockershift+i #进入编辑模式启动docker服务
./byfn.sh up -o solo -nshift+i #进入编辑模式启动示例网络
docker pull hyperledger/fabric-ccenv:1.4
docker pull hyperledger/fabric-baseos:amd64-0.4.21shift+i #进入编辑模式下载镜像
docker images
docker ps -a
docker exec cli scripts/installchaincode.sh #安装合约
docker images
docker ps -a
#合约交互
#生成脚本
#以 scripts.sh 脚本为模板复制文件名为 invokechaincode.sh
cp scripts/script.sh scripts/invokechaincode.sh
#修改脚本
vi scripts/invokechaincode.sh
#shift+i 进入编辑模式
#用#号注释掉创建通道、加入通道、设置Anchor Peer 的操作
#
#createChannel
#
#joinChannel
#
#updateAnchorPeers 0 1
#
#updateAnchorPeers 0 2
#再把合约操作部分 chaincodeQuery 0 1 100 之前合约安装的操作注释掉
if里
#installchaincode 0 1
#installchaincode 0 2
#instantiateChaincode 0 2
#保存关闭vi
esc #退出编辑模式
shift+: #出现一个冒号
wq #保存退出vi
执行 docker exec cli scripts/invokechaincode.sh 观察控制台输出
可以看到第一步先调用 peer0.org1节点,査询了a账户的余额,结果为 100
第二步调用 peer0.org1,peer0.org2 节点,进行转账操作,a账户向b账户转 10 元
第三步给 peer1.0rg2 install 了mycc 合约
最后一步通过 peer1.org2节点查询a账户的余额,变成了90,说明合约交互成功,也验证了各节点会自动同步账本。
docker ps 可以看到起了三个合约容器
(3)脚本升级链码
#生成脚本
#以 scripts.sh 脚本为模板复制文件名为 upgradechaincode.sh
cp scripts/script.sh scripts/upgradechaincode.sh
#修改脚本
vi scripts/upgradechaincode.sh
#修改脚本如下:
#用#号注释掉创建通道、加入通道、设置 Anchor Peer 的操作
#
#createChannel
#
#joinChannel
#
#updateAnchorPeers 0 1
#
#updateAnchorPeers 0 2
#将合约操作中的第一个命令 installChaincode 0 1 改为 installChaincode 0 1 2.0
#第二个命令 installChaincode 0 2 注释掉
#第三个命令 instantiateChaincode 0 2 改为 upgradeChaincode 0 1
#然后将后面的命令全部注释掉
#保存退出vi
#合约升级
#调用命令 docker exec cli scripts/upgradechaincode.sh 将 peer0.org1 的 mycc 合约升级到 2.0版本,此命令也需要重新制作合约镜像,启动合约容器,故也需要等待一会
#docker ps 可以看到起了一个2.0的mycc合约容器,升级成功
应用操作问题
(1)问题排查
复现问题,定位问题,分析问题,解决问题,总结问题
(2)日志管理
记录用户操作的审计日志
快速定位问题的根源
追踪程序执行的过程
追踪数据的变化
数据统计和性能分析
采集运行环境数据
(3)排查问题素质
心态建设:自信心,稳定心态,一颗好胜的心
能力积累:知识体系积累,模块功能积累
实验:
#启动网络
cd fabric-samples/first-network
systemctl start docker #启动docker服务
./byfn.sh up -o solo -n #启动fabric网络
#日志查看
#tail 方式查看
docker ps #查看容器信息
#查看 peer0.org1 节点最新30行日志
docker logs --tail 30 peer0.org1.example.com
#查看 peer0.org1 节点最新30行日志并在控制台持续输出
docker logs --tail 30 -f peer0.org1.example.com
#fabric节点日志等级修改
#停止网络
./byfn.sh down
#修改 peer 日志等级
vi base/peer-base.yaml
#将 [- FABRIC_LOGGING_SPEC=INFO] 日志级别INFO 改为 DEBUG
#保存退出
#启动网络
./byfn.sh up -o solo -n
#观察日志输出
#再次执行
docker logs --tail 30 peer0.org1.example.com
#可以看到多了debug标签的日志
区块链测试
测试设计
需求分析(测试设计)
编写测试用例(测什么 怎么测)
评审测试用例
搭建测试环境
等待开发提交测试包
部署测试包
冒烟测试(对软件主题基本功能进行基本测试)
执行测试用例
BUG跟踪处理(提交及回归BUG)
N轮之后符合需求
测试结束
测试环境搭建
#安装node.js
cd /usr/local #进入目录
wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz #下载安装包
tar xvf node-v8.11.4-linux-x64.tar.xz #解压
mv node-v8.11.4-linux-x64 nodejs #改短名
#配置,创建软链接,以便全局使用(否则报错)
ln -s /usr/local/nodejs/bin/node /usr/bin/node
ln -s /usr/local/nodejs/bin/npm /usr/bin/npm
#完成校验
node -v && npm -v #查看版本
#安装node-gyp
sudo apt install node-gyp
#安装docker 和docker-compose
软件测试
#安装caliper
node -v && npm -v #确认已安装nodejs
cd /usr/local
git clone git://github.com/cao0507/Hyperledger-caliper #用git拉取caliper源码
cd Hyperledger-caliper #进入目录
sudo npm install #安装
#安装fabric SDKs
#在 Hyperledger-caliper 目录中安装SDKs
sudo npm install fabric-ca-client@1.1.0 fabric-client@1.1.0 #该版本适配 client
#使用grpc version 1.10.1 代替之前的1.24.11版本
sudo npm install grpc@1.10.1
#运行测试例子
#运行测试例子在 Hyperledger-caliper 文件夹中
node benchmark/simple/main.js
#如果出现Request_timeout
#修改 vi scr/fabric/e2eUtils.js
#在25%的位置,120000改为480000,x删除光标上字符,esc后按a光标上输入字符
esc #退出编辑模式
wq #保存
#正常运行后生成html测试报告,在 /usr/local/Hyperledger-caliper/xxx.html 路径下,复制到浏览器打开