Skip to content

Commit c53d2e0

Browse files
author
Jason Yellick
committed
[FAB-1614] Provisional bootstrapper to templates
https://jira.hyperledger.org/browse/FAB-1614 This changeset converts the orderer provisional bootstrapper to use the new configtx.Template mechanism. This is a precursor to removing the duplicate genesis code from protos/utils. Change-Id: I47ca9a9c8bcfab2b4eeff5b40b84da71a0230a08 Signed-off-by: Jason Yellick <[email protected]>
1 parent 47c182f commit c53d2e0

File tree

5 files changed

+150
-66
lines changed

5 files changed

+150
-66
lines changed

common/genesis/genesis.go

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
Copyright IBM Corp. 2016 All Rights Reserved.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package genesis
18+
19+
import (
20+
"github.com/hyperledger/fabric/common/configtx"
21+
cb "github.com/hyperledger/fabric/protos/common"
22+
"github.com/hyperledger/fabric/protos/utils"
23+
)
24+
25+
const (
26+
msgVersion = int32(1)
27+
28+
// These values are fixed for the genesis block.
29+
lastModified = 0
30+
epoch = 0
31+
)
32+
33+
type Factory interface {
34+
Block(chainID string) (*cb.Block, error)
35+
}
36+
37+
type factory struct {
38+
template configtx.Template
39+
}
40+
41+
func NewFactoryImpl(template configtx.Template) Factory {
42+
return &factory{template: template}
43+
}
44+
45+
func (f *factory) Block(chainID string) (*cb.Block, error) {
46+
items, err := f.template.Items(chainID)
47+
if err != nil {
48+
return nil, err
49+
}
50+
51+
payloadChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_TRANSACTION, msgVersion, chainID, epoch)
52+
payloadSignatureHeader := utils.MakeSignatureHeader(nil, utils.CreateNonceOrPanic())
53+
payloadHeader := utils.MakePayloadHeader(payloadChainHeader, payloadSignatureHeader)
54+
payload := &cb.Payload{Header: payloadHeader, Data: utils.MarshalOrPanic(&cb.ConfigurationEnvelope{Items: items})}
55+
envelope := &cb.Envelope{Payload: utils.MarshalOrPanic(payload), Signature: nil}
56+
57+
block := cb.NewBlock(0, nil)
58+
block.Data = &cb.BlockData{Data: [][]byte{utils.MarshalOrPanic(envelope)}}
59+
block.Header.DataHash = block.Data.Hash()
60+
block.Metadata.Metadata[cb.BlockMetadataIndex_LAST_CONFIGURATION] = utils.MarshalOrPanic(&cb.Metadata{
61+
Value: utils.MarshalOrPanic(&cb.LastConfiguration{Index: 0}),
62+
})
63+
return block, nil
64+
}

common/genesis/genesis_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
Copyright IBM Corp. 2016 All Rights Reserved.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package genesis
18+
19+
import (
20+
"testing"
21+
22+
"github.com/hyperledger/fabric/common/configtx"
23+
cb "github.com/hyperledger/fabric/protos/common"
24+
)
25+
26+
func TestSanity(t *testing.T) {
27+
impl := NewFactoryImpl(configtx.NewSimpleTemplate(&cb.ConfigurationItem{}))
28+
_, err := impl.Block("TestChainID")
29+
if err != nil {
30+
t.Fatalf("Basic sanity fails")
31+
}
32+
}

orderer/common/bootstrap/provisional/item.go

+18-27
Original file line numberDiff line numberDiff line change
@@ -25,93 +25,84 @@ import (
2525
"github.com/hyperledger/fabric/protos/utils"
2626
)
2727

