Ubuntu 从零部署 Hyperledger Fabric 并使用测试网络

ubuntu 20.04,Fabric 2.0.0

HyperledgeHyperledger Fabric

一个开源的企业级许可分布式账本技术(Distributed Ledger Technology,DLT)平台,专为在企业环境中使用而设计。Hyperledger Fabric 被专门设计为模块化架构。无论是可插拔的共识、可插拔的身份管理协议(如 LDAP 或 OpenID Connect)、密钥管理协议还是加密库,该平台的核心设计旨在满足企业业务需求的多样性。

Fabric 由以下模块化的组件组成:

  • 可插拔的排序服务对交易顺序建立共识,然后向节点广播区块;
  • 可插拔的成员服务提供者负责将网络中的实体与加密身份相关联;
  • 可选的P2P gossip 服务通过排序服务将区块发送到其他节点;
  • 智能合约(“链码”)隔离运行在容器环境(例如 Docker)中。它们可以用标准编程语言编写,但不能直接访问账本状态;
  • 账本可以通过配置支持多种 DBMS;
  • 可插拔的背书和验证策略,每个应用程序可以独立配置。

准备阶段

  1. 安装 git
# 安装 git
sudo apt-get install -y git
# 配置 git
git config --global user.name master
git config --global user.email [email protected]
git config --list
  1. 安装 cURL
sudo apt install curl -y
  1. 安装 docker 和 docker-compose
# 安装 docker
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
# 确保 docker daemon 是在运行着的
sudo systemctl start docker
将你的用户添加到 dockersudo usermod -a -G docker <username>
# docker 开机自启动
systemctl enable docker.service

# 安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
  1. 安装 go
# 下载 go 压缩包并解压
wget -c https://dl.google.com/go/go1.20.6.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
# 调整环境变量
sudo vim /etc/profile
# 将以下内容追加到文件末尾
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH
# 环境变量生效
source /etc/profile
# 防止重启后失效,追加到根目录环境持久生效
cd ~
sudo vim .bashrc
# 追加到文件末尾
source /etc/profile
# 开启GO111MOUDLE和更改GOPROXY
go env -w GOPROXY="https://goproxy.cn"
go env -w GO111MODULE=on
  1. 安装 SoftHSM
sudo apt install libsofthsm2
  1. 安装 jq
sudo apt-get install jq

安装 Fabric 样本、Docker 镜像和二进制文件

  1. 创建工作目录
mkdir -p $HOME/go/src/github.com/
cd $HOME/go/src/github.com/
  1. 获取 fabric-sample 源码
# 下载 fabric-samples
git clone -b release-2.2 https://github.com/hyperledger/fabric-samples.git
# 切换到 fabric 目录
cd fabric-samples
  1. 获取 fabric-sample 和 fabric-ca 可执行二进制文件
# 下载fabric-samples 和 fabric-ca 可执行二进制文件
wget https://github.com/hyperledger/fabric/releases/download/v2.0.0/hyperledger-fabric-linux-amd64-2.0.0.tar.gz
wget https://github.com/hyperledger/fabric-ca/releases/download/v1.4.6/hyperledger-fabric-ca-linux-amd64-1.4.6.tar.gz
# 下载的 hyperledger-fabric-linux-amd64-2.0.0.tar 压缩包内有 bin 和 config 两个文件夹,hyperledger-fabric-ca-linux-amd64-1.4.6.tar 压缩包内有 bin 文件夹,将两个 bin 文件夹内的二进制文件汇总在一个 bin 文件夹内。 最后将 bin 和 config 文件夹复制到 fabric-samples 文件夹内

# 其中参数说明如下:
2.0.0:表示 Hyperledger Fabric 的版本号
1.4.6:表示Fabric CA的版本号
  1. 下载 docker 镜像
# 下载bootstrap.sh脚本并授予执行权限
wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh
sudo chmod +x bootstrap.sh


# 下载docker镜像
# 在上面下载了二进制可执行文件和fabric-samples,再次执行bootstrap.sh脚本,这里-b参数表示不下载二进制文件,-s参数表示不下载fabric-samples,只拉取docker镜像
./bootstrap.sh 2.0.0 1.4.6 -s -b
  1. 添加环境变量
# 添加到 PATH 环境变量中,以便在不需要指定每个二进制文件的绝对路径的情况下获取命令
sudo vim ./bashrc
# 加到末尾
export PATH=<path to download location>/bin:$PATH
# 生效
source .bashrc
  1. 检查安装结果
orderer version

在这里插入图片描述

使用 Fabric 的测试网络

  1. 启动测试网络
cd fabric-samples/test-network
# 应该始终重新启动网络。 可以使用以下命令删除先前运行的工件,加密材料,容器,卷和链码镜像:
./network.sh down
# 如果您不删除旧的容器,镜像和卷,将看到报错

