From 1e92f78e6822212c4ad28a6a409ccddc92c9ec3a Mon Sep 17 00:00:00 2001 From: Jason Yellick Date: Tue, 17 Jan 2017 17:09:06 -0500 Subject: [PATCH] [FAB-1710] Add orderer addresses to chain config https://jira.hyperledger.org/browse/FAB-1710 This adds the proto support for listing the orderer addresses as a configuration item of type Chain. It also implements the chainconfig Handler for this type to expose it to consumers. This changeset does not actually set or utilize the type, simply adds it. Change-Id: I225d859b4b31df8bde9afec72e1f9d22c7cfe174 Signed-off-by: Jason Yellick --- common/chainconfig/chainconfig.go | 18 +++++ common/chainconfig/chainconfig_test.go | 33 ++++++++ protos/common/common.pb.go | 1 + protos/common/configuration.pb.go | 101 ++++++++++++++----------- protos/common/configuration.proto | 6 ++ 5 files changed, 115 insertions(+), 44 deletions(-) diff --git a/common/chainconfig/chainconfig.go b/common/chainconfig/chainconfig.go index c7506dd7949..8ebbeed9f9b 100644 --- a/common/chainconfig/chainconfig.go +++ b/common/chainconfig/chainconfig.go @@ -33,6 +33,9 @@ const ( // BlockDataHashingStructureKey is the cb.ConfigurationItem type key name for the BlockDataHashingStructure message BlockDataHashingStructureKey = "BlockDataHashingStructure" + + // OrdererAddressesKey is the cb.ConfigurationItem type key name for the OrdererAddresses message + OrdererAddressesKey = "OrdererAddresses" ) // Hashing algorithm types @@ -55,11 +58,15 @@ type Descriptor interface { // BlockDataHashingStructureWidth returns the width to use when constructing the // Merkle tree to compute the BlockData hash BlockDatahashingStructureWidth() int + + // OrdererAddresses returns the list of valid orderer addresses to connect to to invoke Broadcast/Deliver + OrdererAddresses() []string } type chainConfig struct { hashingAlgorithm func(input []byte) []byte blockDataHashingStructureWidth uint32 + ordererAddresses []string } // DescriptorImpl is an implementation of Manager and configtx.ConfigHandler @@ -86,6 +93,11 @@ func (pm *DescriptorImpl) BlockDataHashingStructureWidth() uint32 { return pm.config.blockDataHashingStructureWidth } +// OrdererAddresses returns the list of valid orderer addresses to connect to to invoke Broadcast/Deliver +func (pm *DescriptorImpl) OrdererAddresses() []string { + return pm.config.ordererAddresses +} + // BeginConfig is used to start a new configuration proposal func (pm *DescriptorImpl) BeginConfig() { if pm.pendingConfig != nil { @@ -137,6 +149,12 @@ func (pm *DescriptorImpl) ProposeConfig(configItem *cb.ConfigurationItem) error } pm.pendingConfig.blockDataHashingStructureWidth = blockDataHashingStructure.Width + case OrdererAddressesKey: + ordererAddresses := &cb.OrdererAddresses{} + if err := proto.Unmarshal(configItem.Value, ordererAddresses); err != nil { + return fmt.Errorf("Unmarshaling error for HashingAlgorithm: %s", err) + } + pm.pendingConfig.ordererAddresses = ordererAddresses.Addresses default: logger.Warningf("Uknown Chain configuration item with key %s", configItem.Key) } diff --git a/common/chainconfig/chainconfig_test.go b/common/chainconfig/chainconfig_test.go index 50a1eec7482..c25d75236df 100644 --- a/common/chainconfig/chainconfig_test.go +++ b/common/chainconfig/chainconfig_test.go @@ -17,6 +17,7 @@ limitations under the License. package chainconfig import ( + "reflect" "testing" cb "github.com/hyperledger/fabric/protos/common" @@ -145,3 +146,35 @@ func TestBlockDataHashingStructure(t *testing.T) { t.Fatalf("Unexpected width, got %d expected %d", newWidth, expectedWidth) } } + +func TestOrdererAddresses(t *testing.T) { + expectedResult := []string{"foo", "bar:1234"} + invalidMessage := &cb.ConfigurationItem{ + Type: cb.ConfigurationItem_Chain, + Key: BlockDataHashingStructureKey, + Value: []byte("Garbage Data"), + } + validMessage := &cb.ConfigurationItem{ + Type: cb.ConfigurationItem_Chain, + Key: OrdererAddressesKey, + Value: utils.MarshalOrPanic(&cb.OrdererAddresses{Addresses: expectedResult}), + } + m := NewDescriptorImpl() + m.BeginConfig() + + err := m.ProposeConfig(invalidMessage) + if err == nil { + t.Fatalf("Should have failed on invalid message") + } + + err = m.ProposeConfig(validMessage) + if err != nil { + t.Fatalf("Error applying valid config: %s", err) + } + + m.CommitConfig() + + if newAddrs := m.OrdererAddresses(); !reflect.DeepEqual(newAddrs, expectedResult) { + t.Fatalf("Unexpected width, got %s expected %s", newAddrs, expectedResult) + } +} diff --git a/protos/common/common.pb.go b/protos/common/common.pb.go index f93d77401bd..487b3a9012d 100644 --- a/protos/common/common.pb.go +++ b/protos/common/common.pb.go @@ -33,6 +33,7 @@ It has these top-level messages: SignaturePolicy HashingAlgorithm BlockDataHashingStructure + OrdererAddresses MSPPrincipal OrganizationUnit MSPRole diff --git a/protos/common/configuration.pb.go b/protos/common/configuration.pb.go index def8eb13ba4..4bcb269cee7 100644 --- a/protos/common/configuration.pb.go +++ b/protos/common/configuration.pb.go @@ -373,6 +373,17 @@ func (m *BlockDataHashingStructure) String() string { return proto.Co func (*BlockDataHashingStructure) ProtoMessage() {} func (*BlockDataHashingStructure) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{9} } +// OrdererAddresses is encoded into the configuration transaction as a configuration item of type Chain +// with a Key of "OrdererAddresses" and a Value of OrdererAddresses as marshaled protobuf bytes +type OrdererAddresses struct { + Addresses []string `protobuf:"bytes,1,rep,name=addresses" json:"addresses,omitempty"` +} + +func (m *OrdererAddresses) Reset() { *m = OrdererAddresses{} } +func (m *OrdererAddresses) String() string { return proto.CompactTextString(m) } +func (*OrdererAddresses) ProtoMessage() {} +func (*OrdererAddresses) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{10} } + func init() { proto.RegisterType((*ConfigurationEnvelope)(nil), "common.ConfigurationEnvelope") proto.RegisterType((*ConfigurationTemplate)(nil), "common.ConfigurationTemplate") @@ -385,6 +396,7 @@ func init() { proto.RegisterType((*SignaturePolicy_NOutOf)(nil), "common.SignaturePolicy.NOutOf") proto.RegisterType((*HashingAlgorithm)(nil), "common.HashingAlgorithm") proto.RegisterType((*BlockDataHashingStructure)(nil), "common.BlockDataHashingStructure") + proto.RegisterType((*OrdererAddresses)(nil), "common.OrdererAddresses") proto.RegisterEnum("common.ConfigurationItem_ConfigurationType", ConfigurationItem_ConfigurationType_name, ConfigurationItem_ConfigurationType_value) proto.RegisterEnum("common.Policy_PolicyType", Policy_PolicyType_name, Policy_PolicyType_value) } @@ -392,48 +404,49 @@ func init() { func init() { proto.RegisterFile("common/configuration.proto", fileDescriptor1) } var fileDescriptor1 = []byte{ - // 675 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x54, 0xdb, 0x6e, 0xd3, 0x40, - 0x10, 0x8d, 0x73, 0x71, 0x9a, 0x49, 0x4a, 0xcd, 0xb6, 0xb4, 0x6e, 0x54, 0x95, 0xc8, 0x0f, 0x28, - 0x52, 0x21, 0x51, 0xd3, 0xf2, 0x0a, 0x6a, 0xa0, 0x90, 0xaa, 0xd4, 0x89, 0x36, 0x6d, 0x91, 0x78, - 0x01, 0xd7, 0xde, 0x38, 0x2b, 0x7c, 0xd3, 0x7a, 0x03, 0xca, 0x17, 0xf0, 0x0f, 0x7c, 0x0a, 0x4f, - 0x7c, 0x1a, 0xf2, 0xae, 0x6d, 0x92, 0x34, 0x79, 0xf2, 0xce, 0xcc, 0x39, 0x67, 0x2e, 0xde, 0x59, - 0x68, 0xda, 0xa1, 0xef, 0x87, 0x41, 0xd7, 0x0e, 0x83, 0x09, 0x75, 0x67, 0xcc, 0xe2, 0x34, 0x0c, - 0x3a, 0x11, 0x0b, 0x79, 0x88, 0x54, 0x19, 0x6b, 0xee, 0xe6, 0x98, 0xe4, 0x23, 0x83, 0xcd, 0x8c, - 0xe8, 0xc7, 0xd1, 0xd7, 0x88, 0xd1, 0xc0, 0xa6, 0x91, 0xe5, 0xc9, 0x98, 0x61, 0xc2, 0xb3, 0x77, - 0x8b, 0x7a, 0x97, 0xc1, 0x0f, 0xe2, 0x85, 0x11, 0x41, 0xaf, 0xa1, 0x72, 0xc5, 0x89, 0x1f, 0xeb, - 0x4a, 0xab, 0xd4, 0xae, 0xf7, 0x9e, 0x77, 0x52, 0xc9, 0x31, 0x75, 0x03, 0xe2, 0x2c, 0x71, 0x12, - 0x1c, 0x96, 0x68, 0x63, 0xb0, 0xa2, 0x77, 0x4b, 0xfc, 0xc8, 0xb3, 0x38, 0x41, 0xdd, 0x65, 0xbd, - 0xc3, 0x4c, 0x6f, 0xa3, 0xd2, 0x2f, 0x05, 0x0e, 0x36, 0x24, 0x43, 0x2f, 0xe1, 0xe9, 0x23, 0xa7, - 0xae, 0xb4, 0x94, 0x76, 0x03, 0x3f, 0x0e, 0xa0, 0x37, 0x00, 0x89, 0x90, 0xc5, 0x67, 0x8c, 0xc4, - 0x7a, 0x51, 0xe4, 0x3f, 0x5e, 0x9b, 0x3f, 0x87, 0xe1, 0x05, 0x86, 0xf1, 0xb7, 0xb8, 0x26, 0x1d, - 0x3a, 0x01, 0x75, 0x40, 0x2c, 0x87, 0x30, 0x91, 0xb8, 0xde, 0xdb, 0xcd, 0x15, 0xa7, 0x16, 0x0d, - 0x64, 0x08, 0xa7, 0x10, 0xf4, 0x16, 0xca, 0xb7, 0xf3, 0x88, 0xe8, 0xc5, 0x96, 0xd2, 0x7e, 0xd2, - 0x3b, 0xd9, 0xd8, 0xfc, 0xb2, 0x27, 0xa1, 0x60, 0x41, 0x44, 0x06, 0x34, 0x3e, 0x59, 0x31, 0xbf, - 0x09, 0x1d, 0x3a, 0xa1, 0xc4, 0xd1, 0x4b, 0x2d, 0xa5, 0x5d, 0xc6, 0x4b, 0x3e, 0xd4, 0x01, 0x24, - 0xcf, 0xb6, 0x60, 0x8f, 0x42, 0x8f, 0xda, 0x73, 0xbd, 0xdc, 0x52, 0xda, 0x35, 0xbc, 0x26, 0x82, - 0x34, 0x28, 0x5d, 0x93, 0xb9, 0x5e, 0x11, 0x80, 0xe4, 0x88, 0xf6, 0xa0, 0x72, 0x6f, 0x79, 0x33, - 0xa2, 0xab, 0x62, 0x96, 0xd2, 0x30, 0x2e, 0x56, 0xda, 0x17, 0x05, 0x01, 0xa8, 0x52, 0x46, 0x2b, - 0xa0, 0x1a, 0x54, 0x44, 0xd3, 0x9a, 0x82, 0xea, 0x50, 0x1d, 0x32, 0x87, 0x30, 0xc2, 0xb4, 0x22, - 0xda, 0x82, 0xf2, 0x88, 0x10, 0xa6, 0x95, 0x8c, 0x6f, 0xb0, 0xbf, 0x7e, 0xd0, 0xa8, 0x0d, 0x3b, - 0x71, 0x66, 0x2c, 0xcc, 0xb3, 0x81, 0x57, 0xdd, 0xe8, 0x08, 0x6a, 0xb9, 0x4b, 0x0c, 0xb2, 0x81, - 0xff, 0x3b, 0x0c, 0x37, 0xab, 0x07, 0x21, 0x28, 0xf3, 0x64, 0xd6, 0x89, 0x4c, 0x05, 0x8b, 0x33, - 0xda, 0x07, 0x35, 0x92, 0xe3, 0x90, 0xc4, 0xd4, 0x32, 0x4e, 0x01, 0x24, 0x4b, 0xf4, 0x54, 0x87, - 0xea, 0x9d, 0x79, 0x6d, 0x0e, 0x3f, 0x9b, 0x5a, 0x01, 0x6d, 0x43, 0x6d, 0x7c, 0xf5, 0xd1, 0xbc, - 0xb8, 0xbd, 0xc3, 0x97, 0x9a, 0x82, 0xaa, 0x50, 0xba, 0x19, 0x8f, 0xb4, 0xa2, 0xf1, 0x3b, 0xbd, - 0x97, 0x22, 0xad, 0x24, 0xe7, 0x4b, 0xa3, 0x43, 0xf5, 0x9e, 0xb0, 0x98, 0x86, 0x41, 0x9a, 0x3d, - 0x33, 0x51, 0x37, 0x2b, 0x4f, 0x14, 0x50, 0xef, 0x1d, 0x2c, 0xee, 0xd3, 0x82, 0x14, 0xce, 0xba, - 0x38, 0x07, 0xb8, 0x72, 0x48, 0xc0, 0x29, 0xa7, 0x24, 0xd6, 0x4b, 0xe2, 0xd2, 0xee, 0x65, 0xa4, - 0x9b, 0xf1, 0x68, 0x94, 0x2d, 0x32, 0x5e, 0xc0, 0x19, 0x7f, 0x14, 0xd8, 0x59, 0x51, 0x44, 0x47, - 0xb0, 0x25, 0xf7, 0xa8, 0x3f, 0x97, 0x55, 0x0d, 0x0a, 0x38, 0xf7, 0xa0, 0x73, 0x28, 0x7f, 0x60, - 0xa1, 0x9f, 0x96, 0x75, 0xbc, 0xa1, 0xac, 0x8e, 0x39, 0x9c, 0xf1, 0xe1, 0x64, 0x50, 0xc0, 0x02, - 0xdd, 0xbc, 0x06, 0x55, 0x7a, 0x50, 0x03, 0x14, 0x33, 0x6d, 0x56, 0x31, 0xd1, 0x19, 0x6c, 0x09, - 0x02, 0xcd, 0x17, 0x6d, 0x63, 0xa3, 0x39, 0xb0, 0xaf, 0xca, 0xe5, 0x30, 0x5e, 0x80, 0x36, 0xb0, - 0xe2, 0x29, 0x0d, 0xdc, 0x0b, 0xcf, 0x0d, 0x19, 0xe5, 0x53, 0x3f, 0xf9, 0x99, 0x81, 0xe5, 0xcb, - 0x9f, 0x59, 0xc3, 0xe2, 0x6c, 0x9c, 0xc2, 0x61, 0xdf, 0x0b, 0xed, 0xef, 0xef, 0x2d, 0x6e, 0xa5, - 0x84, 0x31, 0x67, 0x33, 0x5b, 0xdc, 0xa7, 0x3d, 0xa8, 0xfc, 0xa4, 0x0e, 0x9f, 0x0a, 0xc6, 0x36, - 0x96, 0x46, 0xff, 0xd5, 0x97, 0x13, 0x97, 0xf2, 0xe9, 0xec, 0x21, 0xa9, 0xa6, 0x3b, 0x9d, 0x47, - 0x84, 0x79, 0xc4, 0x71, 0x09, 0xeb, 0x4e, 0xac, 0x07, 0x46, 0xed, 0xae, 0x78, 0x0d, 0xe3, 0xf4, - 0xdd, 0x7c, 0x50, 0x85, 0x79, 0xf6, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x8f, 0x23, 0x31, 0x8b, 0x73, - 0x05, 0x00, 0x00, + // 698 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x54, 0xdd, 0x72, 0xd2, 0x40, + 0x14, 0x26, 0xfc, 0x84, 0x72, 0xa0, 0x36, 0x6e, 0x6b, 0x9b, 0x32, 0x9d, 0xca, 0xe4, 0xc2, 0x61, + 0xa6, 0x0a, 0x96, 0xd6, 0x5b, 0x1d, 0xd0, 0x2a, 0x9d, 0xda, 0xc0, 0x2c, 0x6d, 0x9d, 0xf1, 0x46, + 0xd3, 0x64, 0x81, 0x1d, 0xf3, 0x37, 0x9b, 0x45, 0x87, 0x27, 0xf0, 0x1d, 0x7c, 0x14, 0xaf, 0x7c, + 0x34, 0x27, 0xbb, 0x49, 0x0a, 0x14, 0xae, 0xb2, 0xe7, 0x9c, 0xef, 0xfb, 0xce, 0x4f, 0xf6, 0x2c, + 0xd4, 0xed, 0xc0, 0xf3, 0x02, 0xbf, 0x6d, 0x07, 0xfe, 0x98, 0x4e, 0x66, 0xcc, 0xe2, 0x34, 0xf0, + 0x5b, 0x21, 0x0b, 0x78, 0x80, 0x54, 0x19, 0xab, 0xef, 0x66, 0x98, 0xf8, 0x23, 0x83, 0xf5, 0x94, + 0xe8, 0x45, 0xe1, 0xb7, 0x90, 0x51, 0xdf, 0xa6, 0xa1, 0xe5, 0xca, 0x98, 0x61, 0xc2, 0xb3, 0xf7, + 0x8b, 0x7a, 0x17, 0xfe, 0x4f, 0xe2, 0x06, 0x21, 0x41, 0x6f, 0xa0, 0x74, 0xc9, 0x89, 0x17, 0xe9, + 0x4a, 0xa3, 0xd0, 0xac, 0x76, 0x9e, 0xb7, 0x12, 0xc9, 0x11, 0x9d, 0xf8, 0xc4, 0x59, 0xe2, 0xc4, + 0x38, 0x2c, 0xd1, 0x46, 0x7f, 0x45, 0xef, 0x86, 0x78, 0xa1, 0x6b, 0x71, 0x82, 0xda, 0xcb, 0x7a, + 0x87, 0xa9, 0xde, 0x46, 0xa5, 0xdf, 0x0a, 0x1c, 0x6c, 0x48, 0x86, 0x5e, 0xc2, 0xd3, 0x47, 0x4e, + 0x5d, 0x69, 0x28, 0xcd, 0x1a, 0x7e, 0x1c, 0x40, 0x6f, 0x01, 0x62, 0x21, 0x8b, 0xcf, 0x18, 0x89, + 0xf4, 0xbc, 0xc8, 0x7f, 0xbc, 0x36, 0x7f, 0x06, 0xc3, 0x0b, 0x0c, 0xe3, 0x5f, 0x7e, 0x4d, 0x3a, + 0x74, 0x02, 0x6a, 0x9f, 0x58, 0x0e, 0x61, 0x22, 0x71, 0xb5, 0xb3, 0x9b, 0x29, 0x4e, 0x2d, 0xea, + 0xcb, 0x10, 0x4e, 0x20, 0xe8, 0x1d, 0x14, 0x6f, 0xe6, 0x21, 0xd1, 0xf3, 0x0d, 0xa5, 0xf9, 0xa4, + 0x73, 0xb2, 0xb1, 0xf9, 0x65, 0x4f, 0x4c, 0xc1, 0x82, 0x88, 0x0c, 0xa8, 0x7d, 0xb6, 0x22, 0x7e, + 0x1d, 0x38, 0x74, 0x4c, 0x89, 0xa3, 0x17, 0x1a, 0x4a, 0xb3, 0x88, 0x97, 0x7c, 0xa8, 0x05, 0x48, + 0x9e, 0x6d, 0xc1, 0x1e, 0x06, 0x2e, 0xb5, 0xe7, 0x7a, 0xb1, 0xa1, 0x34, 0x2b, 0x78, 0x4d, 0x04, + 0x69, 0x50, 0xb8, 0x22, 0x73, 0xbd, 0x24, 0x00, 0xf1, 0x11, 0xed, 0x41, 0xe9, 0xce, 0x72, 0x67, + 0x44, 0x57, 0xc5, 0x2c, 0xa5, 0x61, 0x74, 0x57, 0xda, 0x17, 0x05, 0x01, 0xa8, 0x52, 0x46, 0xcb, + 0xa1, 0x0a, 0x94, 0x44, 0xd3, 0x9a, 0x82, 0xaa, 0x50, 0x1e, 0x30, 0x87, 0x30, 0xc2, 0xb4, 0x3c, + 0xda, 0x82, 0xe2, 0x90, 0x10, 0xa6, 0x15, 0x8c, 0xef, 0xb0, 0xbf, 0x7e, 0xd0, 0xa8, 0x09, 0x3b, + 0x51, 0x6a, 0x2c, 0xcc, 0xb3, 0x86, 0x57, 0xdd, 0xe8, 0x08, 0x2a, 0x99, 0x4b, 0x0c, 0xb2, 0x86, + 0x1f, 0x1c, 0xc6, 0x24, 0xad, 0x07, 0x21, 0x28, 0xf2, 0x78, 0xd6, 0xb1, 0x4c, 0x09, 0x8b, 0x33, + 0xda, 0x07, 0x35, 0x94, 0xe3, 0x90, 0xc4, 0xc4, 0x32, 0x4e, 0x01, 0x24, 0x4b, 0xf4, 0x54, 0x85, + 0xf2, 0xad, 0x79, 0x65, 0x0e, 0xbe, 0x98, 0x5a, 0x0e, 0x6d, 0x43, 0x65, 0x74, 0xf9, 0xc9, 0xec, + 0xde, 0xdc, 0xe2, 0x0b, 0x4d, 0x41, 0x65, 0x28, 0x5c, 0x8f, 0x86, 0x5a, 0xde, 0xf8, 0x93, 0xdc, + 0x4b, 0x91, 0x56, 0x92, 0xb3, 0xa5, 0xd1, 0xa1, 0x7c, 0x47, 0x58, 0x44, 0x03, 0x3f, 0xc9, 0x9e, + 0x9a, 0xa8, 0x9d, 0x96, 0x27, 0x0a, 0xa8, 0x76, 0x0e, 0x16, 0xf7, 0x69, 0x41, 0x0a, 0xa7, 0x5d, + 0x9c, 0x03, 0x5c, 0x3a, 0xc4, 0xe7, 0x94, 0x53, 0x12, 0xe9, 0x05, 0x71, 0x69, 0xf7, 0x52, 0xd2, + 0xf5, 0x68, 0x38, 0x4c, 0x17, 0x19, 0x2f, 0xe0, 0x8c, 0xbf, 0x0a, 0xec, 0xac, 0x28, 0xa2, 0x23, + 0xd8, 0x92, 0x7b, 0xd4, 0x9b, 0xcb, 0xaa, 0xfa, 0x39, 0x9c, 0x79, 0xd0, 0x39, 0x14, 0x3f, 0xb2, + 0xc0, 0x4b, 0xca, 0x3a, 0xde, 0x50, 0x56, 0xcb, 0x1c, 0xcc, 0xf8, 0x60, 0xdc, 0xcf, 0x61, 0x81, + 0xae, 0x5f, 0x81, 0x2a, 0x3d, 0xa8, 0x06, 0x8a, 0x99, 0x34, 0xab, 0x98, 0xe8, 0x0c, 0xb6, 0x04, + 0x81, 0x66, 0x8b, 0xb6, 0xb1, 0xd1, 0x0c, 0xd8, 0x53, 0xe5, 0x72, 0x18, 0x2f, 0x40, 0xeb, 0x5b, + 0xd1, 0x94, 0xfa, 0x93, 0xae, 0x3b, 0x09, 0x18, 0xe5, 0x53, 0x2f, 0xfe, 0x99, 0xbe, 0xe5, 0xc9, + 0x9f, 0x59, 0xc1, 0xe2, 0x6c, 0x9c, 0xc2, 0x61, 0xcf, 0x0d, 0xec, 0x1f, 0x1f, 0x2c, 0x6e, 0x25, + 0x84, 0x11, 0x67, 0x33, 0x5b, 0xdc, 0xa7, 0x3d, 0x28, 0xfd, 0xa2, 0x0e, 0x9f, 0x0a, 0xc6, 0x36, + 0x96, 0x86, 0xf1, 0x1a, 0xb4, 0xe4, 0x5a, 0x76, 0x1d, 0x87, 0x91, 0x28, 0x22, 0x51, 0x7c, 0x9f, + 0xac, 0xd4, 0x10, 0xaf, 0x52, 0x05, 0x3f, 0x38, 0x7a, 0xaf, 0xbe, 0x9e, 0x4c, 0x28, 0x9f, 0xce, + 0xee, 0xe3, 0xfa, 0xdb, 0xd3, 0x79, 0x48, 0x98, 0x4b, 0x9c, 0x09, 0x61, 0xed, 0xb1, 0x75, 0xcf, + 0xa8, 0xdd, 0x16, 0xef, 0x67, 0x94, 0xbc, 0xb4, 0xf7, 0xaa, 0x30, 0xcf, 0xfe, 0x07, 0x00, 0x00, + 0xff, 0xff, 0x97, 0xd0, 0x17, 0x23, 0xa5, 0x05, 0x00, 0x00, } diff --git a/protos/common/configuration.proto b/protos/common/configuration.proto index 2cefe0fb813..68bd3e8514b 100644 --- a/protos/common/configuration.proto +++ b/protos/common/configuration.proto @@ -132,3 +132,9 @@ message BlockDataHashingStructure { // in order to replicate flat hashing, set this width to MAX_UINT32 uint32 width = 1; } + +// OrdererAddresses is encoded into the configuration transaction as a configuration item of type Chain +// with a Key of "OrdererAddresses" and a Value of OrdererAddresses as marshaled protobuf bytes +message OrdererAddresses { + repeated string addresses = 1; +}