區塊鏈開源實現Hyperledge Fabric(一)

一、概述

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
發佈了109 篇原創文章 · 獲贊 39 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章