1. 程式人生 > >區塊鏈教程Fabric1.0源代碼分析MSP成員關系服務提供者二

區塊鏈教程Fabric1.0源代碼分析MSP成員關系服務提供者二

proto pub 加載 p s uil pri 初始化 補充 setup

3、MSP接口實現

MSP接口實現,即bccspmsp結構體及方法,bccspmsp定義如下:

type bccspmsp struct {
????rootCerts []Identity //信任的CA證書列表
????intermediateCerts []Identity //信任的中間證書列表
????tlsRootCerts [][]byte //信任的CA TLS 證書列表
????tlsIntermediateCerts [][]byte //信任的中間TLS 證書列表
????certificationTreeInternalNodesMap map[string]bool //待定
????signer SigningIdentity //簽名身份
????admins []Identity //管理身份列表
????bccsp bccsp.BCCSP //加密服務提供者
????name string //MSP名字
????opts *x509.VerifyOptions //MSP成員驗證選項
????CRL []*pkix.CertificateList //證書吊銷列表
????ouIdentifiers map[string][][]byte //組織列表
????cryptoConfig *m.FabricCryptoConfig //加密選項
}
//代碼在msp/mspimpl.go

涉及方法如下:

func NewBccspMsp() (MSP, error) //創建bccsp實例,以及創建並初始化bccspmsp實例
func (msp *bccspmsp) Setup(conf1 *m.MSPConfig) error ////根據MSPConfig設置MSP實例
func (msp *bccspmsp) GetType() ProviderType //獲取MSP類型,即FABRIC
func (msp *bccspmsp) GetIdentifier() (string, error) //獲取MSP名字
func (msp *bccspmsp) GetTLSRootCerts() [][]byte //獲取信任的CA TLS 證書列表msp.tlsRootCerts
func (msp *bccspmsp) GetTLSIntermediateCerts() [][]byte //獲取信任的中間TLS 證書列表msp.tlsIntermediateCerts
func (msp *bccspmsp) GetDefaultSigningIdentity() (SigningIdentity, error) ////獲取默認的簽名身份msp.signer
func (msp *bccspmsp) GetSigningIdentity(identifier *IdentityIdentifier) (SigningIdentity, error) //暫未實現,可忽略
func (msp *bccspmsp) Validate(id Identity) error //校驗身份是否有效,調取msp.validateIdentity(id)實現
func (msp *bccspmsp) DeserializeIdentity(serializedID []byte) (Identity, error) //身份反序列化
func (msp *bccspmsp) SatisfiesPrincipal(id Identity, principal *m.MSPPrincipal) error //驗證給定的身份與principal中所描述的類型是否相匹配
//代碼在msp/mspimpl.go

func (msp bccspmsp) Setup(conf1 m.MSPConfig) error代碼如下:

conf := &m.FabricMSPConfig{}
err := proto.Unmarshal(conf1.Config, conf) //將conf1.Config []byte解碼為FabricMSPConfig
msp.name = conf.Name
err := msp.setupCrypto(conf) //設置加密選項msp.cryptoConfig
err := msp.setupCAs(conf) //設置MSP成員驗證選項msp.opts,並添加信任的CA證書msp.rootCerts和信任的中間證書msp.intermediateCerts
err := msp.setupAdmins(conf) //設置管理身份列表msp.admins
err := msp.setupCRLs(conf) //設置證書吊銷列表msp.CRL
err := msp.finalizeSetupCAs(conf); err != nil //設置msp.certificationTreeInternalNodesMap
err := msp.setupSigningIdentity(conf) //設置簽名身份msp.signer
err := msp.setupOUs(conf) //設置組織列表msp.ouIdentifiers
err := msp.setupTLSCAs(conf) //設置並添加信任的CA TLS 證書列表msp.tlsRootCerts,以及信任的CA TLS 證書列表msp.tlsIntermediateCerts
for i, admin := range msp.admins {
????err = admin.Validate() //確保管理員是有效的成員
}
//代碼在msp/mspimpl.go

func (msp bccspmsp) validateIdentity(id identity)代碼如下:

validationChain, err := msp.getCertificationChainForBCCSPIdentity(id) //獲取BCCSP身份認證鏈
err = msp.validateIdentityAgainstChain(id, validationChain) //根據鏈驗證身份
err = msp.validateIdentityOUs(id) //驗證身份中所攜帶的組織信息有效
//代碼在msp/mspimpl.go

4、MSPManager接口實現

結構體定義:

type mspManagerImpl struct {
????mspsMap map[string]MSP //MSP的映射
????up bool //是否正常啟用
}
//代碼在msp/mspmgrimpl.go

方法:

func NewMSPManager() MSPManager //創建mspManagerImpl實例
func (mgr *mspManagerImpl) Setup(msps []MSP) error //將msps裝入mgr.mspsMap
func (mgr *mspManagerImpl) GetMSPs() (map[string]MSP, error) //獲取mgr.mspsMap
func (mgr *mspManagerImpl) DeserializeIdentity(serializedID []byte) (Identity, error) //調用msp.DeserializeIdentity()實現身份反序列化
//代碼在msp/mspmgrimpl.go

5、Identity、SigningIdentity接口實現

identity結構體定義(身份):

type identity struct {
????id *IdentityIdentifier //身份標識符(含Mspid和Id,均為string)
????cert *x509.Certificate //代表身份的x509證書
????pk bccsp.Key //身份公鑰
????msp *bccspmsp //擁有此實例的MSP實例
}
//代碼在msp/identities.go

補充IdentityIdentifier結構體定義(身份標識符):

type IdentityIdentifier struct {
????Mspid string //Msp id
????Id string //Id
}
//代碼在msp/msp.go

identity結構體涉及方法如下:

