Hyperledger Fabric On Ubuntu (Mac M1 ARM64)

1,091 阅读4分钟

效果展示

初衷不必多说,官方目前还未提供 arm 镜像支持,导致电脑买回来,还是不能运行 fabric,从网上找了无数个帖子和教程, 来来回回折腾了很多次,终于在今天配置成功,网上太多标题党,从头到尾跟着做完,浪费了大把时间,最后还是以报错结束,为了证明本教程的有效性,先将操作系统版本和最终结果发出来(本教程搭建基于 fabric 2.1 版本,最好自备梯子)。

image.png

image.png

虚拟机

推荐 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 安装 (使用存储库安装

设置存储库

  1. 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库:
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  1. 添加 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
  1. 使用以下命令设置存储库:
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 引擎

  1. 更新 apt 包索引:

sudo apt-get update

  1. 安装 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

image.png

下载编译好的镜像并打上标签

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

image.png

  • 查看已启动的镜像

docker ps -a image.png

  • 创建通道

./network.sh createChannel

image.png

  • 部署链码

./network.sh deployCC

image.png

出现 golang 的代理错误问题,有可能是 golang 的版本问题,需要根据当前go版本重新下载依赖,我们测试的链码位于 fabric-samples/chaincode/fabcar/go, 进入这个目录,

cd ../fabric-samples/chaincode/fabcar/go

go mod tidy

image.png

回到 test-networks 目录

cd ../../../test-network

./network.sh deployCC

出现新的错误

image.png 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

image.png

链码调用

在 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 网络的教程,涉及到联盟、组织、通道、节点、共识策略的配置,后期也会更新区块链浏览器、区块链状态可视化、多机部署等教程。

有任何部署问题可以留言进行探讨