目錄
1、Fabric原理剖析 2
1.1 Fabric架構 2
1.2 fabric模塊 3
1.3 Fabric交易流 3
安裝環境: 7
二.單機部署 7
2.1.安裝軟件 7
2.1.1.安裝基礎軟件 7
2.1.2.添加倉庫 8
2.1.3.配置加速器,修改爲docker官方的地址 8
2.1.4.安裝docker 8
2.1.5.設置開機自啓動、啓動、中止 8
2.1.6. 安裝docker-compose,並賦予執行權限 8
2.1.7.安裝go語言 8
2.1.8.安裝nodejs,更新yum源: 9
2.2.下載fabric源碼 9
2.2.1.下載鏡像 10
2.2.2.執行啓動命令 11
2.2.3.測試 23
三.多機部署: 24
3.1.主機間網絡配置 24
3.2.生成基礎配置 25
3.3.複製組織和認證信息 25
3.4.修改配置 26
3.4.1 orderer節點配置 26
3.4.2 peer0.org1節點配置 27
3.4.3 peer.1org1配置 29
3.4.4 peer0.org2配置 29
3.4.5 peer1.org2配置 31
3.5.啓動orderer排序節點 31
3.6.啓動peer節點 32
3.7.初始化 32
4.測試 32node
1、Fabric原理剖析
1.1 Fabric架構
Fabric核心組件,分紅三大部分:成員、區塊鏈和交易、鏈碼(智能合約)
成員服務:
主要是針對用戶的註冊、身份認證管理及審計功能。
區塊服務:
經過p2p協議管理分佈式帳本、點對點的網絡和分類存儲。
賬鏈代碼:
fabric用Docker容器來運行chaincode服務,啓動一個安全容器和安全註冊中心。並經過gRPC與啓動這個chaincode的Peer節點鏈接。
頁面封裝:
提供一個能夠交互的客戶端。
總體架構如圖:linux
fabric架構圖
1.2 fabric模塊c++
1.3 Fabric交易流git
典型交易流程圖github
Fabric交易的整個生命週期能夠分爲7個階段,分別是:
黃色框表示只能合約;藍色和紅色矩形框表示子連或者叫通道
第一階段:
客戶端發送交易請求給背書節點,只能合約根據配置的背書策略肯定有哪些背書節點進行簽名。策略不容許的將不進行背書,如E四、E5golang
第二階段:
背書節點使用MSP驗證請求的簽名是否屬於合法用戶,如是合法用戶將獲取請求的數據並與ChainCode的docker示例進行通信,模擬執行數據的讀寫操做,並將結果返回給背書節點,並反會給客戶端。docker
第三階段:
客戶端應用驗證背書節點簽名,而後繼續發送背書請求給其餘符合要求的背書節點,其交互過程同第二階段數據庫
第四階段:
客戶端驗證背書節點的處理結果和簽名,檢查是否知足背書策略。npm
第五階段:
客戶端將交易和響應信息封裝成一個事務消息,而後廣播到共識網絡;共識網絡根據接受到通道的交易信息按時間和通道處理交易,也就是生成一個區塊(生成區塊按照文件大小或者是時間來生成區塊,並無優先級)json
第六階段:
共識節點將打包的區塊廣播到同一個通道上面全部的peer。
第七階段:
Peers接收到發來的區塊後進行幾個驗證:
1.區塊中的交易確保知足背書策略
2.檢查區塊數據是否正確
3.驗證交易的數據是否與State Database的數據版本一致
驗證經過後打上合法與非法的標籤,並添加到對應的通道上,同時寫入狀態數據庫State Database,並告知客戶端交易是否合法。此時交易已經沒法更改。
安裝環境:
系統版本:CentOS 7.2
docker版本爲:19.03.2
docker-compose版本: 1.23.2
Go版本:1.10.1
二.單機部署
2.1.安裝軟件
2.1.1.安裝基礎軟件
安裝依賴軟件包
yum -y install ca-certificates curl wget git yum-utils lvm2 gcc gcc-c++
2.1.2.添加倉庫
使用docker官方的docker倉庫,版本會比較高:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
列出安裝的版本:
yum list docker-ce --showduplicates | sort -r #要安裝特定版本的Docker CE,請列出repo中的可用版本
2.1.3.配置加速器,修改爲docker官方的地址
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8ad7943c.m.daocloud.io
vi /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]}
2.1.4.安裝docker
yum -y install docker-ce
2.1.5.設置開機自啓動、啓動、中止
systemctl enable docker
systemctl start docker
systemctl stop docker
systemctl restart docker
2.1.6. 安裝docker-compose,並賦予執行權限
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2.1.7.安裝go語言
mkdir -p /home/data/go/{src,pkg,bin}
wget https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
設置環境變量:
vim ~/.bashrc
export GOROOT=/usr/local/go
export GOPATH=/home/data/code/go //go語言安裝路徑,按實際路徑配置
export GOBIN=$GOROOT/bin
export PATH=$GOPATH/bin:$GOBIN:$PATH
使變量生效
source ~/.bashrc
檢查go語言版本
go version go1.10.1 linux/amd64
2.1.8.安裝nodejs,更新yum源:
curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
yum -y install nodejs 驗證版本 #Node –v v8.16.1 #npm –v 6.4.1
2.2.下載fabric源碼
mkdir -p $GOPATH/src/github.com/hyperledger/
cd $GOPATH/src/github.com/hyperledger/
git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout release-1.1
2.2.1.下載鏡像
進入目錄/fabric/scripts,執行bootstrap.sh,下載docker鏡像,下載完成後如:
解析bootstrap.sh執行過程:
腳本內容:分別調用了dockerFabricPull 、dockerCaPull 、dockerThirdPartyImagesPull 三個函數去拉取相應的docker鏡像並打標籤,最後還經過docker images | grep hyperledger*檢查下載的鏡像。
下載軟件包:經過腳本自動下載,也可使用瀏覽器單獨下載,但需注意版本要與當前系統一致。
1).curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz | tar xz
2).curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/linux-amd64-1.1.0/hyperledger-fabric-ca-linux-amd64-1.1.0.tar.gz | t ar xz
2.2.2.執行啓動命令
鏡像下載完後,將該目錄下生成的bin目錄拷貝到../examples目錄下再進入到../examples/e2e_cli目錄運行e2e_cli實例,執行命令./network_setup.sh up
1).Bin目錄下可執行命令的做用:
2).cd /home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli
執行過程當中有報錯:Error: Error endorsing chaincode: rpc error: code = Unknown desc = error starting container: API error (404): {"message":"network e2ecli_default not found"}
問題緣由:
e2e_cli目錄是固定的,啓動後會建立一個docker network以此爲名字,這裏是e2e_cli。若是修改該目錄,要修改/home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/base目錄下的peer-base.yaml
vi /home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/base/peer-base.yaml
修改完成後在啓動:
中間圖省略
完成之後啓動的容器:
Fabric執行過程分析,即執行network_setup.sh腳本:
從這個腳本文件能夠看出,主要步驟爲:
1.執行generateArtifacts.sh
generateCerts:使用cryptogen工具生成祕鑰和證書
replacePrivateKey:
根據/home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/ca/*_sk修改docker-compose-e2e.yaml文件
generateChannelArtifacts:生成排序創世區塊、通道配置文件、生成 組織錨節點配置
docker-compose-e2e.yaml文件,經過service定義了一條規則
如需中止進程,執行
./network_setup.sh down
2.2.3.測試
查詢a帳戶的餘額
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
把a帳戶的餘額再轉20元給b帳戶
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 -c '{"Args":["invoke","a","b","20"]}'
再次查詢
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
三.多機部署:
分佈結構:
192.168.59.136 orderer.example.com + cli
192.168.59.137 peer0.org1.example.com +cli
192.168.59.138 peer0.org2.example.com +cli
192.168.59.139 peer1.org1.example.com +cli
192.168.59.140 peer1.org2.example.com +cli
3.1.主機間網絡配置
基礎網絡準備設置主機之間的網絡,推薦使用dns服務,hosts文件也可,各臺機器內容一致。
3.2.生成基礎配置
推薦在一臺主機上下載好fabric之後複製到其餘機器上,以保證版本一致。所謂的拆分就是將不一樣的orderer和peer節點分別部署到其餘的物理機器上面,實際上就是修改docker-compose-cli.yaml和其相關聯的文件,首先生成組織,創世區塊和認證信息:sh generateArtifacts.sh mychannel
3.3.複製組織和認證信息
執行完之後會生成crypto-config和channel-artifacts目錄內容以下:將這倆個目錄分別複製到其餘機器
3.4.修改配置
3.4.1 orderer節點配置
生成orderer節點配置文件,複製docker-compose-cli.yaml.bak 更名成docker-compose-orderer.yaml
Orderer部分:
Cli部分:註釋掉command部分,後面的初始化用手動方式執行
base/docker-compose-base.yaml修改部分,而且全部的peer節點的端口都改爲對應的端口,應爲peer分佈在不一樣的機器
base/peer-base.yaml文件修改
3.4.2 peer0.org1節點配置
peer0.org1.example.com節點,複製docker-compose-cli.yaml.bak 更名成docker-compose-cli.yaml
Cli部分
base/docker-compose-base.yaml
base/peer-base.yaml
3.4.3 peer.1org1配置
peer1.org1.example.com節點的修改同樣,修改的配置文件也同樣。只不過須要注意修更名稱和圖中框裏面的內容
3.4.4 peer0.org2配置
peer0.org2.example.com節點複製docker-compose-cli.yaml.bak 更名成docker-compose-cli.yaml修改docker-compose-cli.yaml
Cli部分
base/docker-compose-base.yaml
base/peer-base.yaml
3.4.5 peer1.org2配置
peer1.org2.example.com配置修改,值得注意的地方就是
3.5.啓動orderer排序節點
docker-compose -f docker-compose-orderer.yaml up –d
3.6.啓動peer節點
啓動其餘機器上面的peer,未執行初始化以前只有框裏面的容器啓動,每一個peer節點應該能看到peer和cli容器。
docker-compose -f docker-compose-cli.yaml up –d
3.7.初始化
登陸orderer節點的cli容器中,執行初始化執行script.sh腳本,其中定義了建立通道、節點加入通道、下載安裝chaincode
初始化chaincode、更新錨點、查詢等操做。
docker exec -it cli /bin/bash
./scripts/script.sh mychannel
執行過程與單節點過程同樣
4.測試
列出通道peer channel list
獲取通道信息peer channel getinfo -c mychannel
鏈碼:peer chaincode list --installed
查詢原帳戶金額
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
轉帳5元
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 -c '{"Args":["invoke","a","b","5"]}'
再次查詢peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'