HyperLedger Fabric开发(二)----- 基于CentOS7搭建fabric1.4

            Fabri1.4安装文档
********************************************************************
************  操作系统:Centos7   **********
************  内存:2GB             **********
************  硬盘(SCSI):40GB  **********
********************************************************************
一:安装curl、git、vim、wget等基础软件(root账号不用带sudo)
安装curl         sudo yum install curl
安装git          sudo yum install git
安装vim          sudo yum install vim
安装wget         sudo yum install wget

二:CentOS7安装docker:
yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum list docker-ce --showduplicates | sort -r

yum install docker-ce-18.03.1.ce

三:安装 docker-compose 1.14.0 或更高版本:
curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限:
chmod +x /usr/local/bin/docker-compose

# 查看docker-compose版本:
docker-compose --version

四:docker的镜像加速器配置:
systemctl start docker.service

systemctl status docker.service

# 镜像加速配置(root用户不用带sudo命令):镜像加速的地址可以自行百度或者在阿里云上申请自己的
sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

# docker开机启动和docker-compose开机启动执行相应的各个docker容器:
1.开机启动docker
systemctl enable docker.service

2.docker-compose启动
vim /etc/rc.d/rc.local
/usr/local/bin/docker-compose -f /www/docker/trace_fecshop/docker-compose.yml up -d

五:安装 Go 语言 1.12.x 版本:

1.下载go的压缩包:
curl -O https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz

2.将压缩包解压到/usr/local目录下:
tar -C /usr/local -xzf go1.12.4.linux-amd64.tar.gz

3.GO语言环境变量的配置:
# 编辑profile文件:
vi /etc/profile

# 按A/I/O进入编辑模式,在末行添加:
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN

# 保存退出后,执行以下命令使之生效:
source /etc/profile

# 查看go版本判断环境变量是否配置成功:
go version

六:安装Nodejs:

1.更新node.js v8.x yum源
curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -

2.yum安装node.js
yum install -y nodejs

3.查看node.js版本.
node -v

七:安装npm
1.安装npm
npm install npm -g

2.查看npm版本号:
npm -version

八:安装 Python 2.7
1.使用yum安装python:
yum install python

2.查看Python版本号:
python -V

**************************************************
九:下载 fabric 可执行文件、示例与 docker 镜像
***************************************************
cd ~

mkdir fabric

cd fabric

curl -sSL https://bit.ly/2ysbOFE | bash -s 1.4.0
#下载、安装成功后,当前目录fabric下会增加一个 fabric-samples 目录
# 使用docker images查看下载的镜像: 
docker images

# 将 Fabric 可执行文件目录加入系统路径:
vi /etc/profile

# 进入编辑模式后在末行添加:
export FABRICBIN=~/fabric/fabric-samples/bin
export PATH=$PATH:$FABRICBIN

# 保存退出后,执行以下命令使之生效:
source /etc/profile


*********************************************************
十:SDK安装: Nodejs安装
*********************************************************
# 下载 Fabric-SDK-Nodejs:
cd ~/fabric
# 获取最新版本,并保持版本一致,我们直接从 GitHub 上下载 SDK 源码并使用:
git clone -b release-1.4 https://github.com/hyperledger/fabric-sdk-node.git


# CentOS7安装build-essential:(此步骤执行过程可能会有问题,尝试以下命令进行安装即可)
yum groups mark install "Development Tools"
# 或者yum groups mark install "Development Tools"
# 或者yum groups mark convert "Development Tools"
# 或者yum groupinstall "Development Tools"

#安装 npm Dependencies:
cd ~/fabric/fabric-sdk-node
cd fabric-common && npm install && cd ..
cd fabric-ca-client && npm install && cd ..
cd fabric-client && npm install && cd ..
cd fabric-network && npm install && cd ..
 
cd ~/fabric/fabric-sdk-node
npm install
# 在执行 npm install 过程中,可能会遇到错误,请尝试删除 node_modules 目录,以及 package-lock.json 文件,并重试。很可能多次重试。


十一:手动部署 first-network
1. 进入 first-network
cd  ~
cd fabric/fabric-samples/first-network
# 清理临时文件、docker 容器、镜像及网络----注意以前的docker文件都会被清除,如果有在线运行的docke容器,请单独清除容器。
./byfn.sh down

2. 运行环境变量(以下命令可一起在命令行中执行,配置的是临时环境变量)
export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=${PWD}
export CLI_TIMEOUT=10
export CLI_DELAY=3
export CHANNEL_NAME="mychannel"
export COMPOSE_FILE=docker-compose-cli.yaml
export COMPOSE_FILE_COUCH=docker-compose-couch.yaml
export COMPOSE_FILE_ORG3=docker-compose-org3.yaml
export LANGUAGE=golang
export IMAGETAG="latest"
export VERBOSE=true

3. 生成证书
cryptogen generate --config=./crypto-config.yaml

4. 生成创世区块 Genesis Block
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

5. 生成其他 Channel 文件
# 生成 Channel 配置 Transaction:
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

# 生成锚节点配置 Transaction for Org1:
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP

# 生成锚节点配置 Transaction for Org2:
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHAFNEL_NAME -asOrg Org2MSP

*****6. 启动区块链网络
docker-compose -f /root/fabric/fabric-samples/first-network/docker-compose-cli.yaml up -d 2>&1

#启动后,执行 docker ps 可以看到 6 个 docker container:
docker ps --format "{{.ID}}\t{{.Command}}\t {{.Image}}\t{{.Names}}"

7. 登录 cli Container(退出容器:exit)
docker exec -it cli bash

8. 准备环境变量(可以一同在命令行中执行)
export CHANNEL_NAME="mychannel"
export LANGUAGE=golang
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
 
export PEER0_ORG1_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export ORG1_MSP=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
export ORG2_MSP=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
 
export CC_SRC_PATH="github.com/chaincode/chaincode_example02/go/"
 
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=$ORG1_MSP
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051

9. 创建 Channel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA

10. 加入 Channel
# 将之前在配置文件中定义的 4 个节点加入 channel

# joinChannelWithRetry 0 1
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=$ORG1_MSP
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer channel join -b $CHANNEL_NAME.block
 
# joinChannelWithRetry 1 1
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=$ORG1_MSP
export CORE_PEER_ADDRESS=peer1.org1.example.com:7051
peer channel join -b $CHANNEL_NAME.block
 
# joinChannelWithRetry 0 2
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=$ORG2_MSP
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
peer channel join -b $CHANNEL_NAME.block
 
# joinChannelWithRetry 1 2
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=$ORG2_MSP
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051
peer channel join -b $CHANNEL_NAME.block

11. 更新 Anchor Peer
# updateAnchorPeers 0 1
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=$ORG1_MSP
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
 
# updateAnchorPeers 0 2
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=$ORG2_MSP
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA

12. 安装 Chaincode
# 在 cli container 中安装 chaincode(以下命令可以一同在命令行中执行,需注意执行结果是否成功)

# installChaincode in peer 0 1
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
export CORE_PEER_MSPCONFIGPATH=$ORG1_MSP
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export VERSION="1.0"
peer chaincode install -n mycc -v ${VERSION} -l ${LANGUAGE} -p ${CC_SRC_PATH}
 
# installChaincode in peer 0 2
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=$ORG2_MSP
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export VERSION="1.0"
peer chaincode install -n mycc -v ${VERSION} -l ${LANGUAGE} -p ${CC_SRC_PATH}

13. 实例化 Chaincode(以下命令可以一同在命令行中执行,需注意执行结果是否成功))

export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
export CORE_PEER_MSPCONFIGPATH=$ORG2_MSP
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export VERSION="1.0"
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -l ${LANGUAGE} -v ${VERSION} -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

14. 测试Chaincode –Query:
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
# 得到结果为 100,即为这个 channel ledger 中 "a" 所对应的初始的值。
# peer chaincode query 命令会获得经背书的 chaincode 执行结果。但它不会产生 transaction。
# Chaincode –Invoke:
export PEER_CONN_PARMS="--peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles  /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses  peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
# 执行a向b转账10
peer chaincode invoke -o orderer.example.com:7050 --tls $  --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc $PEER_CONN_PARMS -c '{"Args":["invoke","a","b","10"]}'

#再次查询:
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
#返回结果为: 90

=====================再次启动Fabric网络(方式一)=======================
1. 进入 first-network
cd  ~
cd fabric/fabric-samples/first-network

*****2. 启动区块链网络(使用 docker-compose 来批量启动网络)
docker-compose -f /root/fabric/fabric-samples/first-network/docker-compose-cli.yaml up -d 2>&1
或者:docker-compose -f docker-compose-cli.yaml up -d  【注意: -d 是可选项,加了的话就不会打印详细的启动过程日志,个人建议不要加】
启动后,执行 docker ps 可以看到 6 个 docker container (也可以直接使用命令:docker ps):
docker ps --format "{{.ID}}\t{{.Command}}\t {{.Image}}\t{{.Names}}"
(使用此命令查看启动日志:docker logs -f  容器ID/容器名称 )
3. 登录 cli Container(退出容器:exit)
docker exec -it cli bash  或者  docker exec -ti cli /bin/bash 

4. 测试Chaincode –Query:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
得到结果为 100,即为这个 channel ledger 中 "a" 所对应的初始的值。

====================再次启动Fabric网络(方式二)============================
cd  ~
cd fabric/fabric-samples/first-network
# 为各种网络实体生成所有证书和密钥,用于引导订购服务以及配置通道所需的一系列配置事务(生成证书及创世块)
./byfn.sh -m generate
# 启动网络(如果启动发生错误,则执行关闭命令 ./byfn.sh -m down 后再次执行启动命令)
./byfn.sh -m up

当出现如下:“END”,即表示Fabric网络启动成功
    ===================== All GOOD, BYFN execution completed =====================
     _____   _   _   ____
    | ____| | \ | | |  _ \
    |  _|   |  \| | | | | |
    | |___  | |\  | | |_| |
    |_____| |_| \_| |____/

关闭Fabric网络可以使用:
./byfn.sh -m down

# 登录 cli Container(退出容器:exit)
docker exec -it cli bash  或者  docker exec -ti cli /bin/bash 

# 测试Chaincode –Query:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
得到结果为 100,即为这个 channel ledger 中 "a" 所对应的初始的值。
=====================================================================
想要知道cli容器当前所指的身份环境是那个peer或者组织:
echo $CORE_PEER_LOCALMSPID      ##  查看 当前的组织
echo $CORE_PEER_ADDRESS           ##   查看 当前peer的服务地址
echo $CORE_PEER_MSPCONFIGPATH   ##  查看  当前资源的管理员MSP 身份信息
echo $CORE_PEER_TLS_ROOTCERT_FILE    ##  查看  当前资源的TLS根证书
如我们默认docker-compose-cli.yaml中配置了org1的peer0作为cli容器的默认指向环境那么我们第一次进入cli就依次执行上述命令得到。

你可能感兴趣的:(Linux,区块链)