效果展示
初衷不必多说,官方目前还未提供 arm 镜像支持,导致电脑买回来,还是不能运行 fabric,从网上找了无数个帖子和教程, 来来回回折腾了很多次,终于在今天配置成功,网上太多标题党,从头到尾跟着做完,浪费了大把时间,最后还是以报错结束,为了证明本教程的有效性,先将操作系统版本和最终结果发出来(本教程搭建基于 fabric 2.1 版本,最好自备梯子)。
虚拟机
推荐 Parallels (试用结束后收费), 也可以使用 Vmware WorkStation(可申请个人免费版本),这部分不做详细介绍,网上教程很多。
前置准备
安装 git、curl、wget、Vim
sudo apt update
sudo apt-get install git
sudo apt install wget
sudo apt-get install curl
sudo apt-get install vim
Golang的安装与配置
下载
下载英文官方最新版本
wget -c https://go.dev/dl/go1.19.4.linux-arm64.tar.gz -O - | sudo tar -xz -C /usr/local
如果 wget 命令下载失败,自己访问网站下载到本地,然后转存到虚拟机里进行解压也可以。
环境变量配置
vim ~/.bashrc
export GOPATH=$HOME/go
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPROXY=https://goproxy.io,direct
刷新环境变量,使配置生效。
source ~/.bashrc
验证
go version
Docker 安装 (使用存储库安装)
设置存储库
- 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库:
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
- 添加 Docker 的官方 GPG 密钥:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
- 使用以下命令设置存储库:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker 引擎
- 更新 apt 包索引:
sudo apt-get update
- 安装 Docker Engine、containerd 和 Docker Compose
- 安装最新版本
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 通过运行 hello - world 镜像验证 Docker Engine 安装是否成功
sudo docker run hello-world
设置以非 root 用户运行 Docker daemon
- 创建 docker 组并添加用户
sudo groupadd docker
- 将用户添加到 docker 组
sudo usermod -aG docker $USER
- 运行以下命令来激活对组的更改
newgrp docker
- 验证您是否可以在没有 sudo 的情况下运行 docker 命令
docker run hello-world
配置 Docker 开机启动
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
安装 Docker-compose
sudo apt install -y docker-compose
docker-compose -v
下载编译好的镜像并打上标签
docker pull busan15/fabric-baseos
docker pull busan15/fabric-ccenv
docker pull busan15/fabric-baseimage
docker pull busan15/fabric-tools
docker pull busan15/fabric-peer
docker pull busan15/fabric-orderer
docker pull busan15/fabric-couchdb
docker pull busan15/fabric-ca
打标签,强制部署时使用自己下载的arm镜像
docker tag busan15/fabric-baseos:latest hyperledger/fabric-baseos:latest
docker tag busan15/fabric-ccenv:latest hyperledger/fabric-ccenv:latest
docker tag busan15/fabric-baseimage:latest hyperledger/fabric-baseimage:latest
docker tag busan15/fabric-tools:latest hyperledger/fabric-tools:latest
docker tag busan15/fabric-peer:latest hyperledger/fabric-peer:latest
docker tag busan15/fabric-orderer:latest hyperledger/fabric-orderer:latest
docker tag busan15/fabric-couchdb:latest hyperledger/fabric-couchdb:latest
docker tag busan15/fabric-ca:latest hyperledger/fabric-ca:latest
下载 fabric-samples
mkdir -p ~/go/src/github.com/hyperledger/
cd ~/go/src/github.com/hyperledger/
wget https://github.com/busan15/fabric-binaries-pi/releases/download/v2.0.0-beta-bugfix-1/fabric-samples.tar.gz
如果上述地址无法访问,可以尝试下面这个
wget https://gitee.com/smy1121/fabric-samples.git
(gitee 仓库下载地址)
tar -xzvf fabric-samples.tar.gz
如果下载速度慢,直接下载到本地,然后再在 ubuntu 上进行解压即可。
解压结束后,进入 fabric-samples 文件夹中,将二进制文件夹拷贝到 /usr/local/bin 中,方便全局使用。
cd fabric-samples
sudo cp bin/* /usr/local/bin
开始测试
- 进入测试文件夹
cd test-network
- 启动测试网络
export COMPOSE_PROJECT_NAME=docker
./network.sh down
./network.sh up
- 查看已启动的镜像
docker ps -a
- 创建通道
./network.sh createChannel
- 部署链码
./network.sh deployCC
出现 golang 的代理错误问题,有可能是 golang 的版本问题,需要根据当前go版本重新下载依赖,我们测试的链码位于 fabric-samples/chaincode/fabcar/go, 进入这个目录,
cd ../fabric-samples/chaincode/fabcar/go
go mod tidy
回到 test-networks 目录
cd ../../../test-network
./network.sh deployCC
出现新的错误
context deadline exceed
处理方法 1:
export COMPOSE_PROJECT_NAME=docker
./network.sh deployCC
如果上述方法解决不掉,使用下面的方法解决
删除通道组件和打包后的链码,重新生成通道和交易配置
rm -rf channel-artifacts
rm -rf fabcar.tar.gz
./network.sh down
docker volume prune
export COMPOSE_PROJECT_NAME=docker
./network.sh up createChannel
./network.sh deployCC
链码调用
在 test-network 目录下执行
export FABRIC_CFG_PATH=$PWD/../config/
您现在可以设置环境变量,以在 cli 中操作 peer1
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
可以从 CLI 查询分类帐,运行以下命令可以获取已添加到channel的账本上的汽车列表
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
当网络成员想要转移或更改账本上的资产时,将调用链代码。使用以下命令通过调用 fabcar 链代码更改账本上汽车的所有者 鼠标连击三下即可复制全部命令
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 fabcar --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":"changeCarOwner","Args":["CAR9","Dave"]}'
切换到 peer 身份再执行上面的命令
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 上运行的 fabcar 链代码
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryCar","CAR9"]}'
关闭测试网络
./network.sh down
docker volume prune
到此为止,环境搭建就结束了,可以在此基础上搭建自己的 fabric 网络,后面会更新手动搭建一个自己的 fabric 网络的教程,涉及到联盟、组织、通道、节点、共识策略的配置,后期也会更新区块链浏览器、区块链状态可视化、多机部署等教程。
有任何部署问题可以留言进行探讨