一、环境要求
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 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
网络交互(官方文档)
- 使用以下命令将这些二进制文件添加到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 restart docker