参考https://docs.docker.com/install/linux/docker-ce/ubuntu/
curl -fsSLhttp://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64]http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs)stable"
sudo apt-get -y update
sudo apt-get install docker-ce
sudo mkdir -p /etc/docker
vim /etc/docker/daemon.json
添加
{ "registry-mirrors" : ["https://obou6wyb.mirror.aliyuncs.com"] }
重启docker
sudo systemctl daemon-reload 加载docker.service
sudo systemctl restart docker.service 重启docker服务
首先安装pip,sudo apt-get install python-pip
curl-Lhttps://get.daocloud.io/docker/compose/releases/download/1.21.2/docker-compose-`uname-s`-`uname -m`>/usr/local/bin/docker-compose
chmod+x /usr/local/bin/docker-compose
docker-composeversion
cd /home/hadoop/
wget https://studygolang.com/dl/golang/go1.10.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
mkdir gopath
vim/etc/profile
添加
export PATH=$PATH:/usr/local/go/bin
#export GOPATH=/opt/gopath
export GOPATH=/home/hadoop/gopath
export GOROOT=/usr/local/go
source /etc/profile 使环境变量生效
go version查看go是否安装成功
mkdir-p /home/hadoop/gopath/src/github.com/hyperledger
cd /home/hadoop/gopath/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout v1.0.0(切记:一定要做,切换至对应分支)
cd /home/hadoop/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
(切记:版本要与fabric对应住)
docker images 查看镜像列表
./network_setup.sh up
该过程主要做了以下操作
1) 生成公私钥和证书
2) 生成创世区块和channel通道配置信息
3) 启动fabric环境的容器
4) 创建通道
5) 各个peer加入通道
6) 安装链上代码
7) 实例化代码
1)编译生成cryptogen
cd /home/hadoop/gopath/src/github.com/hyperledger/fabric
make cryptogen
运行后返回结果
build/bin/cryptogen
CGO_CFLAGS="" GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin goinstall -tags "" -ldflags "-Xgithub.com/hyperledger/fabric/common/tools/cryptogen/metadata.Version=1.0.0"github.com/hyperledger/fabric/common/tools/cryptogen
Binary available asbuild/bin/cryptogen
2)生成公私钥和证书
cd examples/e2e_cli/
../../build/bin/cryptogen generate--config=./crypto-config.yaml
此时生成了公私钥,并保存在crypto-config文件中
tree crypto-config查看生成的证书
1)编译生成configtxgen
cd /home/hadoop/gopath/src/github.com/hyperledger/fabric
make configtxgen
运行后结果
build/bin/configtxgen
CGO_CFLAGS=" "GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin go install-tags "nopkcs11" -ldflags "-Xgithub.com/hyperledger/fabric/common/configtx/tool/configtxgen/metadata.Version=1.0.0"github.com/hyperledger/fabric/common/configtx/tool/configtxgen
Binary available as build/bin/configtxgen
2)生成创世区块
cd examples/e2e_cli/
../../build/bin/configtxgen -profileTwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
3)生成channel通道配置
../../build/bin/configtxgen -profileTwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelIDmychannel
4)另外关于锚节点更新,我们也需要使用这个程序来生成文件
../../build/bin/configtxgen -profileTwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx-channelID mychannel -asOrg Org1MSP
../../build/bin/configtxgen -profileTwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx-channelID mychannel -asOrg Org2MSP
两个组织,生成两个锚节点
此时能看到channel-artifacts下四个文件
channel-artifacts/
├── channel.tx
├── genesis.block
├── Org1MSPanchors.tx
└── Org2MSPanchors.tx
由于手动部署,启动前需要将docker-compose-cli.yaml中信息更改
vim docker-compose-cli.yaml
注释掉command: /bin/bash -c './scripts/script.sh${CHANNEL_NAME}; sleep $TIMEOUT'
另更正一个错误 /base/peer.yaml中将network信息elecli_default改为ele_cli_default(ele_cli文件夹的默认网络名称)
docker-compose -f docker-compose-cli.yaml up-d
此时显示启动了四个peer,一个orderer,一个cli客户端
1)创建channel
docker exec -it cli bash 进入客户端容器
创建Channel的命令是peer channelcreate,我们前面创建2.4创建Channel的配置区块时,指定了Channel的名字是mychannel,那么这里我们必须创建同样名字的channel。
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
peer channel create -oorderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tlstrue --cafile $ORDERER_CA
此时创建成功一个maychannel.block文件,其他peer节点加入都需要该文件
2)各peer加入channel
peerchannel join -b mychannel.block (CLI客户端默认链接peer0.org1,因此该节点加入比较简单)
其他节点加入(以peer1.org1为例):
CLI指向peer1.org1
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
加入通道:
peerchannel join -b mychannel.block
依次将所有peer节点加入通道
3)更新锚节点
对于Org1来说,peer0.org1是锚节点,我们需要连接上它并更新锚节点:
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer channel update -oorderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx--tls true --cafile $ORDERER_CA
对于Org2,peer0.org2是锚节点,对应的更新代码是:
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
peer channel update -oorderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx--tls true --cafile $ORDERER_CA
1) 安装链码
对需要共识的peer节点都要安装链码
以peer0.org1为例,先切换至该节点:
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
安装链码:
peer chaincode install -n mycc -v 1.0 -pgithub.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
2)实例化链码
对链上代码实例化,生成对应通道,对应链码的docker镜像和容器,并指定背书策略
peer chaincode instantiate -oorderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc-v 1.0 -c'{"Args":["init","a","100","b","200"]}'-P "OR ('Org1MSP.member','Org2MSP.member')"
此时,dockerps可以看到多了一个dev的容器,如果再开一个peer,则再多一个dev容器
3)交易
在peer0.org1上发起交易
查询a的余额,peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
返回结果
Query result: 100
转账:a向b转账10元
peer chaincode invoke -oorderer.example.com:7050 --tls true--cafile $ORDERER_CA -C mychannel -n mycc -c'{"Args":["invoke","a","b","10"]}'
在另一个节点查询:
首先CLI指向peer1.org2并安装链码,然后查询
peer chaincode query -C mychannel -n mycc -c'{"Args":["query","a"]}'
需要较长时间(几十秒)
root@namenode:/home/hadoop/gopath/src/github.com/hyperledger/fabric#make cryptogen
build/bin/cryptogen
CGO_CFLAGS=" "GOBIN=/home/hadoop/gopath/src/github.com/hyperledger/fabric/build/bin goinstall -tags "" -ldflags "-Xgithub.com/hyperledger/fabric/common/tools/cryptogen/metadata.Version=1.0.0"github.com/hyperledger/fabric/common/tools/cryptogen
#github.com/hyperledger/fabric/vendor/github.com/miekg/pkcs11
vendor/github.com/miekg/pkcs11/pkcs11.go:29:18:fatal error: ltdl.h: No such file or directory
compilation terminated.
Makefile:227: recipe for target'build/bin/cryptogen' failed
make: *** [build/bin/cryptogen] Error2
解决:下载安装libltdl-dev
apt-get install libtool libltdl-dev
参考:https://www.cnblogs.com/studyzy/p/7451276.html
https://www.jianshu.com/p/16903ed42f17