genesis,即创世区块,此处特指系统通道的创世区块。
相关代码在common/genesis/genesis.go,即Factory接口及实现。
type Factory interface {
????Block(channelID string) (*cb.Block, error)
}
//代码在common/genesis/genesis.go
msgVersion = int32(1)
epoch = 0
type factory struct {
????template configtx.Template
}
func NewFactoryImpl(template configtx.Template) Factory {
????return &factory{template: template}
}
func (f *factory) Block(channelID string) (*cb.Block, error) {
????configEnv, err := f.template.Envelope(channelID)
????configUpdate := &cb.ConfigUpdate{}
????err = proto.Unmarshal(configEnv.ConfigUpdate, configUpdate)
????payloadChannelHeader := utils.MakeChannelHeader(cb.HeaderType_CONFIG, msgVersion, channelID, epoch)
????payloadSignatureHeader := utils.MakeSignatureHeader(nil, utils.CreateNonceOrPanic())
????utils.SetTxID(payloadChannelHeader, payloadSignatureHeader)
????payloadHeader := utils.MakePayloadHeader(payloadChannelHeader, payloadSignatureHeader)
????payload := &cb.Payload{Header: payloadHeader, Data: utils.MarshalOrPanic(&cb.ConfigEnvelope{Config: &cb.Config{ChannelGroup: configUpdate.WriteSet}})}
????envelope := &cb.Envelope{Payload: utils.MarshalOrPanic(payload), Signature: nil}
????block := cb.NewBlock(0, nil)
????block.Data = &cb.BlockData{Data: [][]byte{utils.MarshalOrPanic(envelope)}}
????block.Header.DataHash = block.Data.Hash()
????block.Metadata.Metadata[cb.BlockMetadataIndex_LAST_CONFIG] = utils.MarshalOrPanic(&cb.Metadata{
????????Value: utils.MarshalOrPanic(&cb.LastConfig{Index: 0}),
????})
????return block, nil
}
//代码在common/genesis/genesis.go区块链教程Fabric1.0源代码分析configtx#genesis
原文:http://blog.51cto.com/14041296/2310733