Fabric 1.0原始碼分析(24)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的介面嵌入。定義如下:
```go
type IdentityDeserializer interface {
DeserializeIdentity(serializedIdentity []byte) (Identity, error)
}
//程式碼在msp/msp.go
```
MSP介面定義:
```go
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介面定義:
```go
type MSPManager interface {
IdentityDeserializer //需要實現IdentityDeserializer介面
Setup(msps []MSP) error //用給定的msps填充例項中的mspsMap
GetMSPs() (map[string]MSP, error) //獲取MSP列表,即mspsMap
}
//程式碼在msp/msp.go
```
Identity介面定義(身份):
```go
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介面定義(簽名身份):
```go
type SigningIdentity interface {
Identity //需要實現Identity介面
Sign(msg []byte) ([]byte, error) //簽名msg
}
//程式碼在msp/msp.go
```
## 3、MSP介面實現
MSP介面實現,即bccspmsp結構體及方法,bccspmsp定義如下:
```go
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
```
涉及方法如下:
```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程式碼如下:
```go
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)程式碼如下:
```go
validationChain, err := msp.getCertificationChainForBCCSPIdentity(id) //獲取BCCSP身份認證鏈
err = msp.validateIdentityAgainstChain(id, validationChain) //根據鏈驗證身份
err = msp.validateIdentityOUs(id) //驗證身份中所攜帶的組織資訊有效
//程式碼在msp/mspimpl.go
```
## 4、MSPManager介面實現
結構體定義:
```go
type mspManagerImpl struct {
mspsMap map[string]MSP //MSP的對映
up bool //是否正常啟用
}
//程式碼在msp/mspmgrimpl.go
```
方法:
```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結構體定義(身份):
```go
type identity struct {
id *IdentityIdentifier //身份識別符號(含Mspid和Id,均為string)
cert *x509.Certificate //代表身份的x509證書
pk bccsp.Key //身份公鑰
msp *bccspmsp //擁有此例項的MSP例項
}
//程式碼在msp/identities.go
```
補充IdentityIdentifier結構體定義(身份識別符號):
```go
type IdentityIdentifier struct {
Mspid string //Msp id
Id string //Id
}
//程式碼在msp/msp.go
```
identity結構體涉及方法如下:
```go
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結構體定義(簽名身份):
```go
type signingidentity struct {
identity //嵌入identity
signer crypto.Signer //crypto標準庫中Signer介面
}
//程式碼在msp/identities.go
```
signingidentity結構體涉及方法如下:
```go
//新建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中。
```go
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
```
涉及的方法如下:
```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為空時設定預設值。
```go
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涉及方法如下:
```go
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程式碼如下:
```go
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
```
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- Fabric 1.0原始碼分析(1)BCCSP(區塊鏈加密服務提供者)原始碼區塊鏈加密
- Fabric 1.0原始碼分析(13)events(事件服務)原始碼事件
- Fabric 1.0原始碼分析(30) Orderer #BroadcastServer(Broadcast服務端)原始碼ASTServer服務端
- Fabric 1.0原始碼分析(35)Peer #EndorserServer(Endorser服務端)原始碼Server服務端
- Fabric 1.0原始碼分析(12)cryptogen(生成組織關係和身份證書)原始碼
- Fabric 1.0原始碼分析(25) Orderer原始碼
- Fabric 1.0原始碼分析(31) Peer原始碼
- Fabric 1.0原始碼分析(16)gossip(流言演算法) #GossipServer(Gossip服務端)原始碼Go演算法Server服務端
- Fabric 1.0原始碼分析(3)Chaincode(鏈碼)原始碼AI
- Fabric 1.0原始碼分析(40) Proposal(提案)原始碼
- Lumen - 服務容器,服務提供者,Facades的關係
- Fabric 1.0原始碼分析(14) flogging(Fabric日誌系統)原始碼
- Fabric 1.0原始碼分析(18) Ledger(賬本)原始碼
- Fabric 1.0原始碼分析(43) Tx(Transaction 交易)原始碼
- Fabric 1.0原始碼分析(47)Fabric 1.0.4 go程式碼量統計原始碼Go
- Fabric 1.0原始碼分析(42)scc(系統鏈碼) #cscc(通道相關)原始碼
- Fabric 1.0原始碼分析(42)scc(系統鏈碼)原始碼
- Fabric 1.0原始碼分析(26)Orderer #ledger(Orderer Ledger)原始碼
- Fabric 1.0原始碼分析(39) policy(背書策略)原始碼
- Fabric 1.0原始碼分析(45)gRPC(Fabric中註冊的gRPC Service)原始碼RPC
- Fabric 1.0原始碼分析(10)consenter(共識外掛)原始碼
- Fabric 1.0原始碼分析(15)gossip(流言演算法)原始碼Go演算法
- Fabric 1.0原始碼分析(23)LevelDB(KV資料庫)原始碼資料庫
- Fabric 1.0原始碼分析(44)Tx #RWSet(讀寫集)原始碼
- 區塊鏈教程Fabric1.0原始碼分析流言演算法Gossip服務端二-兄弟連區塊鏈原始碼演算法Go服務端
- Fabric 1.0原始碼分析(5)Chaincode(鏈碼)體系總結原始碼AI
- Fabric 1.0原始碼分析(6)configtx(配置交易) #ChannelConfig(通道配置)原始碼
- Fabric 1.0原始碼分析(20) Ledger #idStore(ledgerID資料庫)原始碼資料庫
- Fabric 1.0原始碼分析(29) Orderer #multichain(多鏈支援包)原始碼AI
- Fabric 1.0原始碼分析(36) Peer #EndorserClient(Endorser客戶端)原始碼client客戶端
- Fabric 1.0原始碼分析(37) Peer #DeliverClient(Deliver客戶端)原始碼client客戶端
- Fabric 1.0原始碼分析(38) Peer #BroadcastClient(Broadcast客戶端)原始碼ASTclient客戶端
- Fabric 1.0原始碼分析(41)putils(protos/utils工具包)原始碼
- Fabric 1.0原始碼分析(2) blockfile(區塊檔案儲存)原始碼BloC
- Fabric 1.0原始碼分析(7)configtx(配置交易) #configtxgen(生成通道配置)原始碼
- Fabric 1.0原始碼分析(9)configtx(配置交易)體系介紹原始碼
- Fabric 1.0原始碼分析(19) Ledger #statedb(狀態資料庫)原始碼資料庫
- Fabric 1.0原始碼分析(21)Ledger #historydb(歷史資料庫)原始碼資料庫