一、概述
1.1 介紹
Hyperledger Fabric是Linux基金會所主導的Hyperledger(超級賬本)的項目之一。Hyperledger Fabric旨在作爲開發模塊化體系結構的區塊鏈應用程序的基礎,以便諸如共識和會員服務等組件可以即插即用。它使用容器技術來託管構成系統應用邏輯的智能合約(也稱爲鏈代碼)。 簡而言之,Hyperledger Fabric是爲企業構建的領先的開源、通用區塊鏈結構。
1.2 邏輯架構
- 成員管理:會員註冊、身份保護、交易審計、內部保密等;
- 賬本管理:存儲交易記錄、交易數據的管理等;
- 交易管理:部署交易、調用交易等;
- 智能合約:實現了業務邏輯的代碼;
1.3 基本概念
1.3.1 組織
Fabric系統是通過組織來劃分的。fabric中的組織在現實世界中可以是一個公司、一個企業,或者一個協會。在fabric中,組織是承擔着數據信用責任的區塊鏈系統參與方。
每一個Fabric組織都有自己的用戶,以及進行數據處理的節點。
1.3.2 節點
按照功能劃分,可以把節點劃分爲:client、peer、orderer節點。
- client:客戶端節點,可以進行交易的管理;
- peer:工作節點,用於存儲和同步賬本數據的節點;
- orderer:排序節點,用於排序和分發交易;
1.3.3 通道
通道(channel)是共識服務提供的一種通訊機制,將peer和orderer節點連接在一起,形成一個個具有保密性的通訊鏈路,實現了業務的隔離。在同一個通道中的所有peer節點都保存一份相同的數據。通道由成員(組織)、每個成員的錨節點、賬本、鏈碼應用程序和排序服務節點定義。網絡上的每個交易都是在一個通道上執行的,在該通道上,每一方都必須經過身份驗證和授權才能在該通道上進行交易。一個peer節點可以同時加入到不同的通道中。每加入到一個新的通道,儲數據的區塊鏈就需要添加一條。只要加入到通道中就可以擁有這個通道中的數據。
1.3.4 交易流程
要完成交易,首先要必須要有背書策略(EndorseTx)。上圖中的Application/SDK充當了客戶端的角色。當客戶端發起一個提案給peer節點時,peer節點將交易進行預演,並得到一個結果。peer節點講結果發送給客戶端後,如果成功,則客戶端將交易提交給排序節點。排序節點對交易進行打包後,將打包數據發送給peer節點,peer節點再將數據寫入區塊中。
要完成一筆交易, 這筆交易的完成過程稱之爲“背書”。
1.3.5 賬本
區塊鏈賬本包含兩部分:世界狀態和區塊鏈。首先是世界狀態通常使用數據庫(默認爲Level DB)保存一組賬本的當前狀態值,這樣就不用遍歷所有的交易日誌去計算當前的狀態值,通常使用key-value鍵值對錶示,狀態值可被創建,更新和刪除。而區塊鏈記錄所有的交易日誌記錄。交易的信息會收集起來追加到區塊鏈,一旦寫入,就不能修改了。
二、Fabric環境搭建
環境安裝在ubutun系統上進行。
2.1 安裝docker
1)安裝基本軟件:
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl git software-properties-common lrzsz -y
2)添加阿里的docker鏡像倉庫:
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
3)安裝docker:
# 安裝docker
sudo apt-get install docker-ce -y
# 查看docker版本信息
docker version
4)將用戶添加到docker羣組:
# 將用戶加入到該羣組中,然後退出並重新登錄生效
sudo gpasswd -a ${USER} docker
# 重啓docker服務
systemctl restart docker
# 將當前用戶切換到docker羣組
newgrp - docker
5)安裝docker-compose:
# 安裝依賴工具
$ sudo apt-get install python-pip -y
# 安裝編排工具
$ sudo pip install docker-compose
# 查看版本
$ sudo docker-compose version
2.2 安裝go
# 1. 使用wget工具下載安裝包
$ wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
# 2. 解壓tar包到/usr/local
$ sudo tar zxvf go1.11.linux-amd64.tar.gz -C /usr/local
# 3. 創建Go目錄
$ mkdir $HOME/go
# 4. 用vi打開~./bashrc,配置環境變量
$ vim ~/.bashrc
# 5. 增加下面的環境變量,保存退出
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# 6. 使環境變量立即生效, 一些命令二選一
$ source ~/.bashrc
$ . ~/.bashrc
# 7. 檢測go是否安裝好
$ go version
2.3 安裝nodejs
1)下載二進制源碼包:
$ wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz
2)解壓並安裝:
sudo tar xvf node-v8.11.4-linux-x64.tar.xz -C /opt
3)將node.js設置爲全局可用:
# 編輯配置文件
$ sudo vim /etc/profile
# 添加如下配置項, 保存退出
export NODEJS_HOME=/opt/node-v8.11.4-linux-x64
export PATH=$PATH:$NODEJS_HOME/bin
# 重新加載配置文件
. /etc/profile
4)測試:
node -v
2.4 安裝hyperledger fabric
1)下載軟件:
# 創建fabric工作目錄
mkdir ~/hyperledger-fabric
# 下載並執行腳本
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.2.0 1.2.0 0.4.10
下載完成後,將以下兩個壓縮包拷貝到 ~/hyperledger-fabric目錄下,並解壓縮。解壓後的目錄結構如下圖所示:
2)設置全局訪問:
# 進入到 ~/hyperledger-fabric/fabric-samples/bin 目錄
cd ~/hyperledger-fabric/fabric-samples/bin
# 將這些二進制文件拷貝到 /usr/local/bin 目錄下
sudo cp * /usr/local/bin
3)frist-network網絡測試:
cd ~/hyperledger-fabric/fabric-samples/first-network/
./byfn.sh generate
4)啓動網絡:
/byfn.sh up
啓動成功後,通過docker ps命令查看節點的啓動情況,如下圖所示:
如果要停止網絡,可以執行./byfn.sh down命令。
三、Fabric核心模塊
3.1 cryptogen
cryptogen模塊主要用來生成組織結構和賬號相關的文件。Fabric系統開發通常都是從cryptogen模塊開始的。在Fabric項目中,當系統設計完成之後的第一項工作就是根據系統的設計來編寫cryptogen的配置文件,然後通過這些配置文件生成相關的證書文件。
下面介紹cryptogen模塊命令行選項及其使用方式。
- cryptogen模塊命令
cryptogen模塊是通過命令行的方式運行的,一個cryptogen命令由命令行參數和配置文件兩部分組成,通過執行命令cryptogen --help
可以顯示cryptogen模塊的命令行選項,執行結果如下所示:
help:顯示幫助信息;
generate:根據配置文件生成證書信息;
showtemplate:顯示系統默認的cryptogen模塊配置文件信息;
version:顯示當前模塊版本號;
extend:擴展現有網絡;
- cryptogen模塊的配置文件
cryptogen模塊的配置文件用來描述需要生成的證書文件的特性,比如:有多少個組織有多少個節點,需要多少個賬號等,例如下面官方提供的示例文件crypto-config.yaml:
OrdererOrgs: # 排序節點的組織定義
- Name: Orderer # orderer節點的名稱
Domain: example.com # orderer節點的根域名
Specs:
- Hostname: orderer # orderer節點的主機名
PeerOrgs: # peer節點的組織定義
- Name: Org1 # 組織1的名稱 1 1
Domain: org1.example.com # 組織1的根域名
EnableNodeOUs: true # 是否支持node.js
Template:
Count: 2 # 組織1中的節點(peer)數目
Users:
Count: 1 # 組織1中的用戶數目
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
上述模板文件定義了一個orderer節點,這個orderer節點的名字爲orderer,orderer節點的根域名爲example.com,主機名爲orderer。模板文件同時定義了兩個組織,兩個組織的名字分別爲Org1 和 Org2,其中組織 Org1 包含了2個節點和1個用戶,組織 Org2 包含2個點和1個用戶。
除了Fabric源碼中提供的例子以外,我們還可以通過命令
cryptogen showtemplate
獲取默認的模板文件。
3.2 configtxgen
configtxgen 模塊的功能主要包含兩方面:1)生成 orderer 節點的初始化文件;2)生成 channel 的初始化文件。
- configtxgen 模塊命令:
configtxgen 模塊是通過命令行的方式運行的,通過執行命令configtxgen --help
可以顯示 configtxgen 模塊的命令行選項,執行結果如下所示:
-asOrg:指定所屬的組織;
-channelID:指定創建的channel的名字, 默認的名字爲mychannel;
-configPath:執行命令要加載的配置文件的路徑, 不指定會在當前目錄下查找;
-inspectBlock:打印指定區塊文件中的配置內容,string:查看的區塊文件的名字;
-inspectChannelCreateTx:打印創建通道的交易的配置文件;
-outputAnchorPeersUpdate:更新channel的配置信息;
-outputBlock:輸出區塊文件的路徑;
-outputCreateChannelTx:標示輸出創始區塊文件;
-printOrg:將組織的定義打印爲JSON;
-profile:指定配置文件中的節點;
-version:顯示版本信息;
- configtxgen模塊配置文件
configtxgen 模塊的配置文件包含Fabric系統初始塊、Channel初始塊文件等信息。
3.3 orderer模塊
orderer 模塊負責對交易進行排序, 並將排序好的交易打包成區塊。orderer節點的配置信息通常放在環境變量或者配置文件中,在具體操作中,如果是通過docker鏡像文件的方式啓動orderer,推薦使用環境變量的方式,如果是採用命令的方式直接啓動,推薦將所有的信息放到配置文件中。
3.4 peer模塊
peer模塊是Fabric中最重要的模塊,也是在Fabric系統使用最多的模塊。peer模塊在Fabric中被稱爲主節點模塊,主要負責存儲區塊鏈數據、運行維護鏈碼、提供對外服務接口等作用。
3.4.1 命令行和常用參數
chaincode:與chaincode相關的命令,例如安裝鏈碼、實例化鏈碼等;
channel:通道操作,如創建通道、加入通道等;
help:查看幫助信息;
logging:日誌級別;
node:節點操作,如啓動節點、查看節點狀態等;
version:當前peer節點的版本信息;
3.4.2 peer channel子命令
peer channel的子命令可以通過 peer channel --help
進行查看。
-
參數:
–cafile:當前orderer節點pem格式的tls證書文件,注意要使用絕對路徑;.
-o:orderer節點的地址;
–tls:通信時是否使用tls加密; -
子命令:
1)create:創建通道;
# 創建通道
peer channel create -o ubuntu.test.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
-c:要創建的通道的ID, 必須小寫, 在250個字符以內;
-f: 由configtxgen 生成的通道文件, 用於提交給orderer;
-t: 創建通道的超時時長;
2)join:將peer加入到通道中;
peer channel join -b mychannel.block
-b:genesis創始塊文件;
3)list:列出peer加入的通道;
peer channel list
4)update:更新;
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
-c:要創建的通道的ID, 必須小寫, 在250個字符以內;
-f:由configtxgen 生成的組織錨節點文件, 用於提交給orderer;
3.4.3 peer chaincode 子命令
peer chaincode子命令一共有4個公共參數選項, 這些選項所有的子命令都可以使用, 他們分別是:
--cafile
: PEM格式證書的位置-o, --orderer
: orderer服務器的訪問地址--tls
: 使用orderer的TLS證書位置--transient
: JSON參數的編碼映射
chaincode命令的運行需要一些參數,這些參數可以是配置文件也可以是環境變量,由於涉及的參數並不是很多,因此大多數時候都會採用環境變量的方式來設置參數。
1)install:負責安裝chaincode;
peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/
-c: JSON格式的構造參數, 默認是`"{}"
-l:使用的編程語言,默認爲golang;
-n:chaincode的名字;
-p:存儲chaincode文件的路徑,注意從github.com路徑開始;
-v:當前操作的chaincode的版本;
2)instantiate:對已經執行過instanll命令的Chaincode進行實例化。instantiate命令執行完成之後會啓動Chaincode運行的Docker鏡像,同時instantiate命令還會對Chaincode進行初始化;
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.member', 'Org2MSP.member')"
-C:當前命令運行的通道;
-c:JSON格式的構造參數,默認值是`“{}";
-E: 應用於當前Chaincode的系統背書Chaincode的名字;
-l:編寫chaincode的編程語言,默認爲golang;
-n:chaincode的名字;
-P:當前Chaincode的背書策略;
-v:當前操作的Chaincode的版本;
-V:當前Chaincode調用的驗證系統Chaincode的名字;
3)invoke:調用chaincode;
$ peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
-C:當前命令運行的通道;
-c:JSON格式的構造參數,默認值是`“{}";
-n:chaincode的名字;
4)list:查詢已經安裝的Chaincode;
peer chaincode list --installed
-C:當前命令運行的通道;
–installed:獲取當前Peer節點已經被安裝的chaincode;
–instantiated:獲取當前channel中已經被實例化的chaincode;
5)package:將Chaincode打包;
peer chaincode package —P github.com/hyperledger/fabric/examples/chaincode/go/example —n mycc —v 1.0 -s —S -i "OR ('Org1MSP.member','Org2MSP.member')" mycc.1.0.out
-s:對打包後的Chaincode進行簽名;
-c:JSON格式的構造參數,默認值是`“{}";
-i:Chaincode的權限;
-l:編寫chaincode的編程語言,默認爲golang;
-n:Chaincode的名字;
-p:Chaincode源代碼的路徑;
-S:對打包的文件用本地的MSP進行簽名;
-v:當前操作的Chaincode的版本;
6)query:執行chaincode代碼中的query方法;
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
-C:當前命令運行的通道;
-c:JSON格式的構造參數,默認值是`“{}";
-x:是否對輸出的內容進行編碼處理;
-n:Chaincode的名字;
-r:是否輸出二進制內容;
-t:指定當前查詢的編號;
7)signpackage:對打包好的chaincode進行簽名;
peer chaincode signpackage mycc.1.0.out sign_mycc.1.0.out
8)upgrade:更新已經存在的chaincode;
peer chaincode upgrade -o orderer.example.com:7050 -n mycc -v 1.1 -C mychannel -c '{"Args":["init","a","100","b","200"]}'
-C:當前命令運行的通道;
-c:JSON格式的構造參數,默認值是`“{}";
-E:應用於當前Chaincode的系統背書Chaincode的名字;
-l:編寫chaincode的編程語言,默認爲golang;
-n:Chaincode的名字;
-p:chaincode源代碼的名字
-P:當前Chaincode的背書策略;
-v:當前操作的Chaincode的版本;
-V:當前Chaincode調用的驗證系統Chaincode的名字;
3.4.4 peer環境變量
配置文件和環境變量是設置peer啓動參數的重要手段。
參數名稱 | 參數描述 |
---|---|
CORE_VM_ENDPOINT | docker服務器的Deamon地址, 默認取端口的套接字 ,比如:CORE_VM_ENDPOINT=unix:///var/run/docker.sock |
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE | chaincode容器的網絡命名模式 |
CORE_PEER_PROFILE_ENABLED | 使用peer內置的 profile server |
CORE_LOGGING_LEVEL | log日誌的級別,它的值可以是:critical | error | warning | notice | info | debug |
CORE_PEER_ID | peer節點的編號 |
CORE_PEER_GOSSIP_USELEADERELECTION | 是否自動選舉leader節點,true代表自動選舉,false代表需要手動指定leader節點 |
CORE_PEER_GOSSIP_ORGLEADER | 當前節點是否爲leader節點,true代表是,false代表不是 |
CORE_PEER_ADDRESS | 當前peer節點的訪問地址 |
CORE_PEER_CHAINCODELISTENADDRESS | chaincode的監聽地址 |
CORE_PEER_GOSSIP_EXTERNALENDPOINT | 節點被組織外節點感知時的地址 |
CORE_PEER_GOSSIP_BOOTSTRAP | 啓動節點後向哪些節點發起gossip連接, 以加入網絡 |
CORE_PEER_LOCALMSPID | peer節點所屬的組織的編號 |
CORE_CHAINCODE_MODE | chaincode的運行模式,它的值可以有兩個: net: 網絡模式,dev: 開發模式 |
CORE_PEER_MSPCONFIGPATH | 當前節點的msp文件路徑 |
CORE_PEER_TLS_ENABLED | 是否激活tls |
CORE_PEER_TLS_CERT_FILE | 服務器身份驗證證書,例如:CORE_PEER_TLS_CERT_FILE=crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.crt |
CORE_PEER_TLS_KEY_FILE | 服務器的私鑰文件,例如:CORE_PEER_TLS_KEY_FILE=crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.key |
CORE_PEER_TLS_ROOTCERT_FILE | 根服務器證書,例如:CORE_PEER_TLS_ROOTCERT_FILE =crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/ca.crt |
3.4.5 peer默認監聽的端口
下面是hyperledge fabric默認使用的端口:
- 7050: REST 服務端口
- 7051:peer gRPC 服務監聽端口
- 7052:peer CLI 端口
- 7053:peer 事件服務端口
- 7054:eCAP
- 7055:eCAA
- 7056:tCAP
- 7057:tCAA
- 7058:tlsCAP
- 7059:tlsCAA