天天看點

區塊鍊教程Fabric1.0源代碼分析MSP成員關系服務提供者一Fabric 1.0源代碼筆記 之 MSP(成員關系服務提供者)

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)等工具函數。

    * cert.go,證書相關結構體及方法。

    * 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           

未完待續感謝關注兄弟連區塊鍊教程分享!

繼續閱讀