標籤:utils let meta erro action prot 產生 erer 實現
區塊鏈教程Fabric1.0原始碼分析配置交易-產生通道配置二。Generator介面實現,即bootstrapper。
type bootstrapper struct {????channelGroups []*cb.ConfigGroup????ordererGroups []*cb.ConfigGroup????applicationGroups []*cb.ConfigGroup????consortiumsGroups []*cb.ConfigGroup}func New(conf *genesisconfig.Profile) Generatorfunc (bs *bootstrapper) ChannelTemplate() configtx.Templatefunc (bs *bootstrapper) GenesisBlock() *cb.Blockfunc (bs *bootstrapper) GenesisBlockForChannel(channelID string) *cb.Block//代碼在common/configtx/tool/provisional/provisional.go
func New(conf *genesisconfig.Profile) Generator代碼如下:
func New(conf *genesisconfig.Profile) Generator {????bs := &bootstrapper{????????channelGroups: []*cb.ConfigGroup{????????????config.DefaultHashingAlgorithm(), //預設雜湊函數????????????config.DefaultBlockDataHashingStructure(), //預設塊資料雜湊結構????????????????????????//預設通道策略,包括讀策略、寫策略和管理原則????????????//ReadersPolicyKey = "Readers",ImplicitMetaPolicy_ANY,任意????????????policies.TemplateImplicitMetaAnyPolicy([]string{}, configvaluesmsp.ReadersPolicyKey),????????????//WritersPolicyKey = "Writers",ImplicitMetaPolicy_ANY,任意????????????policies.TemplateImplicitMetaAnyPolicy([]string{}, configvaluesmsp.WritersPolicyKey),????????????//AdminsPolicyKey = "Admins",ImplicitMetaPolicy_MAJORITY,大多數????????????policies.TemplateImplicitMetaMajorityPolicy([]string{}, configvaluesmsp.AdminsPolicyKey),????????},????}????if conf.Orderer != nil { //系統通道配置????????oa := config.TemplateOrdererAddresses(conf.Orderer.Addresses) //設定Orderer地址????????oa.Values[config.OrdererAddressesKey].ModPolicy = OrdererAdminsPolicy //OrdererAdminsPolicy = "/Channel/Orderer/Admins"????????bs.ordererGroups = []*cb.ConfigGroup{????????????oa,????????????config.TemplateConsensusType(conf.Orderer.OrdererType), //設定共識外掛程式類型????????????config.TemplateBatchSize(&ab.BatchSize{ //設定批處理大小????????????????MaxMessageCount: conf.Orderer.BatchSize.MaxMessageCount,????????????????AbsoluteMaxBytes: conf.Orderer.BatchSize.AbsoluteMaxBytes,????????????????PreferredMaxBytes: conf.Orderer.BatchSize.PreferredMaxBytes,????????????}),????????????config.TemplateBatchTimeout(conf.Orderer.BatchTimeout.String()), //設定批處理逾時????????????config.TemplateChannelRestrictions(conf.Orderer.MaxChannels), //設定最大通道數????????????//初始化Orderer讀、寫、管理原則????????????policies.TemplateImplicitMetaPolicyWithSubPolicy([]string{config.OrdererGroupKey}, BlockValidationPolicyKey, configvaluesmsp.WritersPolicyKey, cb.ImplicitMetaPolicy_ANY),????????????policies.TemplateImplicitMetaAnyPolicy([]string{config.OrdererGroupKey}, configvaluesmsp.ReadersPolicyKey),????????????policies.TemplateImplicitMetaAnyPolicy([]string{config.OrdererGroupKey}, configvaluesmsp.WritersPolicyKey),????????????policies.TemplateImplicitMetaMajorityPolicy([]string{config.OrdererGroupKey}, configvaluesmsp.AdminsPolicyKey),????????}????????for _, org := range conf.Orderer.Organizations {????????????mspConfig, err := msp.GetVerifyingMspConfig(org.MSPDir, org.ID)????????????bs.ordererGroups = append(bs.ordererGroups,????????????????configvaluesmsp.TemplateGroupMSPWithAdminRolePrincipal([]string{config.OrdererGroupKey, org.Name},????????????????????mspConfig, org.AdminPrincipal == genesisconfig.AdminRoleAdminPrincipal,????????????????),????????????)????????}????????switch conf.Orderer.OrdererType {????????case ConsensusTypeSolo:????????case ConsensusTypeKafka:????????????bs.ordererGroups = append(bs.ordererGroups, config.TemplateKafkaBrokers(conf.Orderer.Kafka.Brokers)) //設定Kafka????????default:????????}????}????if conf.Application != nil { //應用通道配置????????bs.applicationGroups = []*cb.ConfigGroup{????????????policies.TemplateImplicitMetaAnyPolicy([]string{config.ApplicationGroupKey}, configvaluesmsp.ReadersPolicyKey),????????????policies.TemplateImplicitMetaAnyPolicy([]string{config.ApplicationGroupKey}, configvaluesmsp.WritersPolicyKey),????????????policies.TemplateImplicitMetaMajorityPolicy([]string{config.ApplicationGroupKey}, configvaluesmsp.AdminsPolicyKey),????????}????????for _, org := range conf.Application.Organizations {????????????mspConfig, err := msp.GetVerifyingMspConfig(org.MSPDir, org.ID)????????????bs.applicationGroups = append(bs.applicationGroups,????????????????configvaluesmsp.TemplateGroupMSPWithAdminRolePrincipal([]string{config.ApplicationGroupKey, org.Name},????????????????????mspConfig, org.AdminPrincipal == genesisconfig.AdminRoleAdminPrincipal,????????????????),????????????)????????????var anchorProtos []*pb.AnchorPeer????????????for _, anchorPeer := range org.AnchorPeers {????????????????anchorProtos = append(anchorProtos, &pb.AnchorPeer{????????????????????Host: anchorPeer.Host,????????????????????Port: int32(anchorPeer.Port),????????????????})????????????}????????????bs.applicationGroups = append(bs.applicationGroups, config.TemplateAnchorPeers(org.Name, anchorProtos))????????}????}????if conf.Consortiums != nil { //聯盟相關????????tcg := config.TemplateConsortiumsGroup()????????tcg.Groups[config.ConsortiumsGroupKey].ModPolicy = OrdererAdminsPolicy????????tcg.Groups[config.ConsortiumsGroupKey].Policies[configvaluesmsp.AdminsPolicyKey] = &cb.ConfigPolicy{????????????Policy: &cb.Policy{????????????????Type: int32(cb.Policy_SIGNATURE),????????????????Value: utils.MarshalOrPanic(cauthdsl.AcceptAllPolicy),????????????},????????????ModPolicy: OrdererAdminsPolicy,????????}????????bs.consortiumsGroups = append(bs.consortiumsGroups, tcg)????????for consortiumName, consortium := range conf.Consortiums {????????????cg := config.TemplateConsortiumChannelCreationPolicy(consortiumName, policies.ImplicitMetaPolicyWithSubPolicy(????????????????configvaluesmsp.AdminsPolicyKey,????????????????cb.ImplicitMetaPolicy_ANY,????????????).Policy)????????????cg.Groups[config.ConsortiumsGroupKey].Groups[consortiumName].ModPolicy = OrdererAdminsPolicy????????????cg.Groups[config.ConsortiumsGroupKey].Groups[consortiumName].Values[config.ChannelCreationPolicyKey].ModPolicy = OrdererAdminsPolicy????????????bs.consortiumsGroups = append(bs.consortiumsGroups, cg)????????????for _, org := range consortium.Organizations {????????????????mspConfig, err := msp.GetVerifyingMspConfig(org.MSPDir, org.ID)????????????????bs.consortiumsGroups = append(bs.consortiumsGroups,????????????????????configvaluesmsp.TemplateGroupMSPWithAdminRolePrincipal(????????????????????????[]string{config.ConsortiumsGroupKey, consortiumName, org.Name},????????????????????????mspConfig, org.AdminPrincipal == genesisconfig.AdminRoleAdminPrincipal,????????????????????),????????????????)????????????}????????}????}????return bs}//代碼在common/configtx/tool/provisional/provisional.go
func (bs bootstrapper) GenesisBlockForChannel(channelID string) cb.Block代碼如下:
func (bs *bootstrapper) GenesisBlockForChannel(channelID string) *cb.Block {????block, err := genesis.NewFactoryImpl(????????configtx.NewModPolicySettingTemplate(????????????configvaluesmsp.AdminsPolicyKey,????????????configtx.NewCompositeTemplate(????????????????configtx.NewSimpleTemplate(bs.consortiumsGroups...),????????????????bs.ChannelTemplate(),????????????),????????),????).Block(channelID)????return block}//代碼在common/configtx/tool/provisional/provisional.go
5、configtxgen命令5.1、main函數
func main() {????var outputBlock, outputChannelCreateTx, profile, channelID, inspectBlock, inspectChannelCreateTx, outputAnchorPeersUpdate, asOrg string????//-outputBlock,初始區塊寫入指定檔案????flag.StringVar(&outputBlock, "outputBlock", "", "The path to write the genesis block to (if set)")????//-channelID,指定通道名稱????flag.StringVar(&channelID, "channelID", provisional.TestChainID, "The channel ID to use in the configtx")????//-outputCreateChannelTx,將通道建立交易寫入指定檔案????flag.StringVar(&outputChannelCreateTx, "outputCreateChannelTx", "", "The path to write a channel creation configtx to (if set)")????//-profile,指定profile????flag.StringVar(&profile, "profile", genesisconfig.SampleInsecureProfile, "The profile from configtx.yaml to use for generation.")????//-inspectBlock,列印指定區塊的配置資訊????flag.StringVar(&inspectBlock, "inspectBlock", "", "Prints the configuration contained in the block at the specified path")????//-inspectChannelCreateTx,列印通道建立交易檔案中的配置更新資訊????flag.StringVar(&inspectChannelCreateTx, "inspectChannelCreateTx", "", "Prints the configuration contained in the transaction at the specified path")????//-outputAnchorPeersUpdate,產生錨節點配置更新檔案,需同時指定-asOrg????flag.StringVar(&outputAnchorPeersUpdate, "outputAnchorPeersUpdate", "", "Creates an config update to update an anchor peer (works only with the default channel creation, and only for the first update)")????//-asOrg,以指定身份執行更新配置交易,如更新錨節點配置資訊????flag.StringVar(&asOrg, "asOrg", "", "Performs the config generation as a particular organization (by name), only including values in the write set that org (likely) has privilege to set")????flag.Parse()????factory.InitFactories(nil)????config := genesisconfig.Load(profile) //讀取指定配置????if outputBlock != "" { //產生Orderer服務啟動的初始區塊????????err := doOutputBlock(config, channelID, outputBlock)????}????if outputChannelCreateTx != "" { //產生建立應用通道的配置交易????????err := doOutputChannelCreateTx(config, channelID, outputChannelCreateTx)????}????if outputAnchorPeersUpdate != "" { //產生錨節點配置更新檔案????????err := doOutputAnchorPeersUpdate(config, channelID, outputAnchorPeersUpdate, asOrg)????}}//代碼在common/configtx/tool/configtxgen/main.go
5.2、doOutputBlock(產生Orderer服務啟動的初始區塊,即系統通道的初始區塊檔案)
func doOutputBlock(config *genesisconfig.Profile, channelID string, outputBlock string) error {????pgen := provisional.New(config) //構建Generator執行個體????genesisBlock := pgen.GenesisBlockForChannel(channelID) //產生創世區塊????err := ioutil.WriteFile(outputBlock, utils.MarshalOrPanic(genesisBlock), 0644) //創世區塊寫入檔案????return nil}//代碼在common/configtx/tool/configtxgen/main.go
genesis更詳細內容,參考:Fabric 1.0原始碼筆記 之 configtx(配置交易) #genesis(系統通道創世區塊)
5.3、doOutputChannelCreateTx(產生建立應用通道的配置交易)
func doOutputChannelCreateTx(conf *genesisconfig.Profile, channelID string, outputChannelCreateTx string) error {????var orgNames []string????for _, org := range conf.Application.Organizations {????????orgNames = append(orgNames, org.Name)????}????configtx, err := configtx.MakeChainCreationTransaction(channelID, conf.Consortium, nil, orgNames...)????err = ioutil.WriteFile(outputChannelCreateTx, utils.MarshalOrPanic(configtx), 0644)????return nil}//代碼在common/configtx/tool/configtxgen/main.go
5.4、doOutputAnchorPeersUpdate(產生錨節點配置更新檔案)
func doOutputAnchorPeersUpdate(conf *genesisconfig.Profile, channelID string, outputAnchorPeersUpdate string, asOrg string) error {????var org *genesisconfig.Organization????for _, iorg := range conf.Application.Organizations {????????if iorg.Name == asOrg {????????????org = iorg????????}????}????anchorPeers := make([]*pb.AnchorPeer, len(org.AnchorPeers))????for i, anchorPeer := range org.AnchorPeers {????????anchorPeers[i] = &pb.AnchorPeer{????????????Host: anchorPeer.Host,????????????Port: int32(anchorPeer.Port),????????}????}????configGroup := config.TemplateAnchorPeers(org.Name, anchorPeers)????configGroup.Groups[config.ApplicationGroupKey].Groups[org.Name].Values[config.AnchorPeersKey].ModPolicy = mspconfig.AdminsPolicyKey????configUpdate := &cb.ConfigUpdate{????????ChannelId: channelID,????????WriteSet: configGroup,????????ReadSet: cb.NewConfigGroup(),????}????configUpdate.ReadSet.Groups[config.ApplicationGroupKey] = cb.NewConfigGroup()????configUpdate.ReadSet.Groups[config.ApplicationGroupKey].Version = 1????configUpdate.ReadSet.Groups[config.ApplicationGroupKey].ModPolicy = mspconfig.AdminsPolicyKey????configUpdate.ReadSet.Groups[config.ApplicationGroupKey].Groups[org.Name] = cb.NewConfigGroup()????configUpdate.ReadSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Values[config.MSPKey] = &cb.ConfigValue{}????configUpdate.ReadSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Policies[mspconfig.ReadersPolicyKey] = &cb.ConfigPolicy{}????configUpdate.ReadSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Policies[mspconfig.WritersPolicyKey] = &cb.ConfigPolicy{}????configUpdate.ReadSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Policies[mspconfig.AdminsPolicyKey] = &cb.ConfigPolicy{}????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].Version = 1????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].ModPolicy = mspconfig.AdminsPolicyKey????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Version = 1????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].Groups[org.Name].ModPolicy = mspconfig.AdminsPolicyKey????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Values[config.MSPKey] = &cb.ConfigValue{}????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Policies[mspconfig.ReadersPolicyKey] = &cb.ConfigPolicy{}????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Policies[mspconfig.WritersPolicyKey] = &cb.ConfigPolicy{}????configUpdate.WriteSet.Groups[config.ApplicationGroupKey].Groups[org.Name].Policies[mspconfig.AdminsPolicyKey] = &cb.ConfigPolicy{}????configUpdateEnvelope := &cb.ConfigUpdateEnvelope{????????ConfigUpdate: utils.MarshalOrPanic(configUpdate),????}????update := &cb.Envelope{????????Payload: utils.MarshalOrPanic(&cb.Payload{????????????Header: &cb.Header{????????????????ChannelHeader: utils.MarshalOrPanic(&cb.ChannelHeader{????????????????????ChannelId: channelID,????????????????????Type: int32(cb.HeaderType_CONFIG_UPDATE),????????????????}),????????????},????????????Data: utils.MarshalOrPanic(configUpdateEnvelope),????????}),????}????err := ioutil.WriteFile(outputAnchorPeersUpdate, utils.MarshalOrPanic(update), 0644)????return nil}//代碼在common/configtx/tool/configtxgen/main.go
歡迎繼續關注兄弟連區塊鏈教程分享!
區塊鏈教程Fabric1.0原始碼分析配置交易-產生通道配置二