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 數據上塊處理
- 客戶端將請求發送個peer節點,peer節點進行背書,將背書提案返回給客戶端。
- 客戶端將背書提案的tx提交給orderer節點 orderer進行排序並打包成區塊。
- 將打包好的區塊分發到鏈接到orderer的peer節點,並不是所有的peer都需要鏈接到orderer節點。在同一個channel中的peer節點之間會通過gossip的方式來同步數據。每個peer在接收到區塊後都會進行校驗,驗證背書是否有效。只有驗證通過纔會將數據添加到鏈上。
4.3 orderer的部署模式
- solo模式:這種模式適合測試開發環境是orderer節點的單點部署。存在單點故障問題
- 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 生成證書的過程