diff --git a/Makefile b/Makefile index 6bd26c25b0a..0281c894e7d 100644 --- a/Makefile +++ b/Makefile @@ -179,10 +179,12 @@ build/image/peer/payload: build/docker/bin/peer \ build/genesis-sampleconfig.tar.bz2 build/image/orderer/payload: build/docker/bin/orderer \ build/msp-sampleconfig.tar.bz2 \ - orderer/orderer.yaml + orderer/orderer.yaml \ + orderer/genesis.yaml build/image/testenv/payload: build/gotools.tar.bz2 \ build/docker/bin/orderer \ orderer/orderer.yaml \ + orderer/genesis.yaml \ build/docker/bin/peer \ peer/core.yaml \ build/msp-sampleconfig.tar.bz2 \ diff --git a/images/orderer/Dockerfile.in b/images/orderer/Dockerfile.in index 4876843bccf..dda6136a703 100644 --- a/images/orderer/Dockerfile.in +++ b/images/orderer/Dockerfile.in @@ -4,5 +4,6 @@ RUN mkdir -p /var/hyperledger/production /etc/hyperledger/fabric/orderer COPY payload/orderer /usr/local/bin ADD payload/msp-sampleconfig.tar.bz2 $ORDERER_CFG_PATH/../ COPY payload/orderer.yaml $ORDERER_CFG_PATH/ +COPY payload/genesis.yaml $ORDERER_CFG_PATH/ EXPOSE 7050 CMD orderer diff --git a/images/testenv/Dockerfile.in b/images/testenv/Dockerfile.in index 5ff67ea75c6..4d527dd23e3 100644 --- a/images/testenv/Dockerfile.in +++ b/images/testenv/Dockerfile.in @@ -15,6 +15,7 @@ ADD payload/gotools.tar.bz2 /usr/local/bin/ # fabric configuration files COPY payload/orderer.yaml $ORDERER_CFG_PATH +COPY payload/genesis.yaml $ORDERER_CFG_PATH COPY payload/core.yaml $PEER_CFG_PATH ADD payload/msp-sampleconfig.tar.bz2 $PEER_CFG_PATH diff --git a/orderer/common/bootstrap/provisional/provisional.go b/orderer/common/bootstrap/provisional/provisional.go index 611376ee692..31b2ec6bcd3 100644 --- a/orderer/common/bootstrap/provisional/provisional.go +++ b/orderer/common/bootstrap/provisional/provisional.go @@ -65,22 +65,22 @@ type bootstrapper struct { } // New returns a new provisional bootstrap helper. -func New(conf *config.TopLevel) Generator { +func New(conf *config.GenesisTopLevel) Generator { bs := &bootstrapper{ minimalGroups: []*cb.ConfigGroup{ // Chain Config Types configtxchannel.DefaultHashingAlgorithm(), configtxchannel.DefaultBlockDataHashingStructure(), - configtxchannel.TemplateOrdererAddresses([]string{fmt.Sprintf("%s:%d", conf.General.ListenAddress, conf.General.ListenPort)}), + configtxchannel.TemplateOrdererAddresses(conf.Orderer.Addresses), // Orderer Config Types - configtxorderer.TemplateConsensusType(conf.Genesis.OrdererType), + configtxorderer.TemplateConsensusType(conf.Orderer.OrdererType), configtxorderer.TemplateBatchSize(&ab.BatchSize{ - MaxMessageCount: conf.Genesis.BatchSize.MaxMessageCount, - AbsoluteMaxBytes: conf.Genesis.BatchSize.AbsoluteMaxBytes, - PreferredMaxBytes: conf.Genesis.BatchSize.PreferredMaxBytes, + MaxMessageCount: conf.Orderer.BatchSize.MaxMessageCount, + AbsoluteMaxBytes: conf.Orderer.BatchSize.AbsoluteMaxBytes, + PreferredMaxBytes: conf.Orderer.BatchSize.PreferredMaxBytes, }), - configtxorderer.TemplateBatchTimeout(conf.Genesis.BatchTimeout.String()), + configtxorderer.TemplateBatchTimeout(conf.Orderer.BatchTimeout.String()), configtxorderer.TemplateIngressPolicyNames([]string{AcceptAllPolicyKey}), configtxorderer.TemplateEgressPolicyNames([]string{AcceptAllPolicyKey}), @@ -94,12 +94,12 @@ func New(conf *config.TopLevel) Generator { }, } - switch conf.Genesis.OrdererType { + switch conf.Orderer.OrdererType { case ConsensusTypeSolo, ConsensusTypeSbft: case ConsensusTypeKafka: - bs.minimalGroups = append(bs.minimalGroups, configtxorderer.TemplateKafkaBrokers(conf.Kafka.Brokers)) + bs.minimalGroups = append(bs.minimalGroups, configtxorderer.TemplateKafkaBrokers(conf.Orderer.Kafka.Brokers)) default: - panic(fmt.Errorf("Wrong consenter type value given: %s", conf.Genesis.OrdererType)) + panic(fmt.Errorf("Wrong consenter type value given: %s", conf.Orderer.OrdererType)) } return bs diff --git a/orderer/common/bootstrap/provisional/provisional_test.go b/orderer/common/bootstrap/provisional/provisional_test.go index 65b34903ff3..296c2b56ff3 100644 --- a/orderer/common/bootstrap/provisional/provisional_test.go +++ b/orderer/common/bootstrap/provisional/provisional_test.go @@ -24,14 +24,14 @@ import ( cb "github.com/hyperledger/fabric/protos/common" ) -var confSolo, confKafka *config.TopLevel -var testCases []*config.TopLevel +var confSolo, confKafka *config.GenesisTopLevel +var testCases []*config.GenesisTopLevel func init() { - confSolo = config.Load() - confKafka = config.Load() - confKafka.Genesis.OrdererType = ConsensusTypeKafka - testCases = []*config.TopLevel{confSolo, confKafka} + confSolo = config.LoadGenesis() + confKafka = config.LoadGenesis() + confKafka.Orderer.OrdererType = ConsensusTypeKafka + testCases = []*config.GenesisTopLevel{confSolo, confKafka} } func TestGenesisBlockHeader(t *testing.T) { @@ -40,10 +40,10 @@ func TestGenesisBlockHeader(t *testing.T) { for _, tc := range testCases { genesisBlock := New(tc).GenesisBlock() if genesisBlock.Header.Number != expectedHeaderNumber { - t.Fatalf("Case %s: Expected header number %d, got %d", tc.Genesis.OrdererType, expectedHeaderNumber, genesisBlock.Header.Number) + t.Fatalf("Case %s: Expected header number %d, got %d", tc.Orderer.OrdererType, expectedHeaderNumber, genesisBlock.Header.Number) } if !bytes.Equal(genesisBlock.Header.PreviousHash, nil) { - t.Fatalf("Case %s: Expected header previousHash to be nil, got %x", tc.Genesis.OrdererType, genesisBlock.Header.PreviousHash) + t.Fatalf("Case %s: Expected header previousHash to be nil, got %x", tc.Orderer.OrdererType, genesisBlock.Header.PreviousHash) } } } diff --git a/orderer/common/deliver/deliver_test.go b/orderer/common/deliver/deliver_test.go index 0827378b1d3..44a0b7a520e 100644 --- a/orderer/common/deliver/deliver_test.go +++ b/orderer/common/deliver/deliver_test.go @@ -44,7 +44,7 @@ const ledgerSize = 10 func init() { logging.SetLevel(logging.DEBUG, "") - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() } type mockD struct { diff --git a/orderer/genesis.yaml b/orderer/genesis.yaml new file mode 100644 index 00000000000..1f627afdbe7 --- /dev/null +++ b/orderer/genesis.yaml @@ -0,0 +1,42 @@ +--- +################################################################################ +# +# SECTION: Orderer +# +# - This section defines the values to encode into a config transaction or +# genesis block for orderer related parameters +# +################################################################################ +Orderer: + + # Orderer Type: The orderer implementation to start + # Available types are "solo" and "kafka" + OrdererType: solo + + Addresses: + - 127.0.0.1:7050 + + # Batch Timeout: The amount of time to wait before creating a batch + BatchTimeout: 10s + + # Batch Size: Controls the number of messages batched into a block + BatchSize: + + # Max Message Count: The maximum number of messages to permit in a batch + MaxMessageCount: 10 + + # Absolute Max Bytes: The absolute maximum number of bytes allowed for + # the serialized messages in a batch. + AbsoluteMaxBytes: 99 MB + + # Preferred Max Bytes: The preferred maximum number of bytes allowed for + # the serialized messages in a batch. A message larger than the preferred + # max bytes will result in a batch larger than preferred max bytes. + PreferredMaxBytes: 512 KB + + Kafka: + # Brokers: A list of Kafka brokers to which the orderer connects + # NOTE: Use IP:port notation + Brokers: + - 127.0.0.1:9092 + diff --git a/orderer/kafka/config_test.go b/orderer/kafka/config_test.go index b3367d04fa0..9cb51f2206f 100644 --- a/orderer/kafka/config_test.go +++ b/orderer/kafka/config_test.go @@ -38,14 +38,6 @@ var ( ) var testConf = &config.TopLevel{ - General: config.General{ - LedgerType: "ram", - QueueSize: 100, - MaxWindowSize: 100, - ListenAddress: "127.0.0.1", - ListenPort: 7050, - GenesisMethod: "provisional", - }, Kafka: config.Kafka{ Brokers: []string{"127.0.0.1:9092"}, Retry: config.Retry{ @@ -55,15 +47,6 @@ var testConf = &config.TopLevel{ Verbose: false, Version: sarama.V0_9_0_1, }, - Genesis: config.Genesis{ - OrdererType: "kafka", - BatchTimeout: 500 * time.Millisecond, - BatchSize: config.BatchSize{ - MaxMessageCount: 100, - AbsoluteMaxBytes: 10 * 1024 * 1024, - PreferredMaxBytes: 512 * 1024, - }, - }, } func testClose(t *testing.T, x Closeable) { diff --git a/orderer/ledger/file/fileledger_test.go b/orderer/ledger/file/fileledger_test.go index b17bd992694..1558b6f2ef1 100644 --- a/orderer/ledger/file/fileledger_test.go +++ b/orderer/ledger/file/fileledger_test.go @@ -35,7 +35,7 @@ var genesisBlock *cb.Block func init() { logging.SetLevel(logging.DEBUG, "") - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() } type testEnv struct { diff --git a/orderer/ledger/fileledger_test.go b/orderer/ledger/fileledger_test.go index 377921d6eb7..a9f33a91459 100644 --- a/orderer/ledger/fileledger_test.go +++ b/orderer/ledger/fileledger_test.go @@ -30,7 +30,7 @@ import ( var genesisBlock *cb.Block func init() { - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() testables = append(testables, &fileLedgerTestEnv{}) } diff --git a/orderer/ledger/ram/ramledger_test.go b/orderer/ledger/ram/ramledger_test.go index 54d27e9a290..60e64619eca 100644 --- a/orderer/ledger/ram/ramledger_test.go +++ b/orderer/ledger/ram/ramledger_test.go @@ -30,7 +30,7 @@ var genesisBlock *cb.Block func init() { logging.SetLevel(logging.DEBUG, "") - genesisBlock = provisional.New(config.Load()).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() } func NewTestChain(maxSize int) *ramLedger { diff --git a/orderer/localconfig/config.go b/orderer/localconfig/config.go index 4841bccc0d7..ca50d375052 100644 --- a/orderer/localconfig/config.go +++ b/orderer/localconfig/config.go @@ -62,12 +62,28 @@ type TLS struct { ClientRootCAs []string } -// Genesis contains config which is used by the provisional bootstrapper +// Genesis is a deprecated structure which was used to put +// values into the genesis block, but this is now handled elsewhere +// SBFT did not reference these values via the genesis block however +// so it is being left here for backwards compatibility purposes type Genesis struct { + DeprecatedBatchTimeout time.Duration + DeprecatedBatchSize uint32 + SbftShared SbftShared +} + +// GenesisTopLevel contains the genesis structures for use by the provisional bootstrapper +type GenesisTopLevel struct { + Orderer Orderer +} + +// Orderer contains config which is used for orderer genesis by the provisional bootstrapper +type Orderer struct { OrdererType string + Addresses []string BatchTimeout time.Duration BatchSize BatchSize - SbftShared SbftShared + Kafka Kafka } // BatchSize contains configuration affecting the size of batches @@ -96,7 +112,7 @@ type FileLedger struct { // Kafka contains config for the Kafka orderer type Kafka struct { - Brokers []string // TODO This should be deprecated and this information should be stored in the config block + Brokers []string // TODO This should be removed when the genesis config moves Retry Retry Verbose bool Version sarama.KafkaVersion @@ -125,6 +141,11 @@ type Retry struct { Stop time.Duration } +type RuntimeAndGenesis struct { + runtime *TopLevel + genesis *Genesis +} + // TopLevel directly corresponds to the orderer config yaml // Note, for non 1-1 mappings, you may append // something like `mapstructure:"weirdFoRMat"` to @@ -175,13 +196,6 @@ var defaults = TopLevel{ }, }, Genesis: Genesis{ - OrdererType: "solo", - BatchTimeout: 10 * time.Second, - BatchSize: BatchSize{ - MaxMessageCount: 10, - AbsoluteMaxBytes: 100000000, - PreferredMaxBytes: 512 * 1024, - }, SbftShared: SbftShared{ N: 1, F: 0, @@ -242,30 +256,12 @@ func (c *TopLevel) completeInitialization() { case c.FileLedger.Prefix == "": logger.Infof("FileLedger.Prefix unset, setting to %s", defaults.FileLedger.Prefix) c.FileLedger.Prefix = defaults.FileLedger.Prefix - case c.Kafka.Brokers == nil: - logger.Infof("Kafka.Brokers unset, setting to %v", defaults.Kafka.Brokers) - c.Kafka.Brokers = defaults.Kafka.Brokers case c.Kafka.Retry.Period == 0*time.Second: logger.Infof("Kafka.Retry.Period unset, setting to %v", defaults.Kafka.Retry.Period) c.Kafka.Retry.Period = defaults.Kafka.Retry.Period case c.Kafka.Retry.Stop == 0*time.Second: logger.Infof("Kafka.Retry.Stop unset, setting to %v", defaults.Kafka.Retry.Stop) c.Kafka.Retry.Stop = defaults.Kafka.Retry.Stop - case c.Genesis.OrdererType == "": - logger.Infof("Genesis.OrdererType unset, setting to %s", defaults.Genesis.OrdererType) - c.Genesis.OrdererType = defaults.Genesis.OrdererType - case c.Genesis.BatchTimeout == 0: - logger.Infof("Genesis.BatchTimeout unset, setting to %s", defaults.Genesis.BatchTimeout) - c.Genesis.BatchTimeout = defaults.Genesis.BatchTimeout - case c.Genesis.BatchSize.MaxMessageCount == 0: - logger.Infof("Genesis.BatchSize.MaxMessageCount unset, setting to %s", defaults.Genesis.BatchSize.MaxMessageCount) - c.Genesis.BatchSize.MaxMessageCount = defaults.Genesis.BatchSize.MaxMessageCount - case c.Genesis.BatchSize.AbsoluteMaxBytes == 0: - logger.Infof("Genesis.BatchSize.AbsoluteMaxBytes unset, setting to %s", defaults.Genesis.BatchSize.AbsoluteMaxBytes) - c.Genesis.BatchSize.AbsoluteMaxBytes = defaults.Genesis.BatchSize.AbsoluteMaxBytes - case c.Genesis.BatchSize.PreferredMaxBytes == 0: - logger.Infof("Genesis.BatchSize.PreferredMaxBytes unset, setting to %s", defaults.Genesis.BatchSize.PreferredMaxBytes) - c.Genesis.BatchSize.PreferredMaxBytes = defaults.Genesis.BatchSize.PreferredMaxBytes default: // A bit hacky, but its type makes it impossible to test for a nil value. // This may be overwritten by the Kafka orderer upon instantiation. @@ -275,6 +271,103 @@ func (c *TopLevel) completeInitialization() { } } +var genesisDefaults = GenesisTopLevel{ + Orderer: Orderer{ + OrdererType: "solo", + Addresses: []string{"127.0.0.1:7050"}, + BatchTimeout: 10 * time.Second, + BatchSize: BatchSize{ + MaxMessageCount: 10, + AbsoluteMaxBytes: 100000000, + PreferredMaxBytes: 512 * 1024, + }, + Kafka: Kafka{ + Brokers: []string{"127.0.0.1:9092"}, + }, + }, +} + +func (g *GenesisTopLevel) completeInitialization() { + for { + switch { + case g.Orderer.OrdererType == "": + logger.Infof("Orderer.OrdererType unset, setting to %s", genesisDefaults.Orderer.OrdererType) + g.Orderer.OrdererType = genesisDefaults.Orderer.OrdererType + case g.Orderer.Addresses == nil: + logger.Infof("Orderer.Addresses unset, setting to %s", genesisDefaults.Orderer.Addresses) + g.Orderer.Addresses = genesisDefaults.Orderer.Addresses + case g.Orderer.BatchTimeout == 0: + logger.Infof("Orderer.BatchTimeout unset, setting to %s", genesisDefaults.Orderer.BatchTimeout) + g.Orderer.BatchTimeout = genesisDefaults.Orderer.BatchTimeout + case g.Orderer.BatchTimeout == 0: + logger.Infof("Orderer.BatchTimeout unset, setting to %s", genesisDefaults.Orderer.BatchTimeout) + g.Orderer.BatchTimeout = genesisDefaults.Orderer.BatchTimeout + case g.Orderer.BatchSize.MaxMessageCount == 0: + logger.Infof("Orderer.BatchSize.MaxMessageCount unset, setting to %s", genesisDefaults.Orderer.BatchSize.MaxMessageCount) + g.Orderer.BatchSize.MaxMessageCount = genesisDefaults.Orderer.BatchSize.MaxMessageCount + case g.Orderer.BatchSize.AbsoluteMaxBytes == 0: + logger.Infof("Orderer.BatchSize.AbsoluteMaxBytes unset, setting to %s", genesisDefaults.Orderer.BatchSize.AbsoluteMaxBytes) + g.Orderer.BatchSize.AbsoluteMaxBytes = genesisDefaults.Orderer.BatchSize.AbsoluteMaxBytes + case g.Orderer.BatchSize.PreferredMaxBytes == 0: + logger.Infof("Orderer.BatchSize.PreferredMaxBytes unset, setting to %s", genesisDefaults.Orderer.BatchSize.PreferredMaxBytes) + g.Orderer.BatchSize.PreferredMaxBytes = genesisDefaults.Orderer.BatchSize.PreferredMaxBytes + case g.Orderer.Kafka.Brokers == nil: + logger.Infof("Orderer.Kafka.Brokers unset, setting to %v", genesisDefaults.Orderer.Kafka.Brokers) + g.Orderer.Kafka.Brokers = genesisDefaults.Orderer.Kafka.Brokers + default: + return + } + } +} + +func LoadGenesis() *GenesisTopLevel { + config := viper.New() + + const prefix = "GENESIS" + + config.SetConfigName("genesis") + cfgPath := os.Getenv("ORDERER_CFG_PATH") + if cfgPath == "" { + logger.Infof("No orderer cfg path set, assuming development environment, deriving from go path") + // Path to look for the config file in based on GOPATH + gopath := os.Getenv("GOPATH") + for _, p := range filepath.SplitList(gopath) { + ordererPath := filepath.Join(p, "src/github.com/hyperledger/fabric/orderer/") + if _, err := os.Stat(filepath.Join(ordererPath, "genesis.yaml")); err != nil { + // The yaml file does not exist in this component of the go src + continue + } + cfgPath = ordererPath + } + if cfgPath == "" { + logger.Fatalf("Could not find orderer.yaml, try setting ORDERER_CFG_PATH or GOPATH correctly") + } + } + config.AddConfigPath(cfgPath) // Path to look for the config file in + + // for environment variables + config.SetEnvPrefix(prefix) + config.AutomaticEnv() + replacer := strings.NewReplacer(".", "_") + config.SetEnvKeyReplacer(replacer) + + err := config.ReadInConfig() + if err != nil { + panic(fmt.Errorf("Error reading %s plugin config: %s", prefix, err)) + } + + var uconf GenesisTopLevel + + err = ExactWithDateUnmarshal(config, &uconf) + if err != nil { + panic(fmt.Errorf("Error unmarshaling into structure: %s", err)) + } + + uconf.completeInitialization() + + return &uconf +} + // Load parses the orderer.yaml file and environment, producing a struct suitable for config use func Load() *TopLevel { config := viper.New() diff --git a/orderer/main.go b/orderer/main.go index b44245d8636..d25c2318550 100644 --- a/orderer/main.go +++ b/orderer/main.go @@ -114,7 +114,7 @@ func main() { // Select the bootstrapping mechanism switch conf.General.GenesisMethod { case "provisional": - genesisBlock = provisional.New(conf).GenesisBlock() + genesisBlock = provisional.New(config.LoadGenesis()).GenesisBlock() case "file": genesisBlock = file.New(conf.General.GenesisFile).GenesisBlock() default: @@ -165,8 +165,8 @@ func main() { func makeSbftConsensusConfig(conf *config.TopLevel) *sbft.ConsensusConfig { cfg := simplebft.Config{N: conf.Genesis.SbftShared.N, F: conf.Genesis.SbftShared.F, - BatchDurationNsec: uint64(conf.Genesis.BatchTimeout), - BatchSizeBytes: uint64(conf.Genesis.BatchSize.AbsoluteMaxBytes), + BatchDurationNsec: uint64(conf.Genesis.DeprecatedBatchTimeout), + BatchSizeBytes: uint64(conf.Genesis.DeprecatedBatchSize), RequestTimeoutNsec: conf.Genesis.SbftShared.RequestTimeoutNsec} peers := make(map[string][]byte) for addr, cert := range conf.Genesis.SbftShared.Peers { diff --git a/orderer/multichain/manager_test.go b/orderer/multichain/manager_test.go index 14c6f14fc6a..2d2a9e326a0 100644 --- a/orderer/multichain/manager_test.go +++ b/orderer/multichain/manager_test.go @@ -35,11 +35,11 @@ import ( "github.com/stretchr/testify/assert" ) -var conf *config.TopLevel +var conf *config.GenesisTopLevel var genesisBlock *cb.Block func init() { - conf = config.Load() + conf = config.LoadGenesis() logging.SetLevel(logging.DEBUG, "") genesisBlock = provisional.New(conf).GenesisBlock() } @@ -127,7 +127,7 @@ func TestNoSystemChain(t *testing.T) { lf := ramledger.New(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} NewManagerImpl(lf, consenters, &mockCryptoHelper{}) } @@ -137,7 +137,7 @@ func TestManagerImpl(t *testing.T) { lf, rl := NewRAMLedgerAndFactory(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} manager := NewManagerImpl(lf, consenters, &mockCryptoHelper{}) @@ -152,8 +152,8 @@ func TestManagerImpl(t *testing.T) { t.Fatalf("Should have gotten chain which was initialized by ramledger") } - messages := make([]*cb.Envelope, conf.Genesis.BatchSize.MaxMessageCount) - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + messages := make([]*cb.Envelope, conf.Orderer.BatchSize.MaxMessageCount) + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { messages[i] = makeNormalTx(provisional.TestChainID, i) } @@ -168,7 +168,7 @@ func TestManagerImpl(t *testing.T) { if status != cb.Status_SUCCESS { t.Fatalf("Could not retrieve block") } - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { if !reflect.DeepEqual(utils.ExtractEnvelopeOrPanic(block, i), messages[i]) { t.Errorf("Block contents wrong at index %d", i) } @@ -183,7 +183,7 @@ func TestSignatureFilter(t *testing.T) { lf, rl := NewRAMLedgerAndFactory(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} manager := NewManagerImpl(lf, consenters, &mockCryptoHelper{}) @@ -193,8 +193,8 @@ func TestSignatureFilter(t *testing.T) { t.Fatalf("Should have gotten chain which was initialized by ramledger") } - messages := make([]*cb.Envelope, conf.Genesis.BatchSize.MaxMessageCount) - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + messages := make([]*cb.Envelope, conf.Orderer.BatchSize.MaxMessageCount) + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { messages[i] = makeSignaturelessTx(provisional.TestChainID, i) } @@ -217,11 +217,11 @@ func TestSignatureFilter(t *testing.T) { // This test brings up the entire system, with the mock consenter, including the broadcasters etc. and creates a new chain func TestNewChain(t *testing.T) { - conf := config.Load() + conf := config.LoadGenesis() lf, rl := NewRAMLedgerAndFactory(10) consenters := make(map[string]Consenter) - consenters[conf.Genesis.OrdererType] = &mockConsenter{} + consenters[conf.Orderer.OrdererType] = &mockConsenter{} manager := NewManagerImpl(lf, consenters, &mockCryptoHelper{}) @@ -267,8 +267,8 @@ func TestNewChain(t *testing.T) { t.Fatalf("Should have gotten new chain which was created") } - messages := make([]*cb.Envelope, conf.Genesis.BatchSize.MaxMessageCount) - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + messages := make([]*cb.Envelope, conf.Orderer.BatchSize.MaxMessageCount) + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { messages[i] = makeNormalTx(newChainID, i) } @@ -300,7 +300,7 @@ func TestNewChain(t *testing.T) { if status != cb.Status_SUCCESS { t.Fatalf("Could not retrieve block on new chain") } - for i := 0; i < int(conf.Genesis.BatchSize.MaxMessageCount); i++ { + for i := 0; i < int(conf.Orderer.BatchSize.MaxMessageCount); i++ { if !reflect.DeepEqual(utils.ExtractEnvelopeOrPanic(block, i), messages[i]) { t.Errorf("Block contents wrong at index %d in new chain", i) } diff --git a/orderer/network_test.go b/orderer/network_test.go index 7ccad154c38..bcfd5c21283 100644 --- a/orderer/network_test.go +++ b/orderer/network_test.go @@ -306,9 +306,9 @@ func generateConfigEnv(peerNum uint64, grpcPort int, peerCommPort string, certFi envs := []string{} envs = append(envs, fmt.Sprintf("ORDERER_CFG_PATH=%s", ordererDir)) envs = append(envs, fmt.Sprintf("ORDERER_GENERAL_LISTENPORT=%d", grpcPort)) - envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_ORDERERTYPE=%s", "sbft")) - envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_BATCHTIMEOUT=%d", 1000)) - envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_BATCHSIZE_ABSOLUTEMAXBYTES=%d", 1000000000)) + envs = append(envs, fmt.Sprintf("GENESIS_ORDERER_ORDERERTYPE=%s", "sbft")) + envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_DEPRECATEDBATCHTIMEOUT=%d", 1000)) + envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_DEPRECATED=%d", 1000000000)) envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_SBFTSHARED_REQUESTTIMEOUTNSEC=%d", 1000000000)) envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_SBFTSHARED_N=%d", peerNum)) envs = append(envs, fmt.Sprintf("ORDERER_GENESIS_SBFTSHARED_F=%d", (peerNum-1)/3)) diff --git a/orderer/orderer.yaml b/orderer/orderer.yaml index 2db34accf9a..b3907b68be0 100644 --- a/orderer/orderer.yaml +++ b/orderer/orderer.yaml @@ -153,32 +153,17 @@ SbftLocal: # # SECTION: Genesis # -# - This section applies to the configuration for the provisional bootstrapper +# - This section is pending removal but is left to support Sbft +# to be migrated to genesis.yaml # ################################################################################ Genesis: + # Deprecated Batch Timeout: The amount of time to wait before creating a batch + DeprecatedBatchTimeout: 10s - # Orderer Type: The orderer implementation to start - # Available types are "solo" and "kafka" - OrdererType: solo - - # Batch Timeout: The amount of time to wait before creating a batch - BatchTimeout: 10s - - # Batch Size: Controls the number of messages batched into a block - BatchSize: - - # Max Message Count: The maximum number of messages to permit in a batch - MaxMessageCount: 10 - - # Absolute Max Bytes: The absolute maximum number of bytes allowed for - # the serialized messages in a batch. - AbsoluteMaxBytes: 99 MB - - # Preferred Max Bytes: The preferred maximum number of bytes allowed for - # the serialized messages in a batch. A message larger than the preferred - # max bytes will result in a batch larger than preferred max bytes. - PreferredMaxBytes: 512 KB + # DeprecatedBatchSize: The absolute maximum number of bytes allowed for + # the serialized messages in a batch. + DeprecatedBatchSize: 99 MB # Defines the SBFT parameters when 'sbft' is specified as the 'OrdererType' SbftShared: diff --git a/orderer/sample_clients/broadcast_config/client.go b/orderer/sample_clients/broadcast_config/client.go index 96ddb70021f..3e8a039acb9 100644 --- a/orderer/sample_clients/broadcast_config/client.go +++ b/orderer/sample_clients/broadcast_config/client.go @@ -29,6 +29,7 @@ import ( ) var conf *config.TopLevel +var genConf *config.GenesisTopLevel type broadcastClient struct { ab.AtomicBroadcast_BroadcastClient @@ -67,6 +68,7 @@ type argsImpl struct { func init() { conf = config.Load() + genConf = config.LoadGenesis() } func main() { @@ -75,7 +77,7 @@ func main() { flag.StringVar(&srv, "server", fmt.Sprintf("%s:%d", conf.General.ListenAddress, conf.General.ListenPort), "The RPC server to connect to.") flag.StringVar(&cmd.name, "cmd", "newChain", "The action that this client is requesting via the config transaction.") - flag.StringVar(&cmd.args.consensusType, "consensusType", conf.Genesis.OrdererType, "In case of a newChain command, the type of consensus the ordering service is running on.") + flag.StringVar(&cmd.args.consensusType, "consensusType", genConf.Orderer.OrdererType, "In case of a newChain command, the type of consensus the ordering service is running on.") flag.StringVar(&cmd.args.creationPolicy, "creationPolicy", "AcceptAllPolicy", "In case of a newChain command, the chain creation policy this request should be validated against.") flag.StringVar(&cmd.args.chainID, "chainID", "NewChannelId", "In case of a newChain command, the chain ID to create.") flag.Parse() diff --git a/orderer/sample_clients/broadcast_config/newchain.go b/orderer/sample_clients/broadcast_config/newchain.go index b40004f4b37..e826d55cecf 100644 --- a/orderer/sample_clients/broadcast_config/newchain.go +++ b/orderer/sample_clients/broadcast_config/newchain.go @@ -24,8 +24,8 @@ import ( ) func newChainRequest(consensusType, creationPolicy, newChannelId string) *cb.Envelope { - conf.Genesis.OrdererType = consensusType - generator := provisional.New(conf) + genConf.Orderer.OrdererType = consensusType + generator := provisional.New(genConf) channelTemplate := generator.ChannelTemplate() signer, err := msp.NewNoopMsp().GetDefaultSigningIdentity() diff --git a/orderer/sbft_test.go b/orderer/sbft_test.go index dc4b7870278..d7946540f7f 100644 --- a/orderer/sbft_test.go +++ b/orderer/sbft_test.go @@ -99,9 +99,10 @@ func TestSbftPeer(t *testing.T) { // Start GRPC logger.Info("Creating a GRPC server.") conf := config.Load() - conf.Genesis.OrdererType = sbftName + genConf := config.LoadGenesis() + genConf.Orderer.OrdererType = sbftName conf.General.LocalMSPDir = pwd + "/../msp/sampleconfig" - lf := newRAMLedgerFactory(conf) + lf := newRAMLedgerFactory(genConf) consenters := make(map[string]multichain.Consenter) consenters[sbftName] = sbftConsenter @@ -261,7 +262,7 @@ func broadcastSender(t *testing.T, resultch chan item, errorch chan error, clien resultch <- item{itemtype: sent, payload: mpl} } -func newRAMLedgerFactory(conf *config.TopLevel) ordererledger.Factory { +func newRAMLedgerFactory(conf *config.GenesisTopLevel) ordererledger.Factory { rlf := ramledger.New(10) genesisBlock := provisional.New(conf).GenesisBlock() rl, err := rlf.GetOrCreate(provisional.TestChainID)