(六)HyperledgerFarbic1.4- Fabric 中的背書&策略&orderer-service & fabric-ca

一、什麼是背書和背書策略

背書就是在提交數據之前,各個節點進行簽名的過程,上塊的所有操作都需要背書。
進行背書節點就是背書節點
背書的規則就是背書規則

二、背書策略

策略可以使用條件來組合
AND:eg: AND(‘Org1.Admin’,‘Org2.Member’) 要求2個MSP標誌Org1,Org2 都要有一個簽名
OR:eg: OR(‘Org1.Admin’,‘Org2.Member’)要求2個MSP標誌Org1,Org2 任何一個有簽名

NOutOf: eg: NOutOf(1,‘Org1.Admin’,‘Org2.Member’) 表示滿足一個Org1的admin節點或者Org2中的一個成員節點有簽名。等價於OR(‘Org1.Admin’,‘Org2.Member’)

策略類型有兩種

  • SignaturePolicy: 簽名策略,驗證簽名數據是否符合規則。支持的條件AND、OR、NOutOf。其中的NOutOf表示 。
  • ImplicitMetaPolicy: 隱含元策略。在SignaturePolicy的基礎上 支持大多數組織管理員,這種策略只適合於通道管理

SignaturePolicy策略其實只有SignedBy和NOutOf兩種。AND、OR都會轉換爲NOutOf

三、 給鏈碼指定背書策略

指定背書策略 可以使用-P參數。

peer chaincode install -C myc -n mycc -p github.cpm/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["int","a","100","b","200"]}' -P "AND('Org1.member','Org2.member')"

鏈碼在安裝和示例化時可以指定策略
上面的策略意思就是
該鏈碼執行必須有 org1中的一個成員 和 org2中的一個成員 同時簽名背書纔有效。

其中策略中包含以下的用戶身份
Org1.admin : org1的admin用戶
Org1.client: org1中的任意client(admin、user)
Org1.peer:org1中的任意peer
Org1.member: 以上三種任意身份都可以

四、 Orderer service

4.1 orderer service 的主要職責

對收到的交易信息(tx)進行排序,並通過共識算法分發給各個節點。
orderer admin 用戶可以維護鏈碼信息,聯盟信息保存在orderer的system channel中。

4.2 orderer service 數據上塊處理

  1. 客戶端將請求發送個peer節點,peer節點進行背書,將背書提案返回給客戶端。
  2. 客戶端將背書提案的tx提交給orderer節點 orderer進行排序並打包成區塊。
  3. 將打包好的區塊分發到鏈接到orderer的peer節點,並不是所有的peer都需要鏈接到orderer節點。在同一個channel中的peer節點之間會通過gossip的方式來同步數據。每個peer在接收到區塊後都會進行校驗,驗證背書是否有效。只有驗證通過纔會將數據添加到鏈上。

4.3 orderer的部署模式

  1. solo模式:這種模式適合測試開發環境是orderer節點的單點部署。存在單點故障問題
  2. kafka模式:這種方式適合生成環境,可以多節點部署,可以避免單點故障,增加吞吐量。

其實 fabric 較多依賴於orderer service,並不是一個真正的去中心化的網絡。如果要做到完全去中心化,可以一個peer綁定一個order。
本質上org內存在中心節點其實也是被允許的。因爲聯盟中多個org之間不存在中心即可。

4.4 first-network如何切換到kafka模式啓動order

在網絡啓動腳本中可以看到配置變量

# default consensus type
CONSENSUS_TYPE="solo"

修改爲kafka即可。
或者啓動命令

byfn.sh up -o kafka

五、 fabric-ca

5.1 什麼是fabric-ca

fabric-ca是fabric框架中生存證書的一種方式。
fabric-ca分爲 server 和client
與fabric-ca-server交互的可以是fabric-ca-client 也可以是 SDK
同時fabric-ca-server也提供了REST接口。
一個服務器可以包含多個CAs 每個CA代表一個組織機構。一般是一個org對應一個ca-server。
server的數據存儲支持db,ldap

所以 在整個聯盟的網絡中 節點分佈大概如下
在這裏插入圖片描述

5.2 啓動ca節點

