區塊鏈教程Fabric1.0源代碼分析配置交易-生成通道配置二
阿新 • • 發佈:2018-10-30
class def main函數 amp solo inspect like load dset 區塊鏈教程Fabric1.0源代碼分析配置交易-生成通道配置二。Generator接口實現,即bootstrapper。
type bootstrapper struct { ????channelGroups []*cb.ConfigGroup ????ordererGroups []*cb.ConfigGroup ????applicationGroups []*cb.ConfigGroup ????consortiumsGroups []*cb.ConfigGroup } func New(conf *genesisconfig.Profile) Generator func (bs *bootstrapper) ChannelTemplate() configtx.Template func (bs *bootstrapper) GenesisBlock() *cb.Block func (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源代碼分析配置交易-生成通道配置二