Hyperledger Fabric 2.5.6网络搭建

一、环境要求

Ubuntu 22.04/24.04

go version 1.21.6

1.安装依赖

使用以下命令安装vim、git与curl

sudo apt-get install vim

sudo apt-get install git

sudo apt install curl

 2.安装 docker-ce

1.安装docker

获取docker-ce安装脚本

cd ~

curl -fsSL https://gitee.com/real__cool/fabric_install/raw/main/docker_install.sh | bash -s docker --mirror Aliyun

安装完成后查看版本信息

docker  --version

2.将当前用户加入docker组

(1)添加用户wang 到docker组

sudo usermod -aG docker wang

(2)打开sudoers文件:

sudo vim /etc/sudoers

(3)在root下面一栏填写用户wang的权限

wang    ALL=(ALL:ALL) NOPASSWD:ALL

(4)刷新docker用户组成员

newgrp  -  docker

3.安装 docker-compose

使用以下命令安装docker-compose

sudo apt install docker-compose

安装完成后查看版本信息

docker-compose --version

4.安装 Golang

国内网站studygolang 下载安装包,或者通过go语言全球代理goproxy.io下载安装包

使用以下命令下载安装包

wget https://golang.google.cn/dl/go1.21.6.linux-amd64.tar.gz

将安装包解压缩至/sur/local

sudo tar -zxvf ./go1.21.6.linux-amd64.tar.gz -C /usr/local/

配置环境变量,允许系统中所有用户使用Golang

sudo vim /etc/profile

在文件末尾添加以下内容

export GOROOT=/usr/local/go

export GOPATH=$HOME/go

export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

输入:wq保存退出,使用source命令使添加的配置信息生效

source /etc/profile

查看版本信息

go version

安装完成后建议配置 go 语言使其从公共代理镜像中下载依赖代码,输入以下命令

sudo go env -w GO111MODULE=on

sudo go env -w GOPROXY=https://goproxy.io,direct

错误:sudo: go: command not found

解决办法:

sudo apt update

sudo apt install golang

5.下载 fabric 源码

创建一个目录并进入

mkdir -p ~/go/src/github.com/hyperledger

cd ~/go/src/github.com/hyperledger

5.1下载fabric源码

使用如下命令下载fabric源码

git clone https://github.com/hyperledger/fabric.git

使用以下命令进入 fabric 并切换分支

cd ./fabric

git checkout release-2.5

git checkout v2.5.6(切换到仓库里标签为2.5.6版本)

 5.2下载镜像

方法1:

(1)切换到fabric目录下scripts目录 执行命令cd scripts

(2) 获取fabric-samples

sudo ./bootstrap.sh(此命令拉取仓库中标签为latest的文件,如果需要特定版本的就要去官网找官方文档下载,然后使用命令docker pull [OPTIONS] IMAGE[:TAG|@DIGEST]拉取特定版本镜像)

Docker images查看版本镜像:

(获取fabric-samples、fabric-ca、fabric2.x等文件的命令)

方法2:

(1)切换到fabric/目录下scripts目录 执行命令:cd scripts

(2)获取fabric-samples,执行命令:./bootstrap.sh -db(会将fabric-samples直接下载到scripts文件夹)