func newIdentity(id *IdentityIdentifier, cert *x509.Certificate, pk bccsp.Key, msp *bccspmsp) (Identity, error) //創建identity實例
func NewSerializedIdentity(mspID string, certPEM []byte) ([]byte, error) //新建身份SerializedIdentity並序列化
func (id *identity) SatisfiesPrincipal(principal *msp.MSPPrincipal) error //調用msp的SatisfiesPrincipal檢查身份與principal中所描述的類型是否匹配
func (id *identity) GetIdentifier() *IdentityIdentifier //獲取id.id
func (id *identity) GetMSPIdentifier() string //獲取id.id.Mspid
func (id *identity) Validate() error //調取id.msp.Validate(id)校驗身份是否有效
func (id *identity) GetOrganizationalUnits() []*OUIdentifier //獲取組織單元
func (id *identity) Verify(msg []byte, sig []byte) error //用這個身份校驗消息簽名
func (id *identity) Serialize() ([]byte, error)//身份序列化
func (id *identity) getHashOpt(hashFamily string) (bccsp.HashOpts, error) //調取bccsp.GetHashOpt
//代碼在msp/identities.go

signingidentity結構體定義(簽名身份):

type signingidentity struct {
????identity //嵌入identity
????signer crypto.Signer //crypto標準庫中Signer接口
}
//代碼在msp/identities.go

signingidentity結構體涉及方法如下:

//新建signingidentity實例
func newSigningIdentity(id *IdentityIdentifier, cert *x509.Certificate, pk bccsp.Key, signer crypto.Signer, msp *bccspmsp) (SigningIdentity, error) 
func (id *signingidentity) Sign(msg []byte) ([]byte, error) //簽名msg
func (id *signingidentity) GetPublicVersion() Identity //獲取id.identity
//代碼在msp/identities.go

6、MSPConfig相關結構體及方法

MSPConfig相關結構體定義:
FabricMSPConfig定義與bccspmsp接近,FabricMSPConfig序列化後以[]byte存入MSPConfig.Config中。

type MSPConfig struct {
????Type int32
????Config []byte
}
type FabricMSPConfig struct {
????Name string //MSP名字
????RootCerts [][]byte //信任的CA證書列表
????IntermediateCerts [][]byte //信任的中間證書列表
????Admins [][]byte //管理身份列表
????RevocationList [][]byte //證書吊銷列表
????SigningIdentity *SigningIdentityInfo //簽名身份
????OrganizationalUnitIdentifiers []*FabricOUIdentifier //組織列表
????CryptoConfig *FabricCryptoConfig //加密選項
????TlsRootCerts [][]byte //信任的CA TLS 證書列表
????TlsIntermediateCerts [][]byte //信任的中間TLS 證書列表
}
//代碼在protos/msp/msp_config.pb.go

涉及的方法如下:

func GetLocalMspConfig(dir string, bccspConfig *factory.FactoryOpts, ID string) (*msp.MSPConfig, error) //獲取本地MSP配置
//代碼在protos/msp/configbuilder.go

func GetLocalMspConfig(dir string, bccspConfig factory.FactoryOpts, ID string) (msp.MSPConfig, error)實現代碼如下:
SetupBCCSPKeystoreConfig()核心代碼為bccspConfig.SwOpts.FileKeystore = &factory.FileKeystoreOpts{KeyStorePath: keystoreDir},目的是在FileKeystore或KeyStorePath為空時設置默認值。

signcertDir := filepath.Join(dir, signcerts) //signcerts為"signcerts",signcertDir即/etc/hyperledger/fabric/msp/signcerts/
keystoreDir := filepath.Join(dir, keystore) //keystore為"keystore",keystoreDir即/etc/hyperledger/fabric/msp/keystore/
bccspConfig = SetupBCCSPKeystoreConfig(bccspConfig, keystoreDir) //設置bccspConfig.SwOpts.Ephemeral = false和bccspConfig.SwOpts.FileKeystore = &factory.FileKeystoreOpts{KeyStorePath: keystoreDir}
????//bccspConfig.SwOpts.Ephemeral是否短暫的
err := factory.InitFactories(bccspConfig) //初始化bccsp factory,並創建bccsp實例
signcert, err := getPemMaterialFromDir(signcertDir) //讀取X.509證書的PEM文件
sigid := &msp.SigningIdentityInfo{PublicSigner: signcert[0], PrivateSigner: nil} //構造SigningIdentityInfo
return getMspConfig(dir, ID, sigid) //分別讀取cacerts、admincerts、tlscacerts文件,以及config.yaml中組織信息,構造msp.FabricMSPConfig,序列化後用於構造msp.MSPConfig
//代碼在msp/configbuilder.go

7、mgmt

mgmt涉及方法如下:

func LoadLocalMsp(dir string, bccspConfig *factory.FactoryOpts, mspID string) error //從指定目錄加載本地MSP
func GetLocalMSP() msp.MSP //調取msp.NewBccspMsp()創建bccspmsp實例
func GetLocalSigningIdentityOrPanic() msp.SigningIdentity //GetLocalMSP().GetDefaultSigningIdentity()
//代碼在msp/mgmt/mgmt.go

func LoadLocalMsp(dir string, bccspConfig *factory.FactoryOpts, mspID string) error代碼如下:

conf, err := msp.GetLocalMspConfig(dir, bccspConfig, mspID) //獲取本地MSP配置,序列化後寫入msp.MSPConfig,即conf
return GetLocalMSP().Setup(conf) //調取msp.NewBccspMsp()創建bccspmsp實例,調取bccspmsp.Setup(conf)解碼conf.Config並設置bccspmsp
//代碼在msp/mgmt/mgmt.go

區塊鏈教程Fabric1.0源代碼分析MSP成員關系服務提供者二