28-
func (cbs *commonBootstrapper) encodeConsensusType() *cb.SignedConfigurationItem {
28+
func (cbs *commonBootstrapper) encodeConsensusType() *cb.ConfigurationItem {
2929
configItemKey := sharedconfig.ConsensusTypeKey
3030
configItemValue := utils.MarshalOrPanic(&ab.ConsensusType{Type: cbs.consensusType})
3131
modPolicy := configtx.DefaultModificationPolicyID
3232

3333
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
34-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
35-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
34+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
3635
}
3736

38-
func (cbs *commonBootstrapper) encodeBatchSize() *cb.SignedConfigurationItem {
37+
func (cbs *commonBootstrapper) encodeBatchSize() *cb.ConfigurationItem {
3938
configItemKey := sharedconfig.BatchSizeKey
4039
configItemValue := utils.MarshalOrPanic(cbs.batchSize)
4140
modPolicy := configtx.DefaultModificationPolicyID
4241

4342
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
44-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
45-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
43+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
4644
}
4745

48-
func (cbs *commonBootstrapper) encodeBatchTimeout() *cb.SignedConfigurationItem {
46+
func (cbs *commonBootstrapper) encodeBatchTimeout() *cb.ConfigurationItem {
4947
configItemKey := sharedconfig.BatchTimeoutKey
5048
configItemValue := utils.MarshalOrPanic(&ab.BatchTimeout{Timeout: cbs.batchTimeout})
5149
modPolicy := configtx.DefaultModificationPolicyID
5250

5351
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
54-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
55-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
52+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
5653
}
5754

58-
func (cbs *commonBootstrapper) encodeChainCreators() *cb.SignedConfigurationItem {
55+
func (cbs *commonBootstrapper) encodeChainCreators() *cb.ConfigurationItem {
5956
configItemKey := sharedconfig.ChainCreatorsKey
6057
configItemValue := utils.MarshalOrPanic(&ab.ChainCreators{Policies: DefaultChainCreators})
6158
modPolicy := configtx.DefaultModificationPolicyID
6259

6360
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
64-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
65-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
61+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
6662
}
6763

68-
func (cbs *commonBootstrapper) encodeAcceptAllPolicy() *cb.SignedConfigurationItem {
64+
func (cbs *commonBootstrapper) encodeAcceptAllPolicy() *cb.ConfigurationItem {
6965
configItemKey := AcceptAllPolicyKey
7066
configItemValue := utils.MarshalOrPanic(utils.MakePolicyOrPanic(cauthdsl.AcceptAllPolicy))
7167
modPolicy := configtx.DefaultModificationPolicyID
7268

7369
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
74-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Policy, lastModified, modPolicy, configItemKey, configItemValue)
75-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
70+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Policy, lastModified, modPolicy, configItemKey, configItemValue)
7671
}
7772

78-
func (cbs *commonBootstrapper) encodeIngressPolicy() *cb.SignedConfigurationItem {
73+
func (cbs *commonBootstrapper) encodeIngressPolicy() *cb.ConfigurationItem {
7974
configItemKey := sharedconfig.IngressPolicyKey
8075
configItemValue := utils.MarshalOrPanic(&ab.IngressPolicy{Name: AcceptAllPolicyKey})
8176
modPolicy := configtx.DefaultModificationPolicyID
8277

8378
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
84-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
85-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
79+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
8680
}
8781

88-
func (cbs *commonBootstrapper) encodeEgressPolicy() *cb.SignedConfigurationItem {
82+
func (cbs *commonBootstrapper) encodeEgressPolicy() *cb.ConfigurationItem {
8983
configItemKey := sharedconfig.EgressPolicyKey
9084
configItemValue := utils.MarshalOrPanic(&ab.EgressPolicy{Name: AcceptAllPolicyKey})
9185
modPolicy := configtx.DefaultModificationPolicyID
9286

9387
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
94-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
95-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
88+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
9689
}
9790

98-
func (cbs *commonBootstrapper) lockDefaultModificationPolicy() *cb.SignedConfigurationItem {
91+
func (cbs *commonBootstrapper) lockDefaultModificationPolicy() *cb.ConfigurationItem {
9992
// Lock down the default modification policy to prevent any further policy modifications
10093
configItemKey := configtx.DefaultModificationPolicyID
10194
configItemValue := utils.MarshalOrPanic(utils.MakePolicyOrPanic(cauthdsl.RejectAllPolicy))
10295
modPolicy := configtx.DefaultModificationPolicyID
10396

10497
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
105-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Policy, lastModified, modPolicy, configItemKey, configItemValue)
106-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
98+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Policy, lastModified, modPolicy, configItemKey, configItemValue)
10799
}
108100

109-
func (kbs *kafkaBootstrapper) encodeKafkaBrokers() *cb.SignedConfigurationItem {
101+
func (kbs *kafkaBootstrapper) encodeKafkaBrokers() *cb.ConfigurationItem {
110102
configItemKey := sharedconfig.KafkaBrokersKey
111103
configItemValue := utils.MarshalOrPanic(&ab.KafkaBrokers{Brokers: kbs.kafkaBrokers})
112104
modPolicy := configtx.DefaultModificationPolicyID
113105

114106
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, kbs.chainID, epoch)
115-
configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
116-
return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil}
107+
return utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue)
117108
}

orderer/common/bootstrap/provisional/provisional.go

+27-22
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,22 @@ package provisional
1919
import (
2020
"fmt"
2121

22+
"github.com/hyperledger/fabric/common/configtx"
23+
"github.com/hyperledger/fabric/common/genesis"
2224
"github.com/hyperledger/fabric/orderer/common/bootstrap"
2325
"github.com/hyperledger/fabric/orderer/localconfig"
2426
cb "github.com/hyperledger/fabric/protos/common"
2527
ab "github.com/hyperledger/fabric/protos/orderer"
26-
"github.com/hyperledger/fabric/protos/utils"
2728
)
2829

30+
// Generator can either create an orderer genesis block or configuration template
31+
type Generator interface {
32+
bootstrap.Helper
33+
34+
// TemplateItems returns a set of configuration items which can be used to initialize a template
35+
TemplateItems() []*cb.ConfigurationItem
36+
}
37+
2938
const (
3039
msgVersion = int32(1)
3140

@@ -70,7 +79,7 @@ type kafkaBootstrapper struct {
7079
}
7180

7281
// New returns a new provisional bootstrap helper.
73-
func New(conf *config.TopLevel) bootstrap.Helper {
82+
func New(conf *config.TopLevel) Generator {
7483
cbs := &commonBootstrapper{
7584
chainID: TestChainID,
7685
consensusType: conf.Genesis.OrdererType,
@@ -95,30 +104,26 @@ func New(conf *config.TopLevel) bootstrap.Helper {
95104
}
96105
}
97106

107+
func (cbs *commonBootstrapper) genesisBlock(minimalTemplateItems func() []*cb.ConfigurationItem) *cb.Block {
108+
block, err := genesis.NewFactoryImpl(
109+
configtx.NewCompositeTemplate(
110+
configtx.NewSimpleTemplate(minimalTemplateItems()...),
111+
configtx.NewSimpleTemplate(cbs.makeOrdererSystemChainConfig()...),
112+
),
113+
).Block(TestChainID)
114+
115+
if err != nil {
116+
panic(err)
117+
}
118+
return block
119+
}
120+
98121
// GenesisBlock returns the genesis block to be used for bootstrapping.
99122
func (cbs *commonBootstrapper) GenesisBlock() *cb.Block {
100-
return cbs.makeGenesisBlock(cbs.makeGenesisConfigEnvelope())
123+
return cbs.genesisBlock(cbs.TemplateItems)
101124
}
102125

103126
// GenesisBlock returns the genesis block to be used for bootstrapping.
104127
func (kbs *kafkaBootstrapper) GenesisBlock() *cb.Block {
105-
return kbs.makeGenesisBlock(kbs.makeGenesisConfigEnvelope())
106-
}
107-
108-
func (cbs *commonBootstrapper) makeGenesisBlock(configEnvelope *cb.ConfigurationEnvelope) *cb.Block {
109-
configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch)
110-
payloadChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_TRANSACTION, configItemChainHeader.Version, cbs.chainID, epoch)
111-
payloadSignatureHeader := utils.MakeSignatureHeader(nil, utils.CreateNonceOrPanic())
112-
payloadHeader := utils.MakePayloadHeader(payloadChainHeader, payloadSignatureHeader)
113-
payload := &cb.Payload{Header: payloadHeader, Data: utils.MarshalOrPanic(configEnvelope)}
114-
envelope := &cb.Envelope{Payload: utils.MarshalOrPanic(payload), Signature: nil}
115-
116-
block := cb.NewBlock(0, nil)
117-
block.Data = &cb.BlockData{Data: [][]byte{utils.MarshalOrPanic(envelope)}}
118-
block.Header.DataHash = block.Data.Hash()
119-
block.Metadata.Metadata[cb.BlockMetadataIndex_LAST_CONFIGURATION] = utils.MarshalOrPanic(&cb.Metadata{
120-
Value: utils.MarshalOrPanic(&cb.LastConfiguration{Index: 0}),
121-
})
122-
123-
return block
128+
return kbs.genesisBlock(kbs.TemplateItems)
124129
}

orderer/common/bootstrap/provisional/envelope.go orderer/common/bootstrap/provisional/templates.go

+9-17
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,24 @@ package provisional
1818

1919
import (
2020
cb "github.com/hyperledger/fabric/protos/common"
21-
"github.com/hyperledger/fabric/protos/utils"
2221
)
2322

24-
func (cbs *commonBootstrapper) makeGenesisConfigEnvelope() *cb.ConfigurationEnvelope {
25-
return utils.MakeConfigurationEnvelope(
23+
func (cbs *commonBootstrapper) makeOrdererSystemChainConfig() []*cb.ConfigurationItem {
24+
return []*cb.ConfigurationItem{cbs.encodeChainCreators()}
25+
}
26+
27+
func (cbs *commonBootstrapper) TemplateItems() []*cb.ConfigurationItem {
28+
return []*cb.ConfigurationItem{
2629
cbs.encodeConsensusType(),
2730
cbs.encodeBatchSize(),
2831
cbs.encodeBatchTimeout(),
29-
cbs.encodeChainCreators(),
3032
cbs.encodeAcceptAllPolicy(),
3133
cbs.encodeIngressPolicy(),
3234
cbs.encodeEgressPolicy(),
3335
cbs.lockDefaultModificationPolicy(),
34-
)
36+
}
3537
}
3638

37-
func (kbs *kafkaBootstrapper) makeGenesisConfigEnvelope() *cb.ConfigurationEnvelope {
38-
return utils.MakeConfigurationEnvelope(
39-
kbs.encodeConsensusType(),
40-
kbs.encodeBatchSize(),
41-
kbs.encodeBatchTimeout(),
42-
kbs.encodeKafkaBrokers(),
43-
kbs.encodeChainCreators(),
44-
kbs.encodeAcceptAllPolicy(),
45-
kbs.encodeIngressPolicy(),
46-
kbs.encodeEgressPolicy(),
47-
kbs.lockDefaultModificationPolicy(),
48-
)
39+
func (kbs *kafkaBootstrapper) TemplateItems() []*cb.ConfigurationItem {
40+
return append(kbs.commonBootstrapper.TemplateItems(), kbs.encodeKafkaBrokers())
4941
}

0 commit comments

Comments
 (0)