策略管理和訪問控制
參考書籍:《深度探索區塊鏈: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角色
- MSPRole_MEMBER: 驗證是否爲同一個MSP的有效簽名
- MSPRole_ADMIN: 驗證簽名者是否是MSP設置好的Admin成員。
3.1.3 基於MSP的部門驗證:MSPPrincipal_ORGANIZATION_UNIT
驗證步驟
- 驗證是否爲相同的MSP
- 驗證是否都是有效的證書
- 驗證組織部門信息是否匹配
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技術與應用 (區塊鏈技術叢書)。”