(3)去官网下载fabric-ca(v1.4.7)(网址:Releases · hyperledger/fabric-ca · GitHub)以及fabric(v2.x(网址:Releases · hyperledger/fabric · GitHub

Release v2.2.0 · hyperledger/fabric · GitHub直接下载命令:Wget https://github.com/hyperledger/fabric/releases/download/v2.2.0/hyperledger-fabric-linux-amd64-2.2.0.tar.gz)并且将fabric(v2.x)中的bin和config复制到Ubuntu中fabric文件夹中,把fabric-ca中的fabric-ca-client和fabric-ca-server复制到fabric中bin文件夹中,最后把fabric中的bin和config文件夹复制到fabric-samples文件夹中;(使用共享文件夹即可完成)

(4)将一下环境变量加入~/.profile,执行source ~/.profile

export PATH=$PATH:/home/go/src/github.com/hyperledger/fabric/fabric-samples/bin

export PATH=$PATH:/home/go/src/github.com/hyperledger/fabric/fabric-samples/config

(5)获取docker镜像

./bootstrap.sh -sb

注:可以在windows中下载文档,然后通过建立共享文件夹的形式来将windows中的文件转移到Linux中。以下就是共享文件夹的创建以及搭配:

首先在Linux系统中执行命令:mkdir /mnt/hgfs

然后点击设置虚拟机,在选项中找到共享文件夹

然后进行设置操作,将windows中建立的共享文件夹找到后添加到该共享文件夹的位置(我在E盘里建立了共享文件夹,建议文件夹的名称为英文,此处为共享文件夹)

然后返回Linux中,执行命令:

sudo vmhgfs-fuse -o allow_other .host:/虚拟机设置中共享文件夹的名称 /mnt/hgfs/即可挂载成功。

如果共享文件夹非空:sudo vmhgfs-fuse -o allow_other .host:/gongxiang /mnt/hgfs/ -o nonempty

6.启动网络

6.1开启网络

进入测试目录:cd fabric-samples/test-network

启动网络:./network.sh up

6.2 建立通道

建立通道:./network.sh createChannel

创建通道时会出现jq缺失的错误

使用命令:sudo snap remove jq

sudo apt install jq

安装jq

6.3 启动链码

启动链码:./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go


启动链码时有多种错误情况出现,以下则是我遇到的错误:
(1) log.txt权限不够

解决方法:log.txt权限不够是因为文件被锁住,输入

sudo chmod -R 777 log.txt解锁

(2)其他权限不够问题,不要加sudo解决,sudo会导致path环境找不到

解决方法:将文件全部解锁:

sudo chmod -R 777 ~/go

(3)go list问题

‘go list’ failed with:error obtaining VCS status error obtaining VCS status:exit status 128

解决方法:因为go版本太高,需要将版本降级

(4)'go list’failed with:go:github.com/golang/protobuf@…

解决方法:更换代理,输入命令

go env -w GO111MODULE=on

go env -w GOPROXY=https://goproxy.cn,direct

(5)install failed with status: 500 - failed to invoke backing implementation of 'Installchaincode': could not build channuError: chaincedecker build failed:docker image build failed: docker build failed: Error returned from build: 1 "go: downloading gol.22.4 (linux/amd64)p: download go.2.4: golang.org/toolchainev.8 1-go1.2.4.linux-amd64: Get "https://proxy.gplang,org/golang.org/toolchain/@v/v.0.1-g1.22.4.linux amd.zip"dial tcp 172.217.163 49:443:connect: connection refused

这个问题要注意go.mod中toolchain要与go版本一致

高版本容易出现的错误:

在/asset-transfer-basic/chaincode-go目录下,没有安装go依赖

解决方法:

到相应的目录下,手动安装go依赖

cd ../asset-transfer-basic/chaincode-go

go mod vendor

若是还报错,则需要查看chaincode-go中go.mod文件里go的版本是否与本机版本一致,若不一致则修改go.mod版本与本机版本一致,

cd /fabric-samples/asset-transfer-basic/chaincode-go

sudo vim go.mod

并运行go mod vendor,若还是不行将仓库重置(删除vendor),删除仓库过程中会报错,使用命令:

git config --global --add safe.directory /home/wang/go/src/github.com/hyperledger/fabric/scripts/fabric-samples

这个命令会将该目录添加到全局的 Git 安全目录列表中,Git 将忽略该目录中的所有权问题。然后输入命令:

git reset --hard

git clean -fdx

go mod vendor

如果还报错,运行 ./network.sh down 命令关闭网络,然后使用 ./network.sh up createChannel -c mychannel -s couchdb 命令重新启动网络并创建通道。这将重新生成网络中的 MSP 和证书,并确保正确的配置。如果还报错,运行docker system prune -a命令,清除缓存。

解决上述问题后,执行启动安装链码结果:

7.与网络进行交互

启用测试网络后,可以使用peer CLI与网络进行交互。peer CLI允许调用已部署的智能合约,更新通道,或安装和部署新的智能合约 (可以在fabric-samples代码库的bin文件夹中找到peer二进制文件),必须在test-network目录下。

(1)使用以下命令将二进制文件添加到你的CLI路径:

export PATH=${PWD}/../bin:$PATH

(2)需要将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:

export FABRIC_CFG_PATH=$PWD/../config/

7.1角色:组织1操作peer

1.设置环境变量,以允许你作为Org1操作peer CLI:中,CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。
好了,现在我们可以从CLI查询账本了。

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/Admin@org1.example.com/msp

export CORE_PEER_ADDRESS=localhost:7051

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

运行以下命令以使用资产初始化账本(请注意,CLI 不访问 Fabric Gateway 对等体,因此必须指定每个背书对等体)
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":[]}'


从 CLI 查询账本,运行以下命令以获取已添加到频道账本的资产列表:

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

使用以下命令通过调用资产转移(基本)链码来更改账本上资产的所有者:

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"]}'

因为资产转移(基础)链码的背书策略需要交易 要由 Org1 和 Org2 签名,链码调用命令需要针对两者并使用标志。由于为网络启用了 TLS,因此该命令还需要引用 使用标志的每个对等方的 TLS 证书。

peer0.org1.example.compeer0.org2.example.com--peerAddresses--tlsRootCertFiles

在我们调用链码之后,我们可以使用另一个查询来查看如何调用 更改了区块链分类账上的资产。由于我们已经查询了 Org1 peer,我们可以借此机会查询一下运行在 Org2 上的链码 同辈。设置以下环境变量以作为 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/Admin@org2.example.com/msp

export CORE_PEER_ADDRESS=localhost:9051

您现在可以查询在以下位置上运行的资产转移(基本)链码:peer0.org2.example.com

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

结果将显示已转移到 Christopher:"asset6"

使用完测试网络后,可以关闭网络 使用以下命令:

关闭网络:./network.sh down

网络交互(官方文档)

  1. 使用以下命令将这些二进制文件添加到CLI路径中:

export PATH=${PWD}/../bin:$PATH

设置指向中的文件存储库:

export FABRIC_CFG_PATH=$PWD/../config/

设置允许操作的环境变量 CLI作为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/Admin@org1.example.com/msp

export CORE_PEER_ADDRESS=localhost:7051

运行以下命令初始化带有资产的分类账

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":[]}'

如果成功,看到类似于以下示例的输出:

-> INFO 001 Chaincode invoke successful. result: status:200

现在可以从CLI查询分类帐。运行以下命令获取已添加到通道分类账的资产列表:

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

使用以下命令通过调用资产转移(基本)链码来更改分类账上资产的所有者:

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"]}'

调用chaincode之后,我们可以使用另一个查询来查看调用是如何进行的 更改了区块链分类账上的资产。因为我们已经查询过组织了 peer,我们可以借此机会查询在组织2上运行的链码 同行。需要设置的环境变量如下:

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/Admin@org2.example.com/msp

export CORE_PEER_ADDRESS=localhost:9051

现在可以查询正在运行的资产转移(基本)链码:

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

结果将显示被转移到Christopher

停止:systemctl stop docker

systemctl restart  docker

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值