# 此命令创建一个由两个对等节点和一个排序节点组成的Fabric网络
./network.sh up

在这里插入图片描述

# 测试网络的组成成分
docker ps -a

在这里插入图片描述

  1. 创建一个通道
# 可以使用network.sh脚本在Org1和Org2之间创建通道并加入他们的对等节点。 运行以下命令以创建一个默认名称为“ mychannel”的通道:
./network.sh createChannel
# 命令执行成功会出现
========= Channel successfully joined ===========

# 作为一个例子,以下命令将创建一个名为channel1的通道
./network.sh createChannel -c channel1
# 一步建立网络并创建频道,则可以使用up和createChannel模式一起
./network.sh up createChannel
  1. 在通道启动一个链码
# 使用network.sh创建频道后,您可以使用以下命令在通道上启动链码:
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

遇到问题1:

在这里插入图片描述
可能原因是fabric-sample 版本不对

解决:

# 查看分支
cd ../
git branch
# 命令执行成功发现是
* (HEAD detached at v2.0.0)
  main
  release-2.2
# 切换分支到2.2
git checkout release-2.2

遇到问题2:
在这里插入图片描述
原因是没有配置 msp 环境变量,以网络中的某个组织的某个节点进行交互

解决:

export CORE_PEER_MSPCONFIGPATH=${
    
    PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp

export CORE_PEER_TLS_ROOTCERT_FILE=${
    
    PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

export CORE_PEER_LOCALMSPID="Org1MSP"
# 再次执行通道启动链码操作
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
# 执行成功如下图:

在这里插入图片描述

  1. 与网络交互
# 使用以下命令将这些二进制文件添加到您的CLI路径:
export PATH=${
    
    PWD}/../bin:$PATH

# 将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件
export FABRIC_CFG_PATH=$PWD/../config/

# 设置环境变量,以允许您作为Org1操作peer CLI(和上边解决 msp 环境变量的操作类似)
# Environment variables for Org1

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${
    
    PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${
    
    PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051

# CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量
# 指向Org1的organizations文件夹中的的加密材料

# 运行以下命令用一些资产来初始化账本
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${
    
    PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${
    
    PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${
    
    PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'
# 命令执行成功会输出这些:
2023-07-12 12:43:30.209 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

# 可以用CLI 工具来查询账本。运行以下指令来获取添加到通道账本的资产列表
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
# 执行成功结果如下:
[{
    
    "ID":"asset1","color":"blue","size":5,"owner":"Tomoko","appraisedValue":300},{
    
    "ID":"asset2","color":"red","size":5,"owner":"Brad","appraisedValue":400},{
    
    "ID":"asset3","color":"green","size":10,"owner":"Jin Soo","appraisedValue":500},{
    
    "ID":"asset4","color":"yellow","size":10,"owner":"Max","appraisedValue":600},{
    
    "ID":"asset5","color":"black","size":15,"owner":"Adriana","appraisedValue":700},{
    
    "ID":"asset6","color":"white","size":15,"owner":"Michel","appraisedValue":800}]

# 当一个网络成员希望在账本上转一些或者改变一些资产,链码会被调用。
# 使用以下的指令来通过调用 asset-transfer (basic) 链码改变账本上的资产所有者:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${
    
    PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${
    
    PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${
    
    PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
# 执行成功结果如下:
2023-07-12 13:47:30.379 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

# 因为 asset-transfer (basic) 链码的背书策略需要交易同时被 Org1 和 Org2 签名,
# 链码调用指令需要使用 --peerAddresses 标签来指向 peer0.org1.example.com 和 peer0.org2.example.com。
# 因为网络的 TLS 被开启,指令也需要用 --tlsRootCertFiles 标签指向每个 peer 节点的 TLS 证书。

# 调用链码之后,我们可以使用另一个查询来查看调用如何改变了区块链账本的资产。
# 因为我们已经查询了 Org1 的 peer,我们可以把这个查询链码的机会通过 Org2 的 peer 来运行。
# 设置以下的环境变量来操作 Org2:

# Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${
    
    PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${
    
    PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051

# 可以用以下命令查询运行在 peer0.org2.example.com asset-transfer (basic) 链码:
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
# 执行结果如下,结果显示 "asset6" 转给了 Christopher:
{
    
    "ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}
  1. 关停网络
# 使用完测试网络后,您可以使用以下命令关闭网络:
./network.sh down
# 该命令将停止并删除节点和链码容器,删除组织加密材料,并从Docker Registry移除链码镜像。 
# 该命令还删除之前运行的通道项目和docker卷。
# 如果您遇到任何问题,还允许您再次运行
./ network.sh up

猜你喜欢

转载自blog.csdn.net/Double_Horse/article/details/131653826
今日推荐