一、本机安装
本文为vm安装ubuntu虚拟机,如果系统中没有出现网络标志
方案一
sudo service network-manager restart
方案二
sudo service network-manager stop
sudo vim /etc/NetworkManager/NetworkManager.conf
把false改成true
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service network-manager start
添加用户sudo权限
1、su root
2、chmod u+w /etc/sudoers
3、vim /etc/sudoers
4、在root ALL=(ALL:ALL) ALL下面添加XXX ALL=(ALL) ALL语句
5、chmod u-w /etc/sudoers
1.安装docker
#sudo apt install docker.io (暂时先不用此版本)
sudo apt install docker
sudo apt install docker-compose
sudo service docker start
2.安装GO
Fabric 2.1版以内可以使用
获取最新的软件包源,并添加至当前的apt库
sudo add-apt-repository ppa:longsleep/golang-backports
更新 apt库
sudo apt-get update
安装新版本
sudo apt-get install golang-go
指定版本
sudo apt-get install golang-1.8-go
不是最新版需要手动添加 sudo cp /usr/lib/go-1.8/bin/go /usr/bin/
Fabric2.2要求使用Go 1.14.6以上(1.14.4时启动多节点orderer会报错)
1.
go1.14.6
wget https://studygolang.com/dl/golang/go1.14.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.14.6.linux-amd64.tar.gz
若按以上方式安装的原版本,删除方式:sudo rm -rf /usr/local/go
2. sudo vim /etc/profile中最后添加 export PATH=$PATH:/usr/local/go/bin
3. source /etc/profile 更新配置
重启后才能一直有效
设置环境变量
vim ~/.bashrc
export GOPATH="/home/dev/go" #最后一行加入
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH/bin
source /etc/profile
echo $GOPATH 测试下是否生效
sudo apt install libtool libltdl-dev
3.安装curl和jq
sudo apt install curl
sudo apt-get install jq
4.创建目录
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric
如需切换版本git tag查看所有版本
git checkout v1.X 切换
5.安装依赖包(此条废弃)
go env -w GO111MODULE=on #安装protoc-gen-go时需要
go env -w GOPROXY=https://goproxy.io #官方代理地址
go get github.com/golang/protobuf/protoc-gen-go
#以下内容应该废弃了
mkdir -p $GOPATH/src/github.com/hyperledger/fabric/build/docker/gotools/bin
cp $GOPATH/bin/protoc-gen-go $GOPATH/src/github.com/hyperledger/fabric/build/docker/gotools/bin
6.编译Fabric模块
Fabric2.2
1.
go env -w GO111MODULE=on #安装protoc-gen-go时需要
go env -w GOPROXY=https://goproxy.io #官方代理地址
cd $GOPATH/src/github.com/hyperledger/fabric
go mod vendor
make release #如失败执行make clean 删除以编译的文件再重新编译,会删除已生成的可执行文件和下载的docker镜像(最新一次到这里报错,无法生成peer,直接从其它系统复制可执行文件)
#虚拟就在1核1G时编译peer出错,改为2核2g编译顺利通过。
检查是否安装好
./release/linux-amd64/bin/peer version
./release/linux-amd64/bin/orderer version
./release/linux-amd64/bin/configtxgen -version
./release/linux-amd64/bin/configtxlator version
安装可执行文件
sudo cp $GOPATH/src/github.com/hyperledger/fabric/release/linux-amd64/bin/* /usr/local/bin
sudo chmod -R 775 /usr/local/bin/configtxgen
sudo chmod -R 775 /usr/local/bin/configtxlator
sudo chmod -R 775 /usr/local/bin/cryptogen
sudo chmod -R 775 /usr/local/bin/peer
sudo chmod -R 775 /usr/local/bin/orderer
# 2.本地源代码生成Fabric模块的Docker镜像文件,以下步骤在v1.1.0时可成功,在v1.1.1时不可成功
# su root
# export GOPATH="/home/dev/go"
# go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/ #设置为阿里云的代理
2.下载所需docker镜像
sudo usermod -G docker userName 将用户加入docker组才有权限
newgrp docker 更新用户组
make docker
或从Docker仓库下载Fabric中的镜像步骤暂缺
7.Fabric-ca解决Fabric账号生成问题。由Fabric-ca-server和Fabirc-ca-client两个模块组成。
1.安装系统组件包
sudo apt install libtool libltdl-dev
2.下载源码并编译
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric-ca
cd $GOPATH/src/github.com/hyperledger/fabric-ca
go env -w GO111MODULE=
make fabric-ca-server
make fabric-ca-client
3.安装编译好的可执行文件
cd $GOPATH/src/github.com/hyperledger/fabric-ca/bin
sudo cp * /usr/local/bin/
chmod -R 755 /usr/local/bin/fabric-ca-server
chmod -R 755 /usr/local/bin/fabric-ca-client
4.检查
fabric-ca-server version
fabric-ca-client version
显示版本则安装正确
8.开发客户端安装golang-sdk
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric-sdk-go
二、创建docker镜像
配置开发环境
docker run -it ubuntu:20.04 bash
apt-get update
apt-get install wget
wget https://studygolang.com/dl/golang/go1.16.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.16.linux-amd64.tar.gz
rm go1.16.linux-amd64.tar.gz
apt-get install vim
vim /etc/profile中最后添加 export PATH=$PATH:/usr/local/go/bin
source /etc/profile 更新配置
设置环境变量
vim ~/.bashrc
export GOPATH="/home/dev/go" #最后一行加入
export GOBIN=$GOPATH/bin
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
source .bashrc
echo $GOPATH 测试下是否生效
apt install libtool libltdl-dev
apt-get install jq
apt-get install git
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric
如需切换版本git tag查看所有版本
git checkout v1.X 切换
提交一次
docker commit -m='go1.16 install fabric2.4' -a='lingge879' 09d78fb8007a lingge879/fabric:1.0
go env -w GOPROXY=https://goproxy.io
go env -w GO111MODULE=on
cd $GOPATH/src/github.com/hyperledger/fabric
go mod vendor
apt-get install make
make release
在设置环境变量
vim ~/.bashrc末尾加上
export PATH=$PATH:/home/dev/go/src/github.com/hyperledger/fabric/release/linux-amd64/bin
source .bashrc
安装后再提交一次
docker commit -m='go1.16 install fabric2.4' -a='lingge879' 09d78fb8007a lingge879/fabric:1.1
docker push lingge879/fabric:1.1
下载
docker pull lingge879/fabric:1.1
使用docker镜像运行区块链网络
1.启动orderer
注意指定net网络,方法参见https://blog.csdn.net/zhanglingge/article/details/111573171第三章。如果是一个主机可以不指定-p参数,不用暴漏端口,因为有--net指定了一个网络,可以直接访问容器的端口。
docker run -it -d --net=test_net --name orderer.example.com -v /home/dev/work/example/organizations:/work/organizations -v /home/dev/work/example/order1:/work/order -v /home/dev/work/example/product/order1:/production -w /work/order -p 7050:7050 --ulimit core=0 lingge879/fabric:1.0.1 bash
docker exec -it orderer.example.com bash
2.启动peer
启动Org1 peer节点,注意需要映射主机的/var/run/docker.sock到容器中,因为在启动连码时需要将调用信息传递到主机上,让主机启动容器,主机需要链码运行基础镜像hyperledger/fabric-ccenv:2.3
#CORE_VM_ENDPOINT,注意官方docker-compse中有这个变量是否是一个作用CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock,变量这点尚未确认。(同上,可以不指定-p参数)
docker run -it -d --net=test_net --name peer0.org1.example.com -v /home/dev/work/example/organizations:/work/organizations -v /home/dev/work/example/org1_peer0:/work/peer -v /home/dev/work/example/product/org1_peer0:/production -v /var/run/docker.sock:/var/run/docker.sock -w /work/peer -p 7051:7051 --ulimit core=0 lingge879/fabric:1.0.1 bash
启动Org2 peer。(同上,可以不指定-p参数)
docker run -it -d --net=test_net --name peer0.org2.example.com -v /home/dev/work/example/organizations:/work/organizations -v /home/dev/work/example/org2_peer0:/work/peer -v /home/dev/work/example/product/org2_peer0:/production -v /var/run/docker.sock:/var/run/docker.sock -w /work/peer -p 8051:7051 --ulimit core=0 lingge879/fabric:1.0.1 bash
如下调用链码的代码,注意Org2的peer为7051
peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID channel1 --init-required --name sacc --version 1.0 --sequence 1 --tls --cafile $ORDERER_TLSCA --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles ${PWD}/../organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
小结
1.需要映射主机的docker通信文件,用于容器中启动链码时在主机上生成链码镜像。
2.主机需要有镜像hyperledger/fabric-ccenv:2.3,用于生成链码。版本号与fabric的代码版本一致。且暂时没有2.4的镜像