1、先决条件
安装git、curl、wget
sudo apt-get install git curl wget
安装go语言
获取离线包 wget -c https://golang.google.cn/dl/go1.16.6.linux-amd64.tar.gz
解压到指定目录 tar -zxvf go1.16.6.linux-amd64.tar -C /usr/local
配置系统变量 echo 'export PATH=$PATH:/usr/local/go/bin'>>/etc/profile
创建GOPATH变量 mkdir -p /opt/gopath ; echo 'export GOPATH=/opt/gopath'>>/etc/profile
使环境变量生效 source /etc/profile
查看版本 go version
安装JDK
获取离线包:手动下载 http://www.oracle.com/technetwork/java/javase/downloads/index.html,上传到/tmp
或者使用wget -c https://download.oracle.com/java/20/latest/jdk-20_linux-x64_bin.tar.gz获取离线包
解压到指定目录 sudo tar -zxvf jdk-8u162-linux-x64.tar.gz -C /usr/local/
修改环境变量sudo vim ~/.profile
#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使环境变量生效 source /etc/profile
安装docker
sudo apt-get remove docker docker-engine docker.io containerd runc ###卸载旧版本
sudo apt-get update ###更新 apt 包索引
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common ###安装依赖包
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - ###添加 Docker 的官方 GPG 密钥 https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" ###添加官方软件源 https://mirrors.aliyun.com/docker-ce/linux/ubuntu
sudo apt update ###更新 apt 包索引
sudo apt install docker-ce
sudo docker run hello-world
sudo usermod -aG docker $USER ###以非 Root 用户身份执行 Docker
安装docker-compose
要安装不同版本的 Compose,请将 1.29.2 替换为您要使用的 Compose 版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
对可执行权限 sudo chmod +x /usr/local/bin/docker-compose
验证版本 docker-compose --version
2、使用测试网络
2.1下载fabric源码
进入$GOPATH,下载fabric源码
git clone https://github.com/hyperledger/fabric.git
进入目录 cd fabric/scripts
执行 ./bootstrap.sh
功能:
-b:加上此参数,则不下载二进制文件
-d:加上此参数则不拉取docker镜像
-s:加上此参数则不下载fabric-samples
2.2 启动网络
启动网络
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
./network.sh up 启动网络
./network.sh down 关闭网络
报错Peer binary and configuration files not found. 解决办法:bin和config目录复制到fabric-samples下
测试网络的组成部分
docker ps -a
网络有两个联盟成员,Org1和Org2。 还包括一个维护网络排序服务的排序组织。
创建一个通道
创建一个默认名称为“ mychannel”的通道 ./network.sh createChannel
创建一个名为channel1的通道(通道标志允许创建多个不同名称的多个通道): ./network.sh createChannel -c channel1
一步建立网络并创建频道 ./network.sh up createChannel
2.3 与网络交互
在通道启动一个链码
deployCC子命令将在peer0.org1.example.com和peer0.org2.example.com上安装 asset-transfer (basic) 链码。 然后在使用通道标志(或mychannel如果未指定通道)的通道上部署指定的通道的链码。(可以使用语言便签 -l,用于安装 Java 或 javascript 版本的链码)
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
报错:Error: failed to normalize chaincode path: 'go list' failed with: go: github.com/golang/protobuf@v1.3.2: Get "https://proxy.golang.org/github.com/golang/protobuf/@v/v1.3.2.mod": dial tcp 172.217.160.113:443: i/o timeout: exit status 1
解决(访问golang的官网):
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
与网络交互
二进制文件添加到您的CLI路径:export PATH=${PWD}/../bin:$PATH
将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:export FABRIC_CFG_PATH=$PWD/../config/
设置环境变量以允许您作为Org1操作peer CLI:
# Environment variables for 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":[]}'
用CLI 工具来查询账本:peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
调用 asset-transfer (basic) 链码改变账本上的资产所有者:
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"]}'
设置环境变量以允许您作为Org2操作peer CLI:
# Environment variables for 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 asset-transfer (basic) 链码:
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'