CentOS搭建Fabric-1.0

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

自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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.