diff --git a/bddtests/orderer/ab_pb2.py b/bddtests/orderer/ab_pb2.py index c213f0cad71..07e0b70b0b2 100644 --- a/bddtests/orderer/ab_pb2.py +++ b/bddtests/orderer/ab_pb2.py @@ -386,120 +386,145 @@ DESCRIPTOR.has_options = True DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('Z,github.com/hyperledger/fabric/protos/orderer')) -import grpc -from grpc.beta import implementations as beta_implementations -from grpc.beta import interfaces as beta_interfaces -from grpc.framework.common import cardinality -from grpc.framework.interfaces.face import utilities as face_utilities - - -class AtomicBroadcastStub(object): - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.Broadcast = channel.stream_stream( - '/orderer.AtomicBroadcast/Broadcast', - request_serializer=common_dot_common__pb2.Envelope.SerializeToString, - response_deserializer=BroadcastResponse.FromString, - ) - self.Deliver = channel.stream_stream( - '/orderer.AtomicBroadcast/Deliver', - request_serializer=SeekInfo.SerializeToString, - response_deserializer=DeliverResponse.FromString, - ) - - -class AtomicBroadcastServicer(object): - - def Broadcast(self, request_iterator, context): - """broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def Deliver(self, request_iterator, context): - """deliver first requires an update containing a seek message, then a stream of block replies is received. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_AtomicBroadcastServicer_to_server(servicer, server): - rpc_method_handlers = { - 'Broadcast': grpc.stream_stream_rpc_method_handler( - servicer.Broadcast, - request_deserializer=common_dot_common__pb2.Envelope.FromString, - response_serializer=BroadcastResponse.SerializeToString, - ), - 'Deliver': grpc.stream_stream_rpc_method_handler( - servicer.Deliver, - request_deserializer=SeekInfo.FromString, - response_serializer=DeliverResponse.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'orderer.AtomicBroadcast', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - -class BetaAtomicBroadcastServicer(object): - def Broadcast(self, request_iterator, context): - """broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def Deliver(self, request_iterator, context): - """deliver first requires an update containing a seek message, then a stream of block replies is received. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - - -class BetaAtomicBroadcastStub(object): - def Broadcast(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None): - """broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure - """ - raise NotImplementedError() - def Deliver(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None): - """deliver first requires an update containing a seek message, then a stream of block replies is received. - """ - raise NotImplementedError() - - -def beta_create_AtomicBroadcast_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): - request_deserializers = { - ('orderer.AtomicBroadcast', 'Broadcast'): common_dot_common__pb2.Envelope.FromString, - ('orderer.AtomicBroadcast', 'Deliver'): SeekInfo.FromString, - } - response_serializers = { - ('orderer.AtomicBroadcast', 'Broadcast'): BroadcastResponse.SerializeToString, - ('orderer.AtomicBroadcast', 'Deliver'): DeliverResponse.SerializeToString, - } - method_implementations = { - ('orderer.AtomicBroadcast', 'Broadcast'): face_utilities.stream_stream_inline(servicer.Broadcast), - ('orderer.AtomicBroadcast', 'Deliver'): face_utilities.stream_stream_inline(servicer.Deliver), - } - server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) - return beta_implementations.server(method_implementations, options=server_options) - - -def beta_create_AtomicBroadcast_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): - request_serializers = { - ('orderer.AtomicBroadcast', 'Broadcast'): common_dot_common__pb2.Envelope.SerializeToString, - ('orderer.AtomicBroadcast', 'Deliver'): SeekInfo.SerializeToString, - } - response_deserializers = { - ('orderer.AtomicBroadcast', 'Broadcast'): BroadcastResponse.FromString, - ('orderer.AtomicBroadcast', 'Deliver'): DeliverResponse.FromString, - } - cardinalities = { - 'Broadcast': cardinality.Cardinality.STREAM_STREAM, - 'Deliver': cardinality.Cardinality.STREAM_STREAM, - } - stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) - return beta_implementations.dynamic_stub(channel, 'orderer.AtomicBroadcast', cardinalities, options=stub_options) +try: + # THESE ELEMENTS WILL BE DEPRECATED. + # Please use the generated *_pb2_grpc.py files instead. + import grpc + from grpc.framework.common import cardinality + from grpc.framework.interfaces.face import utilities as face_utilities + from grpc.beta import implementations as beta_implementations + from grpc.beta import interfaces as beta_interfaces + + + class AtomicBroadcastStub(object): + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Broadcast = channel.stream_stream( + '/orderer.AtomicBroadcast/Broadcast', + request_serializer=common_dot_common__pb2.Envelope.SerializeToString, + response_deserializer=BroadcastResponse.FromString, + ) + self.Deliver = channel.stream_stream( + '/orderer.AtomicBroadcast/Deliver', + request_serializer=SeekInfo.SerializeToString, + response_deserializer=DeliverResponse.FromString, + ) + + + class AtomicBroadcastServicer(object): + + def Broadcast(self, request_iterator, context): + """broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Deliver(self, request_iterator, context): + """deliver first requires an update containing a seek message, then a stream of block replies is received. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + + def add_AtomicBroadcastServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Broadcast': grpc.stream_stream_rpc_method_handler( + servicer.Broadcast, + request_deserializer=common_dot_common__pb2.Envelope.FromString, + response_serializer=BroadcastResponse.SerializeToString, + ), + 'Deliver': grpc.stream_stream_rpc_method_handler( + servicer.Deliver, + request_deserializer=SeekInfo.FromString, + response_serializer=DeliverResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'orderer.AtomicBroadcast', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + class BetaAtomicBroadcastServicer(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + def Broadcast(self, request_iterator, context): + """broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Deliver(self, request_iterator, context): + """deliver first requires an update containing a seek message, then a stream of block replies is received. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + + + class BetaAtomicBroadcastStub(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + def Broadcast(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None): + """broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure + """ + raise NotImplementedError() + def Deliver(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None): + """deliver first requires an update containing a seek message, then a stream of block replies is received. + """ + raise NotImplementedError() + + + def beta_create_AtomicBroadcast_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_deserializers = { + ('orderer.AtomicBroadcast', 'Broadcast'): common_dot_common__pb2.Envelope.FromString, + ('orderer.AtomicBroadcast', 'Deliver'): SeekInfo.FromString, + } + response_serializers = { + ('orderer.AtomicBroadcast', 'Broadcast'): BroadcastResponse.SerializeToString, + ('orderer.AtomicBroadcast', 'Deliver'): DeliverResponse.SerializeToString, + } + method_implementations = { + ('orderer.AtomicBroadcast', 'Broadcast'): face_utilities.stream_stream_inline(servicer.Broadcast), + ('orderer.AtomicBroadcast', 'Deliver'): face_utilities.stream_stream_inline(servicer.Deliver), + } + server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) + return beta_implementations.server(method_implementations, options=server_options) + + + def beta_create_AtomicBroadcast_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_serializers = { + ('orderer.AtomicBroadcast', 'Broadcast'): common_dot_common__pb2.Envelope.SerializeToString, + ('orderer.AtomicBroadcast', 'Deliver'): SeekInfo.SerializeToString, + } + response_deserializers = { + ('orderer.AtomicBroadcast', 'Broadcast'): BroadcastResponse.FromString, + ('orderer.AtomicBroadcast', 'Deliver'): DeliverResponse.FromString, + } + cardinalities = { + 'Broadcast': cardinality.Cardinality.STREAM_STREAM, + 'Deliver': cardinality.Cardinality.STREAM_STREAM, + } + stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) + return beta_implementations.dynamic_stub(channel, 'orderer.AtomicBroadcast', cardinalities, options=stub_options) +except ImportError: + pass # @@protoc_insertion_point(module_scope) diff --git a/bddtests/orderer/ab_pb2_grpc.py b/bddtests/orderer/ab_pb2_grpc.py new file mode 100644 index 00000000000..b88d5478d7b --- /dev/null +++ b/bddtests/orderer/ab_pb2_grpc.py @@ -0,0 +1,63 @@ +import grpc +from grpc.framework.common import cardinality +from grpc.framework.interfaces.face import utilities as face_utilities + +import common.common_pb2 as common_dot_common__pb2 +import orderer.ab_pb2 as orderer_dot_ab__pb2 +import orderer.ab_pb2 as orderer_dot_ab__pb2 +import orderer.ab_pb2 as orderer_dot_ab__pb2 + + +class AtomicBroadcastStub(object): + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Broadcast = channel.stream_stream( + '/orderer.AtomicBroadcast/Broadcast', + request_serializer=common_dot_common__pb2.Envelope.SerializeToString, + response_deserializer=orderer_dot_ab__pb2.BroadcastResponse.FromString, + ) + self.Deliver = channel.stream_stream( + '/orderer.AtomicBroadcast/Deliver', + request_serializer=orderer_dot_ab__pb2.SeekInfo.SerializeToString, + response_deserializer=orderer_dot_ab__pb2.DeliverResponse.FromString, + ) + + +class AtomicBroadcastServicer(object): + + def Broadcast(self, request_iterator, context): + """broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Deliver(self, request_iterator, context): + """deliver first requires an update containing a seek message, then a stream of block replies is received. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_AtomicBroadcastServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Broadcast': grpc.stream_stream_rpc_method_handler( + servicer.Broadcast, + request_deserializer=common_dot_common__pb2.Envelope.FromString, + response_serializer=orderer_dot_ab__pb2.BroadcastResponse.SerializeToString, + ), + 'Deliver': grpc.stream_stream_rpc_method_handler( + servicer.Deliver, + request_deserializer=orderer_dot_ab__pb2.SeekInfo.FromString, + response_serializer=orderer_dot_ab__pb2.DeliverResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'orderer.AtomicBroadcast', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/bddtests/orderer/configuration_pb2.py b/bddtests/orderer/configuration_pb2.py index f3b101e93df..22bd3432a57 100644 --- a/bddtests/orderer/configuration_pb2.py +++ b/bddtests/orderer/configuration_pb2.py @@ -20,7 +20,7 @@ name='orderer/configuration.proto', package='orderer', syntax='proto3', - serialized_pb=_b('\n\x1borderer/configuration.proto\x12\x07orderer\x1a\x13\x63ommon/common.proto\"\x1d\n\rConsensusType\x12\x0c\n\x04type\x18\x01 \x01(\t\"\x1d\n\tBatchSize\x12\x10\n\x08messages\x18\x01 \x01(\x05\"0\n\x0e\x43reationPolicy\x12\x0e\n\x06policy\x18\x01 \x01(\t\x12\x0e\n\x06\x64igest\x18\x02 \x01(\x0c\"!\n\rChainCreators\x12\x10\n\x08policies\x18\x01 \x03(\tB.Z,github.com/hyperledger/fabric/protos/ordererb\x06proto3') + serialized_pb=_b('\n\x1borderer/configuration.proto\x12\x07orderer\x1a\x13\x63ommon/common.proto\"\x1d\n\rConsensusType\x12\x0c\n\x04type\x18\x01 \x01(\t\"$\n\tBatchSize\x12\x17\n\x0fmaxMessageCount\x18\x01 \x01(\r\"\x1f\n\x0c\x42\x61tchTimeout\x12\x0f\n\x07timeout\x18\x01 \x01(\t\"0\n\x0e\x43reationPolicy\x12\x0e\n\x06policy\x18\x01 \x01(\t\x12\x0e\n\x06\x64igest\x18\x02 \x01(\x0c\"\x1d\n\rIngressPolicy\x12\x0c\n\x04name\x18\x01 \x01(\t\"!\n\rChainCreators\x12\x10\n\x08policies\x18\x01 \x03(\t\"\x1f\n\x0cKafkaBrokers\x12\x0f\n\x07\x62rokers\x18\x01 \x03(\tB.Z,github.com/hyperledger/fabric/protos/ordererb\x06proto3') , dependencies=[common_dot_common__pb2.DESCRIPTOR,]) _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -67,8 +67,8 @@ containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='messages', full_name='orderer.BatchSize.messages', index=0, - number=1, type=5, cpp_type=1, label=1, + name='maxMessageCount', full_name='orderer.BatchSize.maxMessageCount', index=0, + number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -86,7 +86,38 @@ oneofs=[ ], serialized_start=92, - serialized_end=121, + serialized_end=128, +) + + +_BATCHTIMEOUT = _descriptor.Descriptor( + name='BatchTimeout', + full_name='orderer.BatchTimeout', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='timeout', full_name='orderer.BatchTimeout.timeout', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=130, + serialized_end=161, ) @@ -123,8 +154,39 @@ extension_ranges=[], oneofs=[ ], - serialized_start=123, - serialized_end=171, + serialized_start=163, + serialized_end=211, +) + + +_INGRESSPOLICY = _descriptor.Descriptor( + name='IngressPolicy', + full_name='orderer.IngressPolicy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='orderer.IngressPolicy.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=213, + serialized_end=242, ) @@ -154,14 +216,48 @@ extension_ranges=[], oneofs=[ ], - serialized_start=173, - serialized_end=206, + serialized_start=244, + serialized_end=277, +) + + +_KAFKABROKERS = _descriptor.Descriptor( + name='KafkaBrokers', + full_name='orderer.KafkaBrokers', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='brokers', full_name='orderer.KafkaBrokers.brokers', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=279, + serialized_end=310, ) DESCRIPTOR.message_types_by_name['ConsensusType'] = _CONSENSUSTYPE DESCRIPTOR.message_types_by_name['BatchSize'] = _BATCHSIZE +DESCRIPTOR.message_types_by_name['BatchTimeout'] = _BATCHTIMEOUT DESCRIPTOR.message_types_by_name['CreationPolicy'] = _CREATIONPOLICY +DESCRIPTOR.message_types_by_name['IngressPolicy'] = _INGRESSPOLICY DESCRIPTOR.message_types_by_name['ChainCreators'] = _CHAINCREATORS +DESCRIPTOR.message_types_by_name['KafkaBrokers'] = _KAFKABROKERS ConsensusType = _reflection.GeneratedProtocolMessageType('ConsensusType', (_message.Message,), dict( DESCRIPTOR = _CONSENSUSTYPE, @@ -177,6 +273,13 @@ )) _sym_db.RegisterMessage(BatchSize) +BatchTimeout = _reflection.GeneratedProtocolMessageType('BatchTimeout', (_message.Message,), dict( + DESCRIPTOR = _BATCHTIMEOUT, + __module__ = 'orderer.configuration_pb2' + # @@protoc_insertion_point(class_scope:orderer.BatchTimeout) + )) +_sym_db.RegisterMessage(BatchTimeout) + CreationPolicy = _reflection.GeneratedProtocolMessageType('CreationPolicy', (_message.Message,), dict( DESCRIPTOR = _CREATIONPOLICY, __module__ = 'orderer.configuration_pb2' @@ -184,6 +287,13 @@ )) _sym_db.RegisterMessage(CreationPolicy) +IngressPolicy = _reflection.GeneratedProtocolMessageType('IngressPolicy', (_message.Message,), dict( + DESCRIPTOR = _INGRESSPOLICY, + __module__ = 'orderer.configuration_pb2' + # @@protoc_insertion_point(class_scope:orderer.IngressPolicy) + )) +_sym_db.RegisterMessage(IngressPolicy) + ChainCreators = _reflection.GeneratedProtocolMessageType('ChainCreators', (_message.Message,), dict( DESCRIPTOR = _CHAINCREATORS, __module__ = 'orderer.configuration_pb2' @@ -191,12 +301,24 @@ )) _sym_db.RegisterMessage(ChainCreators) +KafkaBrokers = _reflection.GeneratedProtocolMessageType('KafkaBrokers', (_message.Message,), dict( + DESCRIPTOR = _KAFKABROKERS, + __module__ = 'orderer.configuration_pb2' + # @@protoc_insertion_point(class_scope:orderer.KafkaBrokers) + )) +_sym_db.RegisterMessage(KafkaBrokers) + DESCRIPTOR.has_options = True DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('Z,github.com/hyperledger/fabric/protos/orderer')) -import grpc -from grpc.beta import implementations as beta_implementations -from grpc.beta import interfaces as beta_interfaces -from grpc.framework.common import cardinality -from grpc.framework.interfaces.face import utilities as face_utilities +try: + # THESE ELEMENTS WILL BE DEPRECATED. + # Please use the generated *_pb2_grpc.py files instead. + import grpc + from grpc.framework.common import cardinality + from grpc.framework.interfaces.face import utilities as face_utilities + from grpc.beta import implementations as beta_implementations + from grpc.beta import interfaces as beta_interfaces +except ImportError: + pass # @@protoc_insertion_point(module_scope) diff --git a/bddtests/orderer/configuration_pb2_grpc.py b/bddtests/orderer/configuration_pb2_grpc.py new file mode 100644 index 00000000000..c374a4d7d5b --- /dev/null +++ b/bddtests/orderer/configuration_pb2_grpc.py @@ -0,0 +1,4 @@ +import grpc +from grpc.framework.common import cardinality +from grpc.framework.interfaces.face import utilities as face_utilities + diff --git a/bddtests/orderer/kafka_pb2.py b/bddtests/orderer/kafka_pb2.py new file mode 100644 index 00000000000..04c3c9d4eec --- /dev/null +++ b/bddtests/orderer/kafka_pb2.py @@ -0,0 +1,227 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: orderer/kafka.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='orderer/kafka.proto', + package='orderer', + syntax='proto3', + serialized_pb=_b('\n\x13orderer/kafka.proto\x12\x07orderer\"\xaf\x01\n\x0cKafkaMessage\x12/\n\x07regular\x18\x01 \x01(\x0b\x32\x1c.orderer.KafkaMessageRegularH\x00\x12\x35\n\x0btime_to_cut\x18\x02 \x01(\x0b\x32\x1e.orderer.KafkaMessageTimeToCutH\x00\x12/\n\x07\x63onnect\x18\x03 \x01(\x0b\x32\x1c.orderer.KafkaMessageConnectH\x00\x42\x06\n\x04Type\"&\n\x13KafkaMessageRegular\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\"-\n\x15KafkaMessageTimeToCut\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\"&\n\x13KafkaMessageConnect\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\x42.Z,github.com/hyperledger/fabric/protos/ordererb\x06proto3') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + + + +_KAFKAMESSAGE = _descriptor.Descriptor( + name='KafkaMessage', + full_name='orderer.KafkaMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='regular', full_name='orderer.KafkaMessage.regular', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='time_to_cut', full_name='orderer.KafkaMessage.time_to_cut', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='connect', full_name='orderer.KafkaMessage.connect', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='Type', full_name='orderer.KafkaMessage.Type', + index=0, containing_type=None, fields=[]), + ], + serialized_start=33, + serialized_end=208, +) + + +_KAFKAMESSAGEREGULAR = _descriptor.Descriptor( + name='KafkaMessageRegular', + full_name='orderer.KafkaMessageRegular', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='payload', full_name='orderer.KafkaMessageRegular.payload', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=210, + serialized_end=248, +) + + +_KAFKAMESSAGETIMETOCUT = _descriptor.Descriptor( + name='KafkaMessageTimeToCut', + full_name='orderer.KafkaMessageTimeToCut', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='block_number', full_name='orderer.KafkaMessageTimeToCut.block_number', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=250, + serialized_end=295, +) + + +_KAFKAMESSAGECONNECT = _descriptor.Descriptor( + name='KafkaMessageConnect', + full_name='orderer.KafkaMessageConnect', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='payload', full_name='orderer.KafkaMessageConnect.payload', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=297, + serialized_end=335, +) + +_KAFKAMESSAGE.fields_by_name['regular'].message_type = _KAFKAMESSAGEREGULAR +_KAFKAMESSAGE.fields_by_name['time_to_cut'].message_type = _KAFKAMESSAGETIMETOCUT +_KAFKAMESSAGE.fields_by_name['connect'].message_type = _KAFKAMESSAGECONNECT +_KAFKAMESSAGE.oneofs_by_name['Type'].fields.append( + _KAFKAMESSAGE.fields_by_name['regular']) +_KAFKAMESSAGE.fields_by_name['regular'].containing_oneof = _KAFKAMESSAGE.oneofs_by_name['Type'] +_KAFKAMESSAGE.oneofs_by_name['Type'].fields.append( + _KAFKAMESSAGE.fields_by_name['time_to_cut']) +_KAFKAMESSAGE.fields_by_name['time_to_cut'].containing_oneof = _KAFKAMESSAGE.oneofs_by_name['Type'] +_KAFKAMESSAGE.oneofs_by_name['Type'].fields.append( + _KAFKAMESSAGE.fields_by_name['connect']) +_KAFKAMESSAGE.fields_by_name['connect'].containing_oneof = _KAFKAMESSAGE.oneofs_by_name['Type'] +DESCRIPTOR.message_types_by_name['KafkaMessage'] = _KAFKAMESSAGE +DESCRIPTOR.message_types_by_name['KafkaMessageRegular'] = _KAFKAMESSAGEREGULAR +DESCRIPTOR.message_types_by_name['KafkaMessageTimeToCut'] = _KAFKAMESSAGETIMETOCUT +DESCRIPTOR.message_types_by_name['KafkaMessageConnect'] = _KAFKAMESSAGECONNECT + +KafkaMessage = _reflection.GeneratedProtocolMessageType('KafkaMessage', (_message.Message,), dict( + DESCRIPTOR = _KAFKAMESSAGE, + __module__ = 'orderer.kafka_pb2' + # @@protoc_insertion_point(class_scope:orderer.KafkaMessage) + )) +_sym_db.RegisterMessage(KafkaMessage) + +KafkaMessageRegular = _reflection.GeneratedProtocolMessageType('KafkaMessageRegular', (_message.Message,), dict( + DESCRIPTOR = _KAFKAMESSAGEREGULAR, + __module__ = 'orderer.kafka_pb2' + # @@protoc_insertion_point(class_scope:orderer.KafkaMessageRegular) + )) +_sym_db.RegisterMessage(KafkaMessageRegular) + +KafkaMessageTimeToCut = _reflection.GeneratedProtocolMessageType('KafkaMessageTimeToCut', (_message.Message,), dict( + DESCRIPTOR = _KAFKAMESSAGETIMETOCUT, + __module__ = 'orderer.kafka_pb2' + # @@protoc_insertion_point(class_scope:orderer.KafkaMessageTimeToCut) + )) +_sym_db.RegisterMessage(KafkaMessageTimeToCut) + +KafkaMessageConnect = _reflection.GeneratedProtocolMessageType('KafkaMessageConnect', (_message.Message,), dict( + DESCRIPTOR = _KAFKAMESSAGECONNECT, + __module__ = 'orderer.kafka_pb2' + # @@protoc_insertion_point(class_scope:orderer.KafkaMessageConnect) + )) +_sym_db.RegisterMessage(KafkaMessageConnect) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('Z,github.com/hyperledger/fabric/protos/orderer')) +try: + # THESE ELEMENTS WILL BE DEPRECATED. + # Please use the generated *_pb2_grpc.py files instead. + import grpc + from grpc.framework.common import cardinality + from grpc.framework.interfaces.face import utilities as face_utilities + from grpc.beta import implementations as beta_implementations + from grpc.beta import interfaces as beta_interfaces +except ImportError: + pass +# @@protoc_insertion_point(module_scope) diff --git a/bddtests/orderer/kafka_pb2_grpc.py b/bddtests/orderer/kafka_pb2_grpc.py new file mode 100644 index 00000000000..c374a4d7d5b --- /dev/null +++ b/bddtests/orderer/kafka_pb2_grpc.py @@ -0,0 +1,4 @@ +import grpc +from grpc.framework.common import cardinality +from grpc.framework.interfaces.face import utilities as face_utilities + diff --git a/bddtests/steps/bootstrap_util.py b/bddtests/steps/bootstrap_util.py index ec3df279628..59343125a03 100644 --- a/bddtests/steps/bootstrap_util.py +++ b/bddtests/steps/bootstrap_util.py @@ -228,6 +228,7 @@ class BootstrapHelper: KEY_CONSENSUS_TYPE = "ConsensusType" KEY_CHAIN_CREATORS = "ChainCreators" KEY_ACCEPT_ALL_POLICY = "AcceptAllPolicy" + KEY_INGRESS_POLICY = "IngressPolicy" KEY_BATCH_SIZE = "BatchSize" DEFAULT_MODIFICATION_POLICY_ID = "DefaultModificationPolicy" @@ -278,7 +279,7 @@ def encodeBatchSize(self): configItem = self.getConfigItem( commonConfigType=common_dot_configuration_pb2.ConfigurationItem.ConfigurationType.Value("Orderer"), key=BootstrapHelper.KEY_BATCH_SIZE, - value=orderer_dot_configuration_pb2.BatchSize(messages=self.batchSize).SerializeToString()) + value=orderer_dot_configuration_pb2.BatchSize(maxMessageCount=self.batchSize).SerializeToString()) return self.signConfigItem(configItem) def encodeConsensusType(self): @@ -295,21 +296,26 @@ def encodeChainCreators(self): value=orderer_dot_configuration_pb2.ChainCreators(policies=BootstrapHelper.DEFAULT_CHAIN_CREATORS).SerializeToString()) return self.signConfigItem(configItem) - - def _encodeSignaturePolicyEnvelope(self, signaturePolicyEnvelope): + def encodeIngressPolicy(self): configItem = self.getConfigItem( commonConfigType=common_dot_configuration_pb2.ConfigurationItem.ConfigurationType.Value("Orderer"), - key=BootstrapHelper.DEFAULT_MODIFICATION_POLICY_ID, - value=signaturePolicyEnvelope.SerializeToString()) + key=BootstrapHelper.KEY_INGRESS_POLICY, + value=orderer_dot_configuration_pb2.IngressPolicy(name=BootstrapHelper.KEY_ACCEPT_ALL_POLICY).SerializeToString()) return self.signConfigItem(configItem) def encodeAcceptAllPolicy(self): - acceptAllPolicy = AuthDSLHelper.Envelope(signaturePolicy=AuthDSLHelper.NOutOf(0,[]), identities=[]) - return self._encodeSignaturePolicyEnvelope(acceptAllPolicy) + configItem = self.getConfigItem( + commonConfigType=common_dot_configuration_pb2.ConfigurationItem.ConfigurationType.Value("Policy"), + key=BootstrapHelper.KEY_ACCEPT_ALL_POLICY, + value=AuthDSLHelper.Envelope(signaturePolicy=AuthDSLHelper.NOutOf(0,[]), identities=[]).SerializeToString()) + return self.signConfigItem(configItem) def lockDefaultModificationPolicy(self): - rejectAllPolicy = AuthDSLHelper.Envelope(signaturePolicy=AuthDSLHelper.NOutOf(1,[]), identities=[]) - return self._encodeSignaturePolicyEnvelope(rejectAllPolicy) + configItem = self.getConfigItem( + commonConfigType=common_dot_configuration_pb2.ConfigurationItem.ConfigurationType.Value("Policy"), + key=BootstrapHelper.DEFAULT_MODIFICATION_POLICY_ID, + value=AuthDSLHelper.Envelope(signaturePolicy=AuthDSLHelper.NOutOf(1,[]), identities=[]).SerializeToString()) + return self.signConfigItem(configItem) def computeBlockDataHash(self, blockData): return computeCryptoHash(blockData.SerializeToString()) @@ -333,6 +339,7 @@ def createGenesisBlock(context, chainId, networkConfigPolicy, consensusType): configItems.append(bootstrapHelper.encodeConsensusType()) configItems.append(bootstrapHelper.encodeChainCreators()) configItems.append(bootstrapHelper.encodeAcceptAllPolicy()) + configItems.append(bootstrapHelper.encodeIngressPolicy()) configItems.append(bootstrapHelper.lockDefaultModificationPolicy()) configEnvelope = common_dot_configuration_pb2.ConfigurationEnvelope(Items=configItems) diff --git a/bddtests/steps/orderer_util.py b/bddtests/steps/orderer_util.py index d1ac629b96a..33477e17257 100644 --- a/bddtests/steps/orderer_util.py +++ b/bddtests/steps/orderer_util.py @@ -225,7 +225,8 @@ def generateBroadcastMessages(chainID = TEST_CHAIN_ID, numToGenerate = 1, timeTo chainHeader = common_pb2.ChainHeader( chainID = chainID, type = common_pb2.ENDORSER_TRANSACTION, - ) + ), + signatureHeader = common_pb2.SignatureHeader(), ), data = str("BDD test: {0}".format(datetime.datetime.utcnow())), ) diff --git a/orderer/common/bootstrap/provisional/envelope.go b/orderer/common/bootstrap/provisional/envelope.go index ae4562a83ac..366bae619dd 100644 --- a/orderer/common/bootstrap/provisional/envelope.go +++ b/orderer/common/bootstrap/provisional/envelope.go @@ -28,6 +28,7 @@ func (cbs *commonBootstrapper) makeGenesisConfigEnvelope() *cb.ConfigurationEnve cbs.encodeBatchTimeout(), cbs.encodeChainCreators(), cbs.encodeAcceptAllPolicy(), + cbs.encodeIngressPolicy(), cbs.lockDefaultModificationPolicy(), ) } @@ -40,6 +41,7 @@ func (kbs *kafkaBootstrapper) makeGenesisConfigEnvelope() *cb.ConfigurationEnvel kbs.encodeKafkaBrokers(), kbs.encodeChainCreators(), kbs.encodeAcceptAllPolicy(), + kbs.encodeIngressPolicy(), kbs.lockDefaultModificationPolicy(), ) } diff --git a/orderer/common/bootstrap/provisional/item.go b/orderer/common/bootstrap/provisional/item.go index 918d8602d06..5ba16b748a3 100644 --- a/orderer/common/bootstrap/provisional/item.go +++ b/orderer/common/bootstrap/provisional/item.go @@ -75,6 +75,16 @@ func (cbs *commonBootstrapper) encodeAcceptAllPolicy() *cb.SignedConfigurationIt return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil} } +func (cbs *commonBootstrapper) encodeIngressPolicy() *cb.SignedConfigurationItem { + configItemKey := sharedconfig.IngressPolicyKey + configItemValue := utils.MarshalOrPanic(&ab.IngressPolicy{Name: AcceptAllPolicyKey}) + modPolicy := configtx.DefaultModificationPolicyID + + configItemChainHeader := utils.MakeChainHeader(cb.HeaderType_CONFIGURATION_ITEM, msgVersion, cbs.chainID, epoch) + configItem := utils.MakeConfigurationItem(configItemChainHeader, cb.ConfigurationItem_Orderer, lastModified, modPolicy, configItemKey, configItemValue) + return &cb.SignedConfigurationItem{ConfigurationItem: utils.MarshalOrPanic(configItem), Signatures: nil} +} + func (cbs *commonBootstrapper) lockDefaultModificationPolicy() *cb.SignedConfigurationItem { // Lock down the default modification policy to prevent any further policy modifications configItemKey := configtx.DefaultModificationPolicyID diff --git a/orderer/multichain/chainsupport.go b/orderer/multichain/chainsupport.go index e4524c50fd8..2c53a1fe1f9 100644 --- a/orderer/multichain/chainsupport.go +++ b/orderer/multichain/chainsupport.go @@ -25,6 +25,7 @@ import ( "github.com/hyperledger/fabric/orderer/common/deliver" "github.com/hyperledger/fabric/orderer/common/filter" "github.com/hyperledger/fabric/orderer/common/sharedconfig" + "github.com/hyperledger/fabric/orderer/common/sigfilter" "github.com/hyperledger/fabric/orderer/rawledger" cb "github.com/hyperledger/fabric/protos/common" "github.com/hyperledger/fabric/protos/utils" @@ -127,9 +128,10 @@ func newChainSupport( } // createStandardFilters creates the set of filters for a normal (non-system) chain -func createStandardFilters(configManager configtx.Manager) *filter.RuleSet { +func createStandardFilters(configManager configtx.Manager, policyManager policies.Manager, sharedConfig sharedconfig.Manager) *filter.RuleSet { return filter.NewRuleSet([]filter.Rule{ filter.EmptyRejectRule, + sigfilter.New(sharedConfig.IngressPolicy, policyManager), configtx.NewFilter(configManager), filter.AcceptRule, }) @@ -137,9 +139,10 @@ func createStandardFilters(configManager configtx.Manager) *filter.RuleSet { } // createSystemChainFilters creates the set of filters for the ordering system chain -func createSystemChainFilters(ml *multiLedger, configManager configtx.Manager) *filter.RuleSet { +func createSystemChainFilters(ml *multiLedger, configManager configtx.Manager, policyManager policies.Manager, sharedConfig sharedconfig.Manager) *filter.RuleSet { return filter.NewRuleSet([]filter.Rule{ filter.EmptyRejectRule, + sigfilter.New(sharedConfig.IngressPolicy, policyManager), newSystemChainFilter(ml), configtx.NewFilter(configManager), filter.AcceptRule, diff --git a/orderer/multichain/manager.go b/orderer/multichain/manager.go index 38ad06d001b..7416b847385 100644 --- a/orderer/multichain/manager.go +++ b/orderer/multichain/manager.go @@ -115,15 +115,27 @@ func NewManagerImpl(ledgerFactory rawledger.Factory, consenters map[string]Conse if ml.sysChain != nil { logger.Fatalf("There appear to be two system chains %s and %s", ml.sysChain.support.ChainID(), chainID) } - logger.Debugf("Starting with system chain: %s", chainID) - chain := newChainSupport(createSystemChainFilters(ml, configManager), configManager, policyManager, backingLedger, sharedConfigManager, consenters, &xxxCryptoHelper{}) + logger.Debugf("Starting with system chain: %x", chainID) + chain := newChainSupport(createSystemChainFilters(ml, configManager, policyManager, sharedConfigManager), + configManager, + policyManager, + backingLedger, + sharedConfigManager, + consenters, + &xxxCryptoHelper{}) ml.chains[string(chainID)] = chain ml.sysChain = newSystemChain(chain) // We delay starting this chain, as it might try to copy and replace the chains map via newChain before the map is fully built defer chain.start() } else { - logger.Debugf("Starting chain: %s", chainID) - chain := newChainSupport(createStandardFilters(configManager), configManager, policyManager, backingLedger, sharedConfigManager, consenters, &xxxCryptoHelper{}) + logger.Debugf("Starting chain: %x", chainID) + chain := newChainSupport(createStandardFilters(configManager, policyManager, sharedConfigManager), + configManager, + policyManager, + backingLedger, + sharedConfigManager, + consenters, + &xxxCryptoHelper{}) ml.chains[string(chainID)] = chain chain.start() } @@ -225,7 +237,7 @@ func (ml *multiLedger) newChain(configtx *cb.Envelope) { newChains[key] = value } - cs := newChainSupport(createStandardFilters(configManager), configManager, policyManager, backingLedger, sharedConfig, ml.consenters, &xxxCryptoHelper{}) + cs := newChainSupport(createStandardFilters(configManager, policyManager, sharedConfig), configManager, policyManager, backingLedger, sharedConfig, ml.consenters, &xxxCryptoHelper{}) chainID := configManager.ChainID() logger.Debugf("Created and starting new chain %s", chainID) diff --git a/orderer/multichain/manager_test.go b/orderer/multichain/manager_test.go index dd5770c0254..5044702fa2e 100644 --- a/orderer/multichain/manager_test.go +++ b/orderer/multichain/manager_test.go @@ -17,7 +17,6 @@ limitations under the License. package multichain import ( - "fmt" "reflect" "testing" "time" @@ -42,22 +41,6 @@ func init() { genesisBlock = provisional.New(conf).GenesisBlock() } -// TODO move to util -func makeNormalTx(chainID string, i int) *cb.Envelope { - payload := &cb.Payload{ - Header: &cb.Header{ - ChainHeader: &cb.ChainHeader{ - Type: int32(cb.HeaderType_ENDORSER_TRANSACTION), - ChainID: chainID, - }, - }, - Data: []byte(fmt.Sprintf("%d", i)), - } - return &cb.Envelope{ - Payload: utils.MarshalOrPanic(payload), - } -} - func NewRAMLedgerAndFactory(maxSize int) (rawledger.Factory, rawledger.ReadWriter) { rlf := ramledger.New(10) rl, err := rlf.GetOrCreate(provisional.TestChainID) @@ -162,6 +145,43 @@ func TestManagerImpl(t *testing.T) { } } +// This test makes sure that the signature filter works +func TestSignatureFilter(t *testing.T) { + lf, rl := NewRAMLedgerAndFactory(10) + + consenters := make(map[string]Consenter) + consenters[conf.General.OrdererType] = &mockConsenter{} + + manager := NewManagerImpl(lf, consenters) + + cs, ok := manager.GetChain(provisional.TestChainID) + + if !ok { + t.Fatalf("Should have gotten chain which was initialized by ramledger") + } + + messages := make([]*cb.Envelope, conf.General.BatchSize.MaxMessageCount) + for i := 0; i < int(conf.General.BatchSize.MaxMessageCount); i++ { + messages[i] = makeSignaturelessTx(provisional.TestChainID, i) + } + + for _, message := range messages { + cs.Enqueue(message) + } + + // Causes the consenter thread to exit after it processes all messages + close(cs.(*chainSupport).chain.(*mockChain).queue) + + it, _ := rl.Iterator(&ab.SeekPosition{Type: &ab.SeekPosition_Specified{Specified: &ab.SeekSpecified{Number: 1}}}) + select { + case <-it.ReadyChan(): + // Will unblock if a block is created + t.Fatalf("Block 1 should not have been created") + case <-cs.(*chainSupport).chain.(*mockChain).done: + // Will unblock once the consenter thread has exited + } +} + // 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() diff --git a/orderer/multichain/systemchain.go b/orderer/multichain/systemchain.go index ac29ef14cd9..f62af0b98f7 100644 --- a/orderer/multichain/systemchain.go +++ b/orderer/multichain/systemchain.go @@ -124,6 +124,9 @@ func (sc *systemChain) proposeChain(configTx *cb.Envelope) cb.Status { ChainID: sc.support.ChainID(), Type: int32(cb.HeaderType_ORDERER_TRANSACTION), }, + SignatureHeader: &cb.SignatureHeader{ + // XXX Appropriately set the signing identity and nonce here + }, }, Data: marshaledEnv, } diff --git a/orderer/multichain/util_test.go b/orderer/multichain/util_test.go index a36019e2797..715b61aac30 100644 --- a/orderer/multichain/util_test.go +++ b/orderer/multichain/util_test.go @@ -32,6 +32,7 @@ func (mc *mockConsenter) HandleChain(support ConsenterSupport) (Chain, error) { queue: make(chan *cb.Envelope), cutter: support.BlockCutter(), support: support, + done: make(chan struct{}), }, nil } @@ -39,6 +40,7 @@ type mockChain struct { queue chan *cb.Envelope support ConsenterSupport cutter blockcutter.Receiver + done chan struct{} } func (mch *mockChain) Enqueue(env *cb.Envelope) bool { @@ -48,6 +50,7 @@ func (mch *mockChain) Enqueue(env *cb.Envelope) bool { func (mch *mockChain) Start() { go func() { + defer close(mch.done) for { msg, ok := <-mch.queue if !ok { @@ -94,6 +97,7 @@ func makeConfigTxWithItems(chainID string, items ...*cb.ConfigurationItem) *cb.E Type: int32(cb.HeaderType_CONFIGURATION_TRANSACTION), ChainID: chainID, }, + SignatureHeader: &cb.SignatureHeader{}, }, Data: utils.MarshalOrPanic(&cb.ConfigurationEnvelope{ Items: signedItems, @@ -103,3 +107,34 @@ func makeConfigTxWithItems(chainID string, items ...*cb.ConfigurationItem) *cb.E Payload: utils.MarshalOrPanic(payload), } } + +func makeNormalTx(chainID string, i int) *cb.Envelope { + payload := &cb.Payload{ + Header: &cb.Header{ + ChainHeader: &cb.ChainHeader{ + Type: int32(cb.HeaderType_ENDORSER_TRANSACTION), + ChainID: chainID, + }, + SignatureHeader: &cb.SignatureHeader{}, + }, + Data: []byte(fmt.Sprintf("%d", i)), + } + return &cb.Envelope{ + Payload: utils.MarshalOrPanic(payload), + } +} + +func makeSignaturelessTx(chainID string, i int) *cb.Envelope { + payload := &cb.Payload{ + Header: &cb.Header{ + ChainHeader: &cb.ChainHeader{ + Type: int32(cb.HeaderType_ENDORSER_TRANSACTION), + ChainID: chainID, + }, + }, + Data: []byte(fmt.Sprintf("%d", i)), + } + return &cb.Envelope{ + Payload: utils.MarshalOrPanic(payload), + } +}