區塊鏈教程Fabric1.0原始碼分析MSP成員關係服務提供者一
阿新 • • 發佈:2018-11-02
Fabric 1.0原始碼筆記 之 MSP(成員關係服務提供者)
1、MSP概述
MSP,全稱Membership Service Provider,即成員關係服務提供者,作用為管理Fabric中的眾多參與者。
成員服務提供者(MSP)是一個提供抽象化成員操作框架的元件。
MSP將頒發與校驗證書,以及使用者認證背後的所有密碼學機制與協議都抽象了出來。一個MSP可以自己定義身份,以及身份的管理(身份驗證)與認證(生成與驗證簽名)規則。
一個Hyperledger Fabric區塊鏈網路可以被一個或多個MSP管理。
MSP的核心程式碼在msp目錄下,其他相關程式碼分佈在common/config/msp、protos/msp下。目錄結構如下:
- msp目錄
msp.go,定義介面MSP、MSPManager、Identity、SigningIdentity、IdentityDeserializer。
mspimpl.go,實現MSP介面,即bccspmsp。
mspmgrimpl.go,實現MSPManager介面,即mspManagerImpl。
identities.go,實現Identity、SigningIdentity介面,即identity和signingidentity。
configbuilder.go,提供讀取證書檔案並將其組裝成MSP等介面所需的資料結構,以及轉換配置結構體(FactoryOpts->MSPConfig)等工具函式。
mgmt目錄
mgmt.go,msp相關管理方法實現。
principal.go,MSPPrincipalGetter介面及其實現,即localMSPPrincipalGetter。
deserializer.go,DeserializersManager介面及其實現,即mspDeserializersManager。 - common/config/msp目錄
* config.go,定義了MSPConfigHandler及其方法,用於配置MSP和configtx工具。 - protos/msp目錄,msp相關Protocol Buffer原型檔案。
2、核心介面定義
IdentityDeserializer為身份反序列化介面,同時被MSP和MSPManger的介面嵌入。定義如下:
type IdentityDeserializer interface {
DeserializeIdentity(serializedIdentity []byte) (Identity, error)
}
//程式碼在msp/msp.go
MSP介面定義:
type MSP interface {
IdentityDeserializer //需要實現IdentityDeserializer介面
Setup(config *msp.MSPConfig) error //根據MSPConfig設定MSP例項
GetType() ProviderType //獲取MSP型別,即FABRIC
GetIdentifier() (string, error) //獲取MSP名字
GetDefaultSigningIdentity() (SigningIdentity, error) //獲取預設的簽名身份
GetTLSRootCerts() [][]byte //獲取TLS根CA證書
Validate(id Identity) error //校驗身份是否有效
SatisfiesPrincipal(id Identity, principal *msp.MSPPrincipal) error //驗證給定的身份與principal中所描述的型別是否相匹配
}
//程式碼在msp/msp.go
MSPManager介面定義:
type MSPManager interface {
IdentityDeserializer //需要實現IdentityDeserializer介面
Setup(msps []MSP) error //用給定的msps填充例項中的mspsMap
GetMSPs() (map[string]MSP, error) //獲取MSP列表,即mspsMap
}
//程式碼在msp/msp.go
Identity介面定義(身份):
type Identity interface {
GetIdentifier() *IdentityIdentifier //獲取身份ID
GetMSPIdentifier() string //獲取MSP ID,即id.Mspid
Validate() error //校驗身份是否有效,即調取msp.Validate(id)
GetOrganizationalUnits() []*OUIdentifier //獲取組織單元
Verify(msg []byte, sig []byte) error //用這個身份校驗訊息簽名
Serialize() ([]byte, error) //身份序列化
SatisfiesPrincipal(principal *msp.MSPPrincipal) error //呼叫msp的SatisfiesPrincipal檢查身份與principal中所描述的型別是否匹配
}
//程式碼在msp/msp.go
SigningIdentity介面定義(簽名身份):
type SigningIdentity interface {
Identity //需要實現Identity介面
Sign(msg []byte) ([]byte, error) //簽名msg
}
//程式碼在msp/msp.go
未完待續感謝關注!