十四、區塊鏈學習-Hyperledger Fabric (基於release-1.0) 策略管理和訪問控制

參考書籍:《深度探索區塊鏈:Hyperledger技術與應用》 @著 張增駿 董寧 朱軒彤 陳劍雄

1. 概述

策略管理,是一種權限控制,包括 交易背書策略、鏈碼實例化策略、通道管理策略等

2. 策略的定義以及類型

策略定義

type policy struct {
	Type int32 		// 策略類型
	Value []byte		// 策略內容
}

策略可以使用條件來組合
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

SignaturePolicy

type SignaturePolicy struct {
	// 支持類型
	// SignautrePolicy_SignedBy
	// SignautrePolicy_NOutOf_
	Type is SignautrePolicy_Type `protobuf_oneof:"Type"`
}

ImplicitMetaPolicy 是遞歸策略的定義方法,名稱中的Implicit說明規則由子策略生成,Meta說明策略依賴其他策略的驗證結果

type ImplicitMetaPolicy struct{
	SubPolicy string  						// 子策略名稱
	Rule ImplicitMetaPolicy_Rule		// 策略規則
}

ImplicitMetaPolicy_Rule有三種形式

  • ImplicitMetaPolicy_ANY: 任意一個子策略成立就滿足
  • ImplicitMetaPolicy_ALL:全部子策略成立才滿足
  • ImplicitMetaPolicy_MAJORITY: 大多數的子策略成立就滿足
    大多數的計算方式
    threshold = len(subPolicys) / 2 + 1

3 交易背書策略

交易背書策略是對交易進行背書的規則,跟通道和鏈碼相關,在鏈碼實例化時指定。在鏈碼調用的時候,需要從背書節點收集足夠的簽名背書。只有通過背書策略的交易纔是有效的。

3.1 交易背書策略的驗證

背書是由一組簽名組成的,每個peer接收到區塊時,都能根據交易的內容本地驗證背書是否符合背書策略,不需要和其他節點交互。驗證原則

  • 所有的背書都有效,驗證消息用又掉的證書進行正確的簽名
  • 滿足背書策略的有效背書數量,轉換爲NOutOf格式進行比較
  • 背書是期望的背書節點簽名的,在背書策略中指定了哪些組織的哪些角色是有效的背書節點。

3.1.1 如何實現驗證原則?

條件語法有AND OR 和NOutOf
其中AND 和OR 都可以轉化成NOutOf
AND(A,B) 等價於 NOutOf(2,A,B)
OR(A,B)等價於NOutOf(1,A,B)
背書策略定義如下

type SignaturePolicyEnvlope struct {
	Version int32											// 背書策略版本,默認0
	Rule *SignaturePolicy								// 背書策略規則:簽名策略
	Identities []common1.MSPPrincipal		// 背書策略主體:MSP主體簽名
}

其中MSPPrincipal定義如下

type MSPPrincipal struct {
	PrincipalClassification MSPPrincipal_Classification  // MSP類型
 	Principal []type // 不同的MSP類型。實體包含不同的內容
}

MSP類型有三種

  • MSPPrincipal_ROLE: 基於MSP角色的驗證方法,目前只有admin 和 member兩種
  • MSPPrincipal_ORGANIZATION_UNIT: 基於部門的驗證方法,同一個MSP中的不同部門
  • MSPPrincipal_IDENTITY:基於某個具體的身份證書驗證。

3.1.2 基於MSP角色驗證:MSPPrincipal_ROLE

兩中情況,一種是admin角色 一種是member角色

  1. MSPRole_MEMBER: 驗證是否爲同一個MSP的有效簽名
  2. MSPRole_ADMIN: 驗證簽名者是否是MSP設置好的Admin成員。

3.1.3 基於MSP的部門驗證:MSPPrincipal_ORGANIZATION_UNIT

驗證步驟

  1. 驗證是否爲相同的MSP
  2. 驗證是否都是有效的證書
  3. 驗證組織部門信息是否匹配

3.1.4 基於身份證書的驗證:MSPPrincipal_IDENTITY

只驗證是否爲有效證書就可以了。

3.2 給鏈碼指定背書策略

指定背書策略 可以使用-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')"

3.3 鏈碼實例化策略

這個策略是用來判斷是否有權限對鏈碼進行實例化和升級的。是在對鏈碼進行打包和簽名的時候指定的,如果沒有指定 默認是隻有通道管理員可以實例化。

3.4 通道管理策略

在這裏插入圖片描述
在使用configtxgen工具生成創世區塊或者通道配置時,使用的默認策略
在這裏插入圖片描述

摘錄來自: 張增駿. “深度探索區塊鏈:Hyperledger技術與應用 (區塊鏈技術叢書)。”

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