使用docker compose 啓動
my-ca-server-docker-compose.yaml

fabric-ca-server:
 image: hyperledger/fabric-ca:1.4.6
 container_name: fabric-ca-server
 ports:
   - "7054:7054"
 environment:
   - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
 volumes:  
   - "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"
 command: sh -c 'fabric-ca-server start -b admin:adminpw --cfg.affiliations.allowremove'

command中的–cfg.affiliations.allowremove 表示允許組織刪除。否則網絡中的組織是不能刪除的

啓動ca服務

docker-compose -f  ./my-ca-server-docker-compose.yaml up -d

啓動完成後 ca服務已經在docker的容器列表中了

lh0811:my-fabric-ca-server lh0811$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                    NAMES
333be7ad239b        hyperledger/fabric-ca:1.4.6   "sh -c 'fabric-ca-se…"   3 seconds ago       Up 2 seconds        0.0.0.0:7054->7054/tcp   fabric-ca-server

因爲docker容器啓動時做了目錄掛載 所以,當前啓動目錄下已經出現了掛載的文件

在這裏插入圖片描述
其中的fabric-ca-server.db 就是當前默認使用的sqlite數據庫。可以使用數控工具查看裏面的內容。
會存放着聯盟的信息 和 用戶的信息
在這裏插入圖片描述
可以看到這個ca默認的聯盟中的組織機構是不符合我們的要求的,所以要刪除聯盟信息,重新添加。

5.3 修改聯盟組織機構信息

在修改聯盟之前先在終端的環境變量中指定下ca-client的工作目錄
我把它跟fabric-ca-server放在同級目錄下(這樣指定的環境變量 只在當前終端會話中生效)

export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/hyperledger/my-fabric-ca-server/fabric-ca-client/

當server安裝完成後 client 也伴隨着server一起安裝完成了。
使用admin用戶登錄ca-server

fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

登錄成功後會在client的工作目錄目錄下生成相應的證書
在這裏插入圖片描述
使用 affiliation list 查看當前ca中管理的組織機構信息

# 執行
fabric-ca-client affiliation list

在這裏插入圖片描述
刪除原有的org信息

fabric-ca-client affiliation remove --force org1
fabric-ca-client affiliation remove --force org2

這時候 在用命令fabric-ca-client affiliation list,查看列表 則是沒有組織機構信息。

添加新的組織機構信息

fabric-ca-client affiliation add com

fabric-ca-client affiliation add com.example

fabric-ca-client affiliation add com.example.org1

fabric-ca-client affiliation add com.example.org2

在這裏插入圖片描述

5.4 生成證書

生成 example.com的證書

fabric-ca-client getcainfo -M example.com/msp

執行成功後
在這裏插入圖片描述
這個證書 其實就是order的證書

如果是要註冊client/peer 這種角色的證書 就需要一下命令,
client: admin 、user
peer: peer

其中策略中包含以下的用戶身份
Org1.admin : org1的admin用戶
Org1.client: org1中的任意client(admin、user)
Org1.peer:org1中的任意peer
Org1.member: 以上三種任意身份都可以

fabric-ca-client register --id.name [email protected] --id.type client --id.affiliation "com.example" --id.attrs '"hf.Registrar.Roles=client,orderer,peer,user","hf.Registrar.DelegateRoles=client,orderer,peer,user",hf.Registrar.Attributes=*,hf.GenCRL=true,hf.Revoker=true,hf.AffiliationMgr=true,hf.IntermediateCA=true,role=admin:ecert' --id.secret ordererpwd

上面命令生成了
用戶名 --id.name : [email protected]
類型 --id.type : client
聯盟 --id.affiliation : “com.example”
密碼 --id.secret: ordererpwd
如果不指定密碼 則會自動生成一個密碼 執行完命令後返回,一定要記住這個密碼。否則只能刪除證書後重新生成證書

用戶登錄後 就會生成響應的證書

fabric-ca-client enroll -u http://[email protected]:ordererpwd@localhost:7054 -H example.com/users/[email protected]

這時候就有了users的[email protected]這個證書
在這裏插入圖片描述

以上就是使用fabrci-ca 生成證書的過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章