這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
自2017年4月份fabric-1.0 alpha發布至今,fabric-1.0經曆了alpha、alpha2、beta、rc1、1.0等版本。與fabric-0.6相比,fabric-1.0在架構和角色上發生很大變化,其節點類型分成peer、orderer、ca、client,因此,搭建fabric-1.0網路對於剛接觸fabric的愛好者顯得比較複雜。在對fabric-1.0各個版本進行搭建實驗的基礎上,總結了fabric-1.0.0的各種搭建方式。
一、準備
1.1 安裝git
sudo yum install git
1.2 安裝和配置Golang (>=1.7)
1.2.1 卸載低版本的golang
sudo yum remove golangsudo yum autoremove
1.2.2 下載並解壓go二進位包
下載連結:https://golang.org/dl/
下載:https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz
由於GFW,因此備份了一份在百度雲上:連結: http://pan.baidu.com/s/1c2lJrG0 密碼: 7pye
解壓:
sudo tar -xvf go1.8.1.linux-amd64.tar.gz -C /usr/local/
1.2.3 設定環境變數
在/etc/profile檔案末尾(所有使用者有效)添加:
export GOROOT=/usr/local/goexport GOBIN=$GOROOT/binexport PATH=$PATH:$GOBINexport GOPATH=/home/hyperledger/gopath
環境變數生效:
source /etc/profile
1.2.4 測試
執行
go version
1.3 安裝和配置docker (>=1.12)
參考:https://docs.docker.com/engine/installation/linux/docker-ce/centos/
1.3.1 卸載低版本的docker
sudo yum remove docker \ docker-common \ container-selinux \ docker-selinux \ docker-engine
1.3.2 安裝docker-ce(from repository)
安裝yum-utils和wget
sudo yum install -y yum-utilssudo yum install -y wget
配置系統鏡像(如果沒有配置)
cd /etc/yum.repos.dsudo wget http://mirrors.163.com/.help/CentOS7-Base-163.reposudo yum clean allsudo yum makecachesudo yum update -y
添加stable repository
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
安裝docker-ce
sudo yum makecache fastsudo yum install docker-ce
啟動docker
sudo systemctl start docker
1.3.3 配置免sudo使用docker
添加docker使用者組(如果不存在)
sudo groupadd docker
將使用者添加到docker使用者組中
sudo gpasswd -a ubuntu docker
重啟docker服務
sudo service docker restart
重啟group或者重啟x會話
newgrp - docker或pkill X
1.3.4 配置快速docker鏡像
sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f8c3f422.m.daocloud.io
重啟docker服務
sudo systemctl restart docker
1.3.5 測試docker
輸入docker version查看版本
docker-version
1.4 安裝和配置Docker Compose (>=1.8.1)
參考:https://docs.docker.com/compose/install/
1.4.1 擷取
sudo curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
或從檔案中擷取(連結:http://pan.baidu.com/s/1dFu4Jgl 密碼:329z)
添加執行許可權
sudo chmod +x /usr/local/bin/docker-compose
1.4.2 測試
執行docker-compose version,得到結果
docker-compose-version
1.5 安裝pip及其他包
安裝gcc
sudo yum install -y gcc gcc-c++ kernel-develsudo yum install -y python-devel libxslt-devel libffi-devel openssl-devel
下載get-pip.py
wget https://bootstrap.pypa.io/get-pip.py
安裝pip
sudo python get-pip.py
安裝其他包
sudo pip install --upgrade pipsudo pip install behave nose docker-composesudo pip install -I flask python-dateutil pytz pyyaml couchdb flask-cors request pyOpenSSL pysha3 grpciosudo pip install urllib3 ndg-httpsclient pyasn1 ecdsa python-slugify grpcio-tools jinja2 b3j0f.aop six
二、編譯fabric源碼
2.1 擷取fabric源碼
複製源碼
cd $GOPATH/srcmkdir -p github.com/hyperledgercd github.com/hyperledgergit clone https://github.com/hyperledger/fabric.git
2.2 構建configtxgen
cd $GOPATH/src/github.com/hyperledger/fabricmake configtxgen# if you see an error stating - 'ltdl.h' file not foundsudo apt install libtool libltdl-dev# then run the make againmake configtxgen
若執行成功,則出現:
make-configtxgen
2.3 配置gotools
因為再編譯過程中下載gotools需要翻牆,所以如果沒有配置VPN則可能下載失敗,因此需要事先將gotools下載好
將gotools.tar拷貝到任意目錄
建立/opt/gotools目錄並解壓到此目錄
sudo mkdir –p /opt/gotoolstar –xvf gotools.tar –C /opt/gotools
2.4 拉取fabric-baseimage鏡像
docker pull hyperledger/fabric-baseimage:x86_64-0.3.0
2.5 修改Makefile
修改fabric目錄下的Makefile檔案
添加
makefile-01
makefile-02
makefile-03
如果不用Java chaincode或java工具無法下載,可以修改
makefile-04
2.6 編譯fabric
2.6.1 編譯orderer和peer
在orderer節點編譯orderer
make orderer
在peer節點編譯peer
make peer
編譯完成,則可以啟動相應服務
2.6.2 編譯鏡像
編譯orderer鏡像
make orderer-docker
編譯peer鏡像
make peer-docker
2.6.3 其他
make all //編譯所有組件make checks //運行所有的測試和檢查make cryptogen //建立一個本地的加密產生工具make clean //清除所有編譯項make dist-clean //清除所有編譯項及移除本地持久化狀態
三、下載fabric的docker鏡像
3.1 直接下載docker鏡像
直接從docker鏡像庫拉取鏡像
docker pull hyperledger/fabric-peer:x86_64-1.0.0docker pull hyperledger/fabric-orderer:x86_64-1.0.0docker pull hyperledger/fabric-ccenv:x86_64-1.0.0docker pull hyperledger/fabric-ca:x86_64-1.0.0docker pull hyperledger/fabric-baseos:x86_64-0.3.0docker pull hyperledger/fabric-tools:x86_64-1.0.0docker tag docker.io/hyperledger/fabric-ca:x86_64-1.0.0 hyperledger/fabric-ca:latestdocker tag docker.io/hyperledger/fabric-peer:x86_64-1.0.0 hyperledger/fabric-peer:latestdocker tag docker.io/hyperledger/fabric-orderer:x86_64-1.0.0 hyperledger/fabric-orderer:latestdocker tag docker.io/hyperledger/fabric-ccenv:x86_64-1.0.0 hyperledger/fabric-ccenv:latestdocker tag docker.io/hyperledger/fabric-tools:x86_64-1.0.0 hyperledger/fabric-tools:latest
3.2 利用e2e_cli中的指令碼擷取鏡像
cd $GOPATH/src/github.com/hyperledger/fabriccd examples/e2e_clichmod +x download-dockerimages.sh./download-dockerimages.sh
這個過程可能會比較慢,解決方案:從已經下載好的docker鏡像匯入
3.3 匯入和匯出鏡像
假設某台機器的鏡像已經下載完成
匯出鏡像
docker save 7182c260a5ca > ./fabric-ccenv-x86_64-1.0.0.tar
拷貝到另一台機器,匯入鏡像
docker load < /home/hyperledger/Images/fabric-ccenv-x86_64-1.0.0.tar
再次執行./download-dockerimages.sh則不會從Docker Hub上下載鏡像,很快則執行完成
四、執行fabric例子
4.1 啟動網路
下載fabric-sample
cd $GOPATH/src/github.com/hyperledgergit clone https://github.com/hyperledger/fabric-samples
下載Platform-specific Binaries
cd fabric-samplescurl -sSL https://goo.gl/iX9dek | bash
啟動
cd fabric-samples/first-network./byfn.sh -m generate./byfn.sh -m up
4.2 清理
清理container
docker rm -f $(sudo docker ps -aq)
或
docker-compose -f docker-compose-cli.yaml down
清理image
docker rmi <IMAGE ID> <IMAGE ID> <IMAGE ID>
如:
docker rmi 362 c76 c10
五、CA伺服器配置
5.1 擷取並編譯fabric-CA
5.1.1 安裝libtool和libtdhl-dev
sudo yum install libtool-ltdl-devel
5.1.2 下載fabric-ca
cd $GOPATH/src/github.com/hyperledger/git clone https://github.com/hyperledger/fabric-ca
5.1.3 安裝fabric-ca
sudo go get -u github.com/hyperledger/fabric-ca/cmd/...
5.1.4 啟動fabric-ca-server
fabric-ca-server start -b admin:adminpw
5.2 註冊測試
enroll根使用者
export FABRIC_CA_CLIENT_HOME=/home/hyperledger/gopath/src/github.com/hyperledger/fabric-ca/client/adminfabric-ca-client enroll -u http://admin:adminpw@localhost:7054
Register peer0
fabric-ca-client register --id.name peer0 --id.type peer --id.affiliation org1 --id.secret peer0pw
Enroll peer0
export FABRIC_CA_CLIENT_HOME=/home/hyperledger/gopath/src/github.com/hyperledger/fabric-ca/client/peer0fabric-ca-client enroll -u http://peer0:peer0pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/localMspConfig
Register orderer0
export FABRIC_CA_CLIENT_HOME=/home/hyperledger/gopath/src/github.com/hyperledger/fabric-ca/client/adminfabric-ca-client register --id.name orderer0 --id.type client --id.affiliation org2 --id.secret orderer0pw
Enroll orderer0
export FABRIC_CA_CLIENT_HOME=/home/hyperledger/gopath/src/github.com/hyperledger/fabric-ca/client/orderer0fabric-ca-client enroll -u http://orderer0:orderer0pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/localMspConfig
則產生了peer0的認證和orderer0的認證,將localMspConfig中的signcerts複製一份命名為admincerts,將認證打包傳到相應節點即可
5.3 擷取fabric-ca鏡像
5.3.1 編譯fabric-ca鏡像
cd $GOPATH/github.com/hyperledger/fabric-camake docker
5.3.2 從docker hub擷取ca鏡像
參照3.1節
5.4 通過鏡像啟動fabric-ca伺服器
配置docker-compose.yaml
version: '2'services: root-ca-server: container_name: root-ca-server image: hyperledger/fabric-ca command: /usr/local/bin/fabric-ca-server start -b admin:adminpw volumes: - ./fabric-ca-server:/etc/hyperledger/fabric-ca-server ports: - 7054:7054
啟動
docker-compose up -d
六、產生認證
編輯generateCert.sh,修改鏡像、組織名、連接埠
generateCert
執行./generateCert.sh產生crypto-config目錄
七、配置configtx.yaml
編輯configtx.yaml
配置orderer和peer的組織名,與憑證註冊時的組織名一致
confitx-profile
配置Orderer組織的名字,MSP的ID,MSP的目錄
configtx-orderers
配置org1的名字,MSP的名字,MSP的目錄,以及Anchor的ip和連接埠(用於組織間的通訊)
configtx-anchor-peers
配置orderer的模式(可以先從solo模式開始),ip和連接埠
configtx-orderer
如果配置了kafka模式和kafka叢集,則需將kafka叢集配置上
configtx-kafka
八、產生創世區塊
更新generateArtifacts.sh中-asOrg參數
執行generateArtifacts.sh產生創世塊,指令碼產生的資訊儲存於channel-artifacts
九、啟動fabric叢集
9.1 在本地環境啟動fabric叢集
9.1.1 啟動orderer
啟動orderer (見run_orderer.sh)
$ ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 \ ORDERER_GENERAL_GENESISMETHOD=file \ ORDERER_GENERAL_GENESISFILE=./orderer0/genesis.block \ ORDERER_GENERAL_LOCALMSPID=OrdererMSP \ ORDERER_GENERAL_LOCALMSPDIR=localMspConfig \ ../build/bin/orderer
9.1.2 啟動peer
啟動peer(見run_peer0.sh)
$ CORE_PEER_TLS_ENABLED=false \ CORE_NEXT=true CORE_PEER_ENDORSER_ENABLED=true \ CORE_PEER_GOSSIP_USELEADERELECTION=true \ CORE_PEER_GOSSIP_ORGLEADER=false \ CORE_PEER_GOSSIP_SKIPHANDSHAKE=true \ CORE_PEER_ID=peer0 \ CORE_PEER_ADDRESS=<peer_ip>:7051 \ CORE_PEER_GOSSIP_EXTERNALENDPOINT=<peer_ip>:7051\CORE_PEER_MSPCONFIGPATH=$GOPATH/src/github.com/hyperledger/fabric/peer/localMspConfig \CORE_PEER_LOCALMSPID=org1 \../build/bin/peer node start --peer-defaultchain=false
按照上面方式啟動各個orderer和peer則fabric叢集啟動完成
9.2 利用docker鏡像啟動fabric叢集
9.2.1 啟動orderer
啟動orderer(見start_orderer0.sh)
$ docker run --name=orderer0 \ --restart=unless-stopped \ -p 7050:7050 \ -w /opt/gopath/src/github.com/hyperledger/fabric \ -v /home/hyperledger/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto/orderer:/var/hyperledger/orderer \ -e ORDERER_GENERAL_LOGLEVEL=debug \ -e ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 \ -e ORDERER_GENERAL_GENESISMETHOD=file \ -e ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.block \ -e ORDERER_GENERAL_LOCALMSPID=OrdererMSP \ -e ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/localMspConfig \ -e ORDERER_GENERAL_TLS_ENABLED=false \ -e ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/localMspConfig/keystore/ordererSigner.pem \ -e ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/localMspConfig/signcerts/orderer0Signer.pem \ -e ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/localMspConfig/cacerts/ordererOrg0.pem] \ hyperledger/fabric-orderer:latest orderer
9.2.2 啟動peer
將configtx.yaml拷貝到fabric/common/configtx/tool/目錄下(注意備份一起的檔案)
產生名為upchannel02的通道檔案,用於建立通道
./build/bin/configtxgen -outputCreateChannelTx upchannel02.tx -channelID upchannel02 -profile TwoOrgs
啟動peer (見start_peer0.sh)
$ docker run --name=peer0 \ --restart=unless-stopped \ -p 7051:7051 \ -w /opt/gopath/src/github.com/hyperledger/fabric/peer \ -v /var/run/:/host/var/run/ \ -v /home/hyperledger/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/examples/:/opt/gopath/src/github.com/hyperledger/fabric/examples/ \ -v /home/hyperledger/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go \ -v /home/hyperledger/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto/peer/peer0/localMspConfig:/etc/hyperledger/fabric/msp/sampleconfig \ -v /home/hyperledger/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ \ -e CORE_PEER_ID=peer0 \ -e CORE_PEER_ADDRESS=101.231.114.238:7051 \ -e CORE_PEER_GOSSOP_ENDPOINT=peer0 \ -e CORE_PEER_GOSSIP_EXTERNALENDPOINT=101.231.114.238:7051 \ -e CORE_PEER_LOCALMSPID=org1 \-e CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock \-e CORE_LOGGING_LEVEL=DEBUG \ -e CORE_PEER_TLS_ENABLED=false \ -e CORE_NEXT=true \ -e CORE_PEER_ENDORSER_ENABLED=true \ -e CORE_PEER_GOSSIP_USELEADERELECTION=true \ -e CORE_PEER_GOSSIP_ORGLEADER=false \ -e CORE_PEER_GOSSIP_SKIPHANDSHAKE=true \ -e CORE_PEER_PROFILE_ENABLED=true \ -e GOPATH=/opt/gopath \ -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peer/peer0/localMspConfig \ hyperledger/fabric-peer:latest peer node start --peer-defaultchain=false
peer啟動後,再另一個視窗輸入
$ docker exec –it peer0 bash
則進入docker的bash,則可以輸入相關命令
9.2.3 利用docker-compose啟動fabric叢集
編輯docker-compose.yaml檔案,在不同角色的節點啟動不同的服務
啟動fabric叢集
$ docker-compose up -d
十、相關命令
見scripts.sh
# 建立channel$ peer channel create -o 172.18.163.117:7050 -c mychannel -f channel-artifacts/channel.tx# 擷取通道檔案$ peer channel fetch oldest -o 172.18.163.117:7050 -c mychannel# 更新群組織$ peer channel update -o 172.18.163.117:7050 -c mychannel -f channel-artifacts/Org1MSPanchors.tx# 加入channel$ peer channel join -b mychannel_oldest.block# 安裝chaincode$ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02# 執行個體化chaincode$ peer chaincode instantiate -o <orderer_ip>:7050 -C upchannel02 -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('org1.member','org2.member')"#調用chaincode$peer chaincode invoke -o <orderer_ip>:7050 -C upchannel02 -n mycc -c '{"Args":["invoke","a","b","10"]}'#查詢chaincode$ peer chaincode query -C upchannel02 -n mycc -c '{"Args":["query","a"]}'
十一、配置過程中的問題
11.1 版本與啟動方式問題
各個orderer和peer啟動的fabric的版本和啟動方式需要一致
否則會出現一些錯誤
Identity store rejected *:37166 : Identity doesn’t match the computed pkiID
11.2 連接埠問題
在啟動peer時需要保證7051和7053連接埠未被佔用,否則peer啟動後會自動結束
11.3 防火牆問題
如果在執行通道或chaincode命令是遇見grpc錯誤,一般是連接埠未開啟或防火牆問題,將此連接埠加入防火牆允許清單即可
$ sudo firewall-cmd --zone=public --add-port=7050/tcp --permanent$ sudo firewall-cmd --reload
或使用iptables相關命令
11.4 Chaincode不匹配
在安裝chaincode遇見fingerprint dismatch的錯誤。
解決方案:
可以採用在一個peer的bash上遠程安裝到其他peer上來避免這個問題
或者
現將chaincode源碼進行打包,經打包後的程式碼封裝發送給其他peer,進行安裝
打包cc
$ peer chaincode package -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 ccpack.out
安裝cc
$ peer chaincode install ccpack.out
11.5 在通道中找不到chaincode
問題描述
Error: Error endorsing invoke: rpc error: code = 2 desc = failed to obtain cds for anchor01 - could not find chaincode with name 'anchor01'
這是因為deploy交易為提交,等待一段時間再次執行即可
如果其他peer執行成功,本peer依舊出現此問題,則重啟peer即可(此時不要刪資料)
11.6 重啟peer
如果重新加入某個channel則需要重啟peer,這時候就要刪除Data目錄,即在fileSystemPath配置的目錄
11.7 交易速度慢
在測試過程中遇見了提交了交易,狀態很久不能更新,重啟了peer才查詢到更新,這是因為peer在一段時間內沒有交易,某個orderer會斷開與peer的串連,因此peer收不到orderer的廣播請求。
解決方案:在configtx.yaml配置orderer的地址為各個組織orderer的內網ip,或者修改對外防火牆配置,使串連保持
聯絡我們
如有疑問,請聯絡:
dazh_xu@163.com