Open johnnian opened 4 years ago
硬件要求:至少有 8G 内存,100G硬盘
Windows 操作系统下安装 VMware Workstation+Centos 来得到 Linux 环境
Windows
VMware Workstation+Centos
Linux
官网下载,自行安装即可
Centos7下载,自行安装即可,参照一下注意事项
step1: 进入下载页,选择阿里云站点进行下载
阿里云站点:http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/
PS:每个链接都包括了镜像文件的地址、类型及版本号等信息,选择当前国家资源区站点下载,获取资源速度比较快
step2: 进入阿里云站点,选择 CentOS-7-x86_64-DVD-2003.iso 下载
具体操作步骤可参照共享目录
yum -y install wget
1、备份本地源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
2 、获取阿里源配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3 、更新epel仓库
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
4 、更新cache
yum makecache yum -y update
curl 已内置
安装Git:
yum install -y git
基本要求:虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上
1、root账户登录,查看内核版本如下
uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com Package device-mapper-persistent-data-0.8.5-2.el7.x86_64 already installed and latest version Package 7:lvm2-2.02.186-7.el7_8.2.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package yum-utils.noarch 0:1.1.31-54.el7_8 will be installed --> Processing Dependency: python-kitchen for package: yum-utils-1.1.31-54.el7_8.noarch --> Processing Dependency: libxml2-python for package: yum-utils-1.1.31-54.el7_8.noarch --> Running transaction check ---> Package libxml2-python.x86_64 0:2.9.1-6.el7.4 will be installed ---> Package python-kitchen.noarch 0:1.1.1-5.el7 will be installed --> Processing Dependency: python-chardet for package: python-kitchen-1.1.1-5.el7.noarch --> Running transaction check ---> Package python-chardet.noarch 0:2.2.1-3.el7 will be installed --> Finished Dependency Resolution
3、设置yum源(选择其中一个,任何一个均可)
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo Loaded plugins: fastestmirror adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo
4、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
5、安装Docker,命令:yum install docker-ce-版本号,我选的是docker-ce-18.06.3.ce,如下
yum -y install docker-ce-18.06.3.ce Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com Resolving Dependencies --> Running transaction check ---> Package docker-ce.x86_64 0:18.06.3.ce-3.el7 will be installed
由于repo中默认只开启stable仓库,故这里安装的是最新稳定版18.06.3
6、启动并加入开机启动
sudo systemctl start docker sudo systemctl enable docker
7、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
8、设置国内镜像源
在/etc/docker目录下找到在daemon.json文件(没有就新建),将下面内容写入
{ "registry-mirrors": ["http://hub-mirror.c.163.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"] }
9、重启daemon:sudo systemctl daemon-reload
10、重启docker服务:sudo systemctl restart docker
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
建议下载1.13.8以上的版本,否则编译fabric的时候会报错
wget https://dl.google.com/go/go1.14.linux-amd64.tar.gz tar -xvf go1.14.linux-amd64.tar.gz mv ./go /usr/local
创建GO工作目录
mkdir -p /home/go/src
设置环境变量 vim /etc/profile
在最下面添加下面三行代码
export GOROOT=/usr/local/go export GOPATH=/home/go export PATH=$PATH:$GOROOT/bin source /etc/profile
验证Golang版本:go version
cp /home/workspace
docker-compose -f dozzle-docker-compose.yml up -d
启动后容器列表
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f3db28970111 amir20/dozzle:latest "/dozzle" About an hour ago Up About an hour 0.0.0.0:9999->8080/tcp dozzle
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
或采用快照加速
git clone https://github.com.cnpmjs.org/hyperledger/fabric.git
cd fabric
# 查看版本号
git tag
*# 切换到1.4.7版本分支下
git checkout v1.4.7
# 查看当前分支
git branch -a
# 可以看到已经切换到1.4.7下
* (detached from v1.4.7) master remotes/origin/HEAD -> origin/master remotes/origin/feature/ca remotes/origin/feature/convergence remotes/origin/master remotes/origin/release-1.0 remotes/origin/release-1.1 remotes/origin/release-1.2 remotes/origin/release-1.3 remotes/origin/release-1.4 remotes/origin/release-2.0 remotes/origin/release-2.1 remotes/origin/release-2.2 remotes/origin/v0.6 remotes/origin/v1.0.0-preview
编译
yum -y install gcc gcc-c++ kernel-devel make release
编译完成后可得到对应的可执行文件
ls /home/go/src/github.com/hyperledger/fabric/release/linux-amd64/bin -rwxr-xr-x. 1 root root 24241952 Jul 10 21:54 configtxgen -rwxr-xr-x. 1 root root 26716744 Jul 10 21:55 configtxlator -rwxr-xr-x. 1 root root 16722424 Jul 10 21:55 cryptogen -rwxr-xr-x. 1 root root 25279184 Jul 10 21:55 discover -rwxr-xr-x. 1 root root 15109144 Jul 10 21:55 idemixgen -rwxr-xr-x. 1 root root 37721656 Jul 10 21:55 orderer -rwxr-xr-x. 1 root root 45093176 Jul 10 21:55 peer
启动网络 进入/home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network目录,运行./byfn.sh -m up即可启动网络,启动之后可能会出现命令行断开的情况。只需要登录同网段的节点,ssh到fabric节点,重新启动一下网络即可。
cd $GOPATH/src/github.com/hyperledger/fabric/ make peer
计算机输出:
.build/bin/peer CGO_CFLAGS=" " GOBIN=/home/go/src/github.com/hyperledger/fabric/.build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.4.7 -X github.com/hyperledger/fabric/common/metadata.CommitSHA=e0afaa7 -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.20 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger" github.com/hyperledger/fabric/peer Binary available as .build/bin/peer
根据输出得知编译好的 peer 二进制文件在 ./.build/bin/ 下面,把它复制到 GOPATH/bin 下即可:
peer
./.build/bin/
GOPATH/bin
cp .build/bin/peer $GOROOT/bin/
然后在任意目录下运行:
peer version
终端返回:
peer: Version: 1.4.7 Commit SHA: e0afaa7 Go version: go1.14 OS/Arch: linux/amd64 Chaincode: Base Image Version: 0.4.20 Base Docker Namespace: hyperledger Base Docker Label: org.hyperledger.fabric Docker Namespace: hyperledger
fabric-order
cd $GOPATH/src/github.com/hyperledger/fabric/ make orderer
计算机输出:
.build/bin/orderer CGO_CFLAGS=" " GOBIN=/home/go/src/github.com/hyperledger/fabric/.build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.4.7 -X github.com/hyperledger/fabric/common/metadata.CommitSHA=e0afaa7 -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.20 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger" github.com/hyperledger/fabric/orderer Binary available as .build/bin/orderer
同样把它移到 $GOPATH/bin
$GOPATH/bin
cp .build/bin/orderer $GOROOT/bin
验证是否安装成功:
orderer version
orderer: Version: 1.4.7 Commit SHA: e0afaa7 Go version: go1.14 OS/Arch: linux/amd64
fabric-ca
拉取 fabric-ca 代码:
git clone https://github.com/hyperledger/fabric-ca.git 或快照加速 git clone https://github.com.cnpmjs.org/hyperledger/fabric-ca.git
过一阵子代码就下载到了 $GOPATH/src/github.com/hyperledger/fabric-ca/ 下面了,进入该目录,即可开始安装 fabric-ca 组件。
$GOPATH/src/github.com/hyperledger/fabric-ca/
切换目标分支
git tag git checkout v1.4.7 git branch -a
编译 fabric-ca-server:
fabric-ca-server
cd $GOPATH/src/github.com/hyperledger/fabric-ca/ make fabric-ca-server
Building fabric-ca-server in bin directory ... Built bin/fabric-ca-server
复制到 $GOPATH/bin/:
$GOPATH/bin/
cp ./bin/fabric-ca-server $GOROOT/bin
fabric-ca-server version fabric-ca-server: Version: 1.4.7 Go version: go1.14 OS/Arch: linux/amd64
同样安装 fabric-ca-client:
fabric-ca-client
make fabric-ca-client
后续步骤和安装 fabric-ca-server 相同。
cryptogen(用于生成组织机构和身份文件)、configtxgen(生成配置区块和配置交易)、configtxlator(解读配置信息)、discover(服务发现命令行工具)、idemixgen(MSP配置生成器,fabric的零知识身份证明有两种方法,一个是通过CA,另一个是通过idemixgen)等:
cryptogen
configtxgen
configtxlator
discover
idemixgen
这里用 configtxgen 作为示例,其他的把对应名字改为 cryptogen/configtxlator/discover /idemixgen就 ok 了:
cd $GOPATH/src/github.com/hyperledger/fabric make configtxgen
最后计算机输出是:
.build/bin/configtxgen CGO_CFLAGS=" " GOBIN=/home/go/src/github.com/hyperledger/fabric/.build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/tools/configtxgen/metadata.CommitSHA=e0afaa7" github.com/hyperledger/fabric/common/tools/configtxgen Binary available as .build/bin/configtxgen
表示成功编译。 执行 ./.build/bin/configtxgen --version 会有以下输出:
./.build/bin/configtxgen --version
configtxgen: Version: 1.4.7 Commit SHA: e0afaa7 Go version: go1.14 OS/Arch: linux/amd64
这样,在 Linux 环境下安装好了 Fabric 对应环境。
Fabric
# 下载基础镜像以及samples cd /home/go/src/github.com/hyperledger/fabric/scripts ./bootstrap.sh 1.4.7 -s # 初始化组件环境变量 # 方式一: # 复制可执行配置文件至全局: cp /home/go/src/github.com/hyperledger/fabric/release/linux-amd64/bin/* $GOROOT/bin/ # 赋执行权限:chmod +x $GOROOT/bin/* # 方式二: # 复制可执行配置文件至示例项目: cd /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/ cp /home/go/src/github.com/hyperledger/fabric/release/linux-amd64/bin ./ # 赋执行权限:chmod +x ./bin/* # 进入主目录 cd first-network/
生成密钥、创世区块(可选)
sh byfn.sh -m generate Generating certs and genesis block for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] y proceeding ... /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/bin/cryptogen ########################################################## ##### Generate certificates using cryptogen tool ######### ########################################################## + cryptogen generate --config=./crypto-config.yaml org1.example.com org2.example.com + res=0 + set +x Generate CCP files for Org1 and Org2 /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/bin/configtxgen ########################################################## ######### Generating Orderer Genesis block ############## ########################################################## CONSENSUS_TYPE=solo + '[' solo == solo ']' + configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block 2020-07-11 03:56:18.863 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:56:18.959 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: solo 2020-07-11 03:56:18.959 CST [common.tools.configtxgen.localconfig] Load -> INFO 003 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.053 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 004 orderer type: solo 2020-07-11 03:56:19.053 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 005 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.057 CST [common.tools.configtxgen] doOutputBlock -> INFO 006 Generating genesis block 2020-07-11 03:56:19.059 CST [common.tools.configtxgen] doOutputBlock -> INFO 007 Writing genesis block + res=0 + set +x ################################################################# ### Generating channel configuration transaction 'channel.tx' ### ################################################################# + configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel 2020-07-11 03:56:19.089 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:56:19.181 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.273 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo 2020-07-11 03:56:19.274 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.274 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 005 Generating new channel configtx 2020-07-11 03:56:19.277 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 006 Writing new channel tx + res=0 + set +x ################################################################# ####### Generating anchor peer update for Org1MSP ########## ################################################################# + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP 2020-07-11 03:56:19.307 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:56:19.402 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.488 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo 2020-07-11 03:56:19.488 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.488 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update 2020-07-11 03:56:19.489 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update + res=0 + set +x ################################################################# ####### Generating anchor peer update for Org2MSP ########## ################################################################# + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP 2020-07-11 03:56:19.525 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:56:19.614 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.701 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo 2020-07-11 03:56:19.701 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:56:19.701 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update 2020-07-11 03:56:19.701 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update + res=0 + set +x
启动区块链网络:
sh byfn.sh -m up 前台日志 Starting for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] y proceeding ... LOCAL_VERSION=1.4.7 DOCKER_IMAGE_VERSION=1.4.7 /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/bin/cryptogen ########################################################## ##### Generate certificates using cryptogen tool ######### ########################################################## + cryptogen generate --config=./crypto-config.yaml org1.example.com org2.example.com + res=0 + set +x Generate CCP files for Org1 and Org2 /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/bin/configtxgen ########################################################## ######### Generating Orderer Genesis block ############## ########################################################## CONSENSUS_TYPE=solo + '[' solo == solo ']' + configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block 2020-07-11 03:12:56.333 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:12:56.426 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: solo 2020-07-11 03:12:56.426 CST [common.tools.configtxgen.localconfig] Load -> INFO 003 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:56.517 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 004 orderer type: solo 2020-07-11 03:12:56.517 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 005 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:56.519 CST [common.tools.configtxgen] doOutputBlock -> INFO 006 Generating genesis block 2020-07-11 03:12:56.519 CST [common.tools.configtxgen] doOutputBlock -> INFO 007 Writing genesis block + res=0 + set +x ################################################################# ### Generating channel configuration transaction 'channel.tx' ### ################################################################# + configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel 2020-07-11 03:12:56.554 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:12:56.648 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:56.738 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo 2020-07-11 03:12:56.739 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:56.739 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 005 Generating new channel configtx 2020-07-11 03:12:56.741 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 006 Writing new channel tx + res=0 + set +x ################################################################# ####### Generating anchor peer update for Org1MSP ########## ################################################################# + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP 2020-07-11 03:12:56.775 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:12:56.868 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:56.960 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo 2020-07-11 03:12:56.960 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:56.960 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update 2020-07-11 03:12:56.960 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update + res=0 + set +x ################################################################# ####### Generating anchor peer update for Org2MSP ########## ################################################################# + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP 2020-07-11 03:12:56.997 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-07-11 03:12:57.093 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:57.182 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo 2020-07-11 03:12:57.182 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml 2020-07-11 03:12:57.182 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update 2020-07-11 03:12:57.182 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update + res=0 + set +x Creating network "net_byfn" with the default driver Creating volume "net_orderer.example.com" with default driver Creating volume "net_peer0.org1.example.com" with default driver Creating volume "net_peer1.org1.example.com" with default driver Creating volume "net_peer0.org2.example.com" with default driver Creating volume "net_peer1.org2.example.com" with default driver Creating orderer.example.com ... done Creating peer1.org1.example.com ... done Creating peer0.org1.example.com ... done Creating peer1.org2.example.com ... done Creating peer0.org2.example.com ... done Creating cli ... done CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 65a6945709c7 hyperledger/fabric-tools:latest "/bin/bash" Less than a second ago Up Less than a second cli f75c918d11a9 hyperledger/fabric-peer:latest "peer node start" 1 second ago Up Less than a second 0.0.0.0:9051->9051/tcp peer0.org2.example.com 68b7559fb7c3 hyperledger/fabric-peer:latest "peer node start" 1 second ago Up Less than a second 0.0.0.0:10051->10051/tcp peer1.org2.example.com 1666d9a0fb51 hyperledger/fabric-peer:latest "peer node start" 1 second ago Up Less than a second 0.0.0.0:7051->7051/tcp peer0.org1.example.com af14960f9de4 hyperledger/fabric-peer:latest "peer node start" 1 second ago Up Less than a second 0.0.0.0:8051->8051/tcp peer1.org1.example.com f0473fa71bf9 hyperledger/fabric-orderer:latest "orderer" 1 second ago Up Less than a second 0.0.0.0:7050->7050/tcp orderer.example.com 89a33b3147a0 amir20/dozzle:latest "/dozzle" About an hour ago Up About an hour 0.0.0.0:9999->8080/tcp dozzle ____ _____ _ ____ _____ / ___| |_ _| / \ | _ \ |_ _| \___ \ | | / _ \ | |_) | | | ___) | | | / ___ \ | _ < | | |____/ |_| /_/ \_\ |_| \_\ |_| Build your first network (BYFN) end-to-end test Channel name : mychannel Creating channel... + peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem + res=0 + set +x 2020-07-10 19:12:59.978 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-07-10 19:13:00.002 UTC [cli.common] readBlock -> INFO 002 Received block: 0 + peer channel join -b mychannel.block ===================== Channel 'mychannel' created ===================== Having all peers join the channel... + res=0 + set +x 2020-07-10 19:13:00.063 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-07-10 19:13:00.092 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel ===================== peer0.org1 joined channel 'mychannel' ===================== + peer channel join -b mychannel.block + res=0 + set +x 2020-07-10 19:13:03.166 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-07-10 19:13:03.198 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel ===================== peer1.org1 joined channel 'mychannel' ===================== + peer channel join -b mychannel.block + res=0 + set +x 2020-07-10 19:13:06.270 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-07-10 19:13:06.293 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel ===================== peer0.org2 joined channel 'mychannel' ===================== + peer channel join -b mychannel.block + res=0 + set +x 2020-07-10 19:13:09.369 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-07-10 19:13:09.396 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel ===================== peer1.org2 joined channel 'mychannel' ===================== Updating anchor peers for org1... + peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem + res=0 + set +x 2020-07-10 19:13:12.469 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-07-10 19:13:12.481 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update ===================== Anchor peers updated for org 'Org1MSP' on channel 'mychannel' ===================== Updating anchor peers for org2... + peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem + res=0 + set +x 2020-07-10 19:13:15.563 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized 2020-07-10 19:13:15.574 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update ===================== Anchor peers updated for org 'Org2MSP' on channel 'mychannel' ===================== Installing chaincode on peer0.org1... + peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/ + res=0 + set +x 2020-07-10 19:13:18.657 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-07-10 19:13:18.657 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc 2020-07-10 19:13:19.097 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" > ===================== Chaincode is installed on peer0.org1 ===================== Install chaincode on peer0.org2... + peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/ + res=0 + set +x 2020-07-10 19:13:19.166 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-07-10 19:13:19.166 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc 2020-07-10 19:13:19.454 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" > ===================== Chaincode is installed on peer0.org2 ===================== Instantiating chaincode on peer0.org2... + peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')' + res=0 + set +x 2020-07-10 19:13:19.569 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-07-10 19:13:19.569 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc ===================== Chaincode is instantiated on peer0.org2 on channel 'mychannel' ===================== Querying chaincode on peer0.org1... ===================== Querying on peer0.org1 on channel 'mychannel'... ===================== + peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' Attempting to Query peer0.org1 ...3 secs + res=0 + set +x 100 ===================== Query successful on peer0.org1 on channel 'mychannel' ===================== Sending invoke transaction on peer0.org1 peer0.org2... + peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc --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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}' + res=0 + set +x 2020-07-10 19:13:50.271 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 ===================== Invoke transaction successful on peer0.org1 peer0.org2 on channel 'mychannel' ===================== Installing chaincode on peer1.org2... + peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/ + res=0 + set +x 2020-07-10 19:13:50.333 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc 2020-07-10 19:13:50.333 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc 2020-07-10 19:13:50.553 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" > ===================== Chaincode is installed on peer1.org2 ===================== Querying chaincode on peer1.org2... ===================== Querying on peer1.org2 on channel 'mychannel'... ===================== + peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' Attempting to Query peer1.org2 ...3 secs + res=0 + set +x 90 ===================== Query successful on peer1.org2 on channel 'mychannel' ===================== ========= All GOOD, BYFN execution completed =========== _____ _ _ ____ | ____| | \ | | | _ \ | _| | \| | | | | | | |___ | |\ | | |_| | |_____| |_| \_| |____/
后台链码容器日志
dev-peer0.org1.example.com-mycc-1.0
dev-peer0.org2.example.com-mycc-1.0
dev-peer1.org2.example.com-mycc-1.0
sh byfn.sh -m down 关闭容器、清除容器及文件
> 请在网络不再使用时,务必关闭网络,以防止后期启动网络时造成的错误。
Hyperledger Fabric 网络搭建
1开发环境搭建
1.1 Linux环境搭建
虚拟机初始化Linux系统
初始化CentOS
硬件要求:至少有 8G 内存,100G硬盘
Windows
操作系统下安装VMware Workstation+Centos
来得到Linux
环境 官网下载,自行安装即可
Centos7下载,自行安装即可,参照一下注意事项
step1: 进入下载页,选择阿里云站点进行下载
阿里云站点:http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/
PS:每个链接都包括了镜像文件的地址、类型及版本号等信息,选择当前国家资源区站点下载,获取资源速度比较快
step2: 进入阿里云站点,选择 CentOS-7-x86_64-DVD-2003.iso 下载
宿主机与虚机共享文件
具体操作步骤可参照共享目录
Linux系统配置优化
安装wget
更新yum源
1、备份本地源
2 、获取阿里源配置文件
3 、更新epel仓库
4 、更新cache
1.2 辅助环境安装配置
前置软件Git curl
curl 已内置
安装Git:
安装Docker及配置
基本要求:虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上
1、root账户登录,查看内核版本如下
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
3、设置yum源(选择其中一个,任何一个均可)
4、可以查看所有仓库中所有docker版本,并选择特定版本安装
5、安装Docker,命令:yum install docker-ce-版本号,我选的是docker-ce-18.06.3.ce,如下
由于repo中默认只开启stable仓库,故这里安装的是最新稳定版18.06.3
6、启动并加入开机启动
7、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
8、设置国内镜像源
在/etc/docker目录下找到在daemon.json文件(没有就新建),将下面内容写入
9、重启daemon:sudo systemctl daemon-reload
10、重启docker服务:sudo systemctl restart docker
安装Docker-compose
安装Golang及配置
建议下载1.13.8以上的版本,否则编译fabric的时候会报错
创建GO工作目录
设置环境变量 vim /etc/profile
在最下面添加下面三行代码
验证Golang版本:go version
安装Docker容器实时日志服务
cp /home/workspace
docker-compose -f dozzle-docker-compose.yml up -d
启动后容器列表
1.3 脚本化安装Fabric
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
或采用快照加速
git clone https://github.com.cnpmjs.org/hyperledger/fabric.git
cd fabric
# 查看版本号
git tag
*# 切换到1.4.7版本分支下
git checkout v1.4.7
# 查看当前分支
git branch -a
# 可以看到已经切换到1.4.7下
编译
编译完成后可得到对应的可执行文件
启动网络 进入/home/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network目录,运行./byfn.sh -m up即可启动网络,启动之后可能会出现命令行断开的情况。只需要登录同网段的节点,ssh到fabric节点,重新启动一下网络即可。
1.4 编译安装Fabric
编译安装peer组件
计算机输出:
根据输出得知编译好的
peer
二进制文件在./.build/bin/
下面,把它复制到GOPATH/bin
下即可:然后在任意目录下运行:
终端返回:
编译安装
fabric-order
组件计算机输出:
同样把它移到
$GOPATH/bin
验证是否安装成功:
终端返回:
编译安装
fabric-ca
组件拉取
fabric-ca
代码:过一阵子代码就下载到了
$GOPATH/src/github.com/hyperledger/fabric-ca/
下面了,进入该目录,即可开始安装fabric-ca
组件。切换目标分支
编译
fabric-ca-server
:计算机输出:
复制到
$GOPATH/bin/
:验证是否安装成功:
同样安装
fabric-ca-client
:后续步骤和安装
fabric-ca-server
相同。编译其他辅助工具
cryptogen
(用于生成组织机构和身份文件)、configtxgen
(生成配置区块和配置交易)、configtxlator
(解读配置信息)、discover
(服务发现命令行工具)、idemixgen
(MSP配置生成器,fabric的零知识身份证明有两种方法,一个是通过CA,另一个是通过idemixgen)等:这里用
configtxgen
作为示例,其他的把对应名字改为cryptogen
/configtxlator
/discover
/idemixgen
就 ok 了:最后计算机输出是:
表示成功编译。 执行
./.build/bin/configtxgen --version
会有以下输出:这样,在 Linux 环境下安装好了
Fabric
对应环境。2 案例运行与模拟使用
2.1 初始化必要组件
2.2 启动网络
生成密钥、创世区块(可选)
启动区块链网络:
后台链码容器日志
dev-peer0.org1.example.com-mycc-1.0
dev-peer0.org2.example.com-mycc-1.0
dev-peer1.org2.example.com-mycc-1.0
2.3 关闭网络