From beb8f5dacb2fdac0e8ffe6362b1333aacff7f4b2 Mon Sep 17 00:00:00 2001 From: "Mark S. Lewis" Date: Tue, 7 Sep 2021 21:24:26 +0100 Subject: [PATCH] Implement chaincode event replay for Fabric Gateway (#2896) * Implement chaincode event replay for Fabric Gateway Signed-off-by: Mark S. Lewis * Default to next commit as start position for ChaincodeEvents Signed-off-by: Mark S. Lewis --- go.mod | 2 +- go.sum | 4 +- integration/gateway/gateway_test.go | 146 ++++++++++++++++-- internal/pkg/gateway/api.go | 33 +++- internal/pkg/gateway/api_test.go | 62 +++++++- .../fabric-protos-go/gateway/gateway.pb.go | 127 ++++++++------- vendor/modules.txt | 2 +- 7 files changed, 296 insertions(+), 80 deletions(-) diff --git a/go.mod b/go.mod index bfa925051e5..f4f1ec58763 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/hyperledger/fabric-chaincode-go v0.0.0-20201119163726-f8ef75b17719 github.com/hyperledger/fabric-config v0.1.0 github.com/hyperledger/fabric-lib-go v1.0.0 - github.com/hyperledger/fabric-protos-go v0.0.0-20210720123151-f0dc3e2a0871 + github.com/hyperledger/fabric-protos-go v0.0.0-20210903093419-e9e1b9f969d8 github.com/kr/pretty v0.2.1 github.com/magiconair/properties v1.8.1 // indirect github.com/mattn/go-runewidth v0.0.4 // indirect diff --git a/go.sum b/go.sum index 68a89248f7a..8f137522a2d 100644 --- a/go.sum +++ b/go.sum @@ -161,8 +161,8 @@ github.com/hyperledger/fabric-lib-go v1.0.0 h1:UL1w7c9LvHZUSkIvHTDGklxFv2kTeva1Q github.com/hyperledger/fabric-lib-go v1.0.0/go.mod h1:H362nMlunurmHwkYqR5uHL2UDWbQdbfz74n8kbCFsqc= github.com/hyperledger/fabric-protos-go v0.0.0-20190919234611-2a87503ac7c9/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-protos-go v0.0.0-20210720123151-f0dc3e2a0871 h1:d7do07Q4LaOFAEWceRwUwVDdcfx3BdLeZYyUGtbHfRk= -github.com/hyperledger/fabric-protos-go v0.0.0-20210720123151-f0dc3e2a0871/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= +github.com/hyperledger/fabric-protos-go v0.0.0-20210903093419-e9e1b9f969d8 h1:6Qt3MdBqww+aJCDaUDIOhA6EcDhQln5l8wqBXehM96A= +github.com/hyperledger/fabric-protos-go v0.0.0-20210903093419-e9e1b9f969d8/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= diff --git a/integration/gateway/gateway_test.go b/integration/gateway/gateway_test.go index a48c0548051..4e112fee961 100644 --- a/integration/gateway/gateway_test.go +++ b/integration/gateway/gateway_test.go @@ -18,6 +18,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/hyperledger/fabric-protos-go/common" "github.com/hyperledger/fabric-protos-go/gateway" + "github.com/hyperledger/fabric-protos-go/orderer" "github.com/hyperledger/fabric-protos-go/peer" "github.com/hyperledger/fabric/integration/nwo" "github.com/hyperledger/fabric/protoutil" @@ -204,6 +205,38 @@ var _ = Describe("GatewayService", func() { return gatewayClient.CommitStatus(ctx, signedStatusRequest) } + chaincodeEvents := func( + ctx context.Context, + startPosition *orderer.SeekPosition, + identity func() ([]byte, error), + sign func(msg []byte) ([]byte, error), + ) (gateway.Gateway_ChaincodeEventsClient, error) { + identityBytes, err := identity() + Expect(err).NotTo(HaveOccurred()) + + request := &gateway.ChaincodeEventsRequest{ + ChannelId: "testchannel", + ChaincodeId: "gatewaycc", + Identity: identityBytes, + } + if startPosition != nil { + request.StartPosition = startPosition + } + + requestBytes, err := proto.Marshal(request) + Expect(err).NotTo(HaveOccurred()) + + signature, err := sign(requestBytes) + Expect(err).NotTo(HaveOccurred()) + + signedRequest := &gateway.SignedChaincodeEventsRequest{ + Request: requestBytes, + Signature: signature, + } + + return gatewayClient.ChaincodeEvents(ctx, signedRequest) + } + Describe("Evaluate", func() { It("should respond with the expected result", func() { proposedTransaction, transactionID := NewProposedTransaction(signingIdentity, "testchannel", "gatewaycc", "respond", nil, []byte("200"), []byte("conga message"), []byte("conga payload")) @@ -244,10 +277,10 @@ var _ = Describe("GatewayService", func() { Describe("CommitStatus", func() { It("should respond with status of submitted transaction", func() { _, transactionID := submitTransaction("respond", []byte("200"), []byte("conga message"), []byte("conga payload")) - status, err := commitStatus(transactionID, signingIdentity.Serialize, signingIdentity.Sign) + statusResult, err := commitStatus(transactionID, signingIdentity.Serialize, signingIdentity.Sign) Expect(err).NotTo(HaveOccurred()) - Expect(status.Result).To(Equal(peer.TxValidationCode_VALID)) + Expect(statusResult.Result).To(Equal(peer.TxValidationCode_VALID)) }) It("should respond with block number", func() { @@ -287,30 +320,73 @@ var _ = Describe("GatewayService", func() { Describe("ChaincodeEvents", func() { It("should respond with emitted chaincode events", func() { - identityBytes, err := signingIdentity.Serialize() + eventCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + startPosition := &orderer.SeekPosition{ + Type: &orderer.SeekPosition_NextCommit{ + NextCommit: &orderer.SeekNextCommit{}, + }, + } + + eventsClient, err := chaincodeEvents(eventCtx, startPosition, signingIdentity.Serialize, signingIdentity.Sign) + Expect(err).NotTo(HaveOccurred()) + + _, transactionID := submitTransaction("event", []byte("EVENT_NAME"), []byte("EVENT_PAYLOAD")) + + event, err := eventsClient.Recv() Expect(err).NotTo(HaveOccurred()) - request := &gateway.ChaincodeEventsRequest{ - ChannelId: "testchannel", + Expect(event.Events).To(HaveLen(1), "number of events") + expectedEvent := &peer.ChaincodeEvent{ ChaincodeId: "gatewaycc", - Identity: identityBytes, + TxId: transactionID, + EventName: "EVENT_NAME", + Payload: []byte("EVENT_PAYLOAD"), + } + Expect(proto.Equal(event.Events[0], expectedEvent)).To(BeTrue(), "Expected\n\t%#v\nto proto.Equal\n\t%#v", event.Events[0], expectedEvent) + }) + + It("should respond with replayed chaincode events", func() { + _, transactionID := submitTransaction("event", []byte("EVENT_NAME"), []byte("EVENT_PAYLOAD")) + statusResult, err := commitStatus(transactionID, signingIdentity.Serialize, signingIdentity.Sign) + Expect(err).NotTo(HaveOccurred()) + + eventCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + startPosition := &orderer.SeekPosition{ + Type: &orderer.SeekPosition_Specified{ + Specified: &orderer.SeekSpecified{ + Number: statusResult.BlockNumber, + }, + }, } - requestBytes, err := proto.Marshal(request) + eventsClient, err := chaincodeEvents(eventCtx, startPosition, signingIdentity.Serialize, signingIdentity.Sign) Expect(err).NotTo(HaveOccurred()) - signature, err := signingIdentity.Sign(requestBytes) + event, err := eventsClient.Recv() Expect(err).NotTo(HaveOccurred()) - signedRequest := &gateway.SignedChaincodeEventsRequest{ - Request: requestBytes, - Signature: signature, + Expect(event.BlockNumber).To(Equal(statusResult.BlockNumber), "block number") + Expect(event.Events).To(HaveLen(1), "number of events") + expectedEvent := &peer.ChaincodeEvent{ + ChaincodeId: "gatewaycc", + TxId: transactionID, + EventName: "EVENT_NAME", + Payload: []byte("EVENT_PAYLOAD"), } + Expect(proto.Equal(event.Events[0], expectedEvent)).To(BeTrue(), "Expected\n\t%#v\nto proto.Equal\n\t%#v", event.Events[0], expectedEvent) + }) + It("should default to next commit if start position not specified", func() { eventCtx, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() - eventsClient, err := gatewayClient.ChaincodeEvents(eventCtx, signedRequest) + var startPosition *orderer.SeekPosition + + eventsClient, err := chaincodeEvents(eventCtx, startPosition, signingIdentity.Serialize, signingIdentity.Sign) Expect(err).NotTo(HaveOccurred()) _, transactionID := submitTransaction("event", []byte("EVENT_NAME"), []byte("EVENT_PAYLOAD")) @@ -327,5 +403,51 @@ var _ = Describe("GatewayService", func() { } Expect(proto.Equal(event.Events[0], expectedEvent)).To(BeTrue(), "Expected\n\t%#v\nto proto.Equal\n\t%#v", event.Events[0], expectedEvent) }) + + It("should fail on unauthorized identity", func() { + badIdentity := network.OrdererUserSigner(network.Orderer("orderer"), "Admin") + + eventCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + startPosition := &orderer.SeekPosition{ + Type: &orderer.SeekPosition_NextCommit{ + NextCommit: &orderer.SeekNextCommit{}, + }, + } + + eventsClient, err := chaincodeEvents(eventCtx, startPosition, badIdentity.Serialize, signingIdentity.Sign) + Expect(err).NotTo(HaveOccurred()) + + event, err := eventsClient.Recv() + Expect(err).To(HaveOccurred(), "expected error but got event: %v", event) + + grpcErr, _ := status.FromError(err) + Expect(grpcErr.Code()).To(Equal(codes.PermissionDenied)) + }) + + It("should fail on bad signature", func() { + badSign := func(digest []byte) ([]byte, error) { + return signingIdentity.Sign([]byte("WRONG")) + } + + eventCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + startPosition := &orderer.SeekPosition{ + Type: &orderer.SeekPosition_NextCommit{ + NextCommit: &orderer.SeekNextCommit{}, + }, + } + + eventsClient, err := chaincodeEvents(eventCtx, startPosition, signingIdentity.Serialize, badSign) + Expect(err).NotTo(HaveOccurred()) + + event, err := eventsClient.Recv() + Expect(err).To(HaveOccurred(), "expected error but got event: %v", event) + + grpcErr, _ := status.FromError(err) + Expect(grpcErr.Code()).To(Equal(codes.PermissionDenied)) + }) }) }) diff --git a/internal/pkg/gateway/api.go b/internal/pkg/gateway/api.go index 9942498cfd5..2ae6830e81e 100644 --- a/internal/pkg/gateway/api.go +++ b/internal/pkg/gateway/api.go @@ -14,6 +14,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/hyperledger/fabric-protos-go/common" gp "github.com/hyperledger/fabric-protos-go/gateway" + ab "github.com/hyperledger/fabric-protos-go/orderer" "github.com/hyperledger/fabric-protos-go/peer" "github.com/hyperledger/fabric/core/aclmgmt/resources" "github.com/hyperledger/fabric/internal/pkg/gateway/event" @@ -356,17 +357,37 @@ func (gs *Server) ChaincodeEvents(signedRequest *gp.SignedChaincodeEventsRequest return status.Error(codes.PermissionDenied, err.Error()) } - ledger, err := gs.ledgerProvider.Ledger(request.ChannelId) + ledger, err := gs.ledgerProvider.Ledger(request.GetChannelId()) if err != nil { return status.Error(codes.InvalidArgument, err.Error()) } - ledgerInfo, err := ledger.GetBlockchainInfo() - if err != nil { - return status.Error(codes.Unavailable, err.Error()) + var startBlock uint64 + switch seek := request.GetStartPosition().GetType().(type) { + case nil: + ledgerInfo, err := ledger.GetBlockchainInfo() + if err != nil { + return status.Error(codes.Unavailable, err.Error()) + } + + startBlock = ledgerInfo.GetHeight() + + case *ab.SeekPosition_NextCommit: + ledgerInfo, err := ledger.GetBlockchainInfo() + if err != nil { + return status.Error(codes.Unavailable, err.Error()) + } + + startBlock = ledgerInfo.GetHeight() + + case *ab.SeekPosition_Specified: + startBlock = seek.Specified.GetNumber() + + default: + return status.Errorf(codes.InvalidArgument, "invalid start position type: %T", seek) } - ledgerIter, err := ledger.GetBlocksIterator(ledgerInfo.Height) + ledgerIter, err := ledger.GetBlocksIterator(startBlock) if err != nil { return status.Error(codes.Unavailable, err.Error()) } @@ -383,7 +404,7 @@ func (gs *Server) ChaincodeEvents(signedRequest *gp.SignedChaincodeEventsRequest var matchingEvents []*peer.ChaincodeEvent for _, event := range response.Events { - if event.GetChaincodeId() == request.ChaincodeId { + if event.GetChaincodeId() == request.GetChaincodeId() { matchingEvents = append(matchingEvents, event) } } diff --git a/internal/pkg/gateway/api_test.go b/internal/pkg/gateway/api_test.go index a61ac0c751f..f93fffab519 100644 --- a/internal/pkg/gateway/api_test.go +++ b/internal/pkg/gateway/api_test.go @@ -147,6 +147,7 @@ type testDef struct { transientData map[string][]byte interest *peer.ChaincodeInterest blocks []*cp.Block + startPosition *ab.SeekPosition } type preparedTest struct { @@ -1176,7 +1177,51 @@ func TestChaincodeEvents(t *testing.T) { }, }, { - name: "uses block height as default start block", + name: "uses block height as start block if next commit is specified as start position", + blocks: []*cp.Block{ + block101Proto, + }, + postSetup: func(t *testing.T, test *preparedTest) { + ledgerInfo := &cp.BlockchainInfo{ + Height: 101, + } + test.ledger.GetBlockchainInfoReturns(ledgerInfo, nil) + }, + startPosition: &ab.SeekPosition{ + Type: &ab.SeekPosition_NextCommit{ + NextCommit: &ab.SeekNextCommit{}, + }, + }, + postTest: func(t *testing.T, test *preparedTest) { + require.Equal(t, 1, test.ledger.GetBlocksIteratorCallCount()) + require.EqualValues(t, 101, test.ledger.GetBlocksIteratorArgsForCall(0)) + }, + }, + { + name: "uses specified start block", + blocks: []*cp.Block{ + block101Proto, + }, + postSetup: func(t *testing.T, test *preparedTest) { + ledgerInfo := &cp.BlockchainInfo{ + Height: 101, + } + test.ledger.GetBlockchainInfoReturns(ledgerInfo, nil) + }, + startPosition: &ab.SeekPosition{ + Type: &ab.SeekPosition_Specified{ + Specified: &ab.SeekSpecified{ + Number: 99, + }, + }, + }, + postTest: func(t *testing.T, test *preparedTest) { + require.Equal(t, 1, test.ledger.GetBlocksIteratorCallCount()) + require.EqualValues(t, 99, test.ledger.GetBlocksIteratorArgsForCall(0)) + }, + }, + { + name: "defaults to next commit if start position not specified", blocks: []*cp.Block{ block101Proto, }, @@ -1191,6 +1236,18 @@ func TestChaincodeEvents(t *testing.T) { require.EqualValues(t, 101, test.ledger.GetBlocksIteratorArgsForCall(0)) }, }, + { + name: "returns error for unsupported start position type", + blocks: []*cp.Block{ + block101Proto, + }, + startPosition: &ab.SeekPosition{ + Type: &ab.SeekPosition_Oldest{ + Oldest: &ab.SeekOldest{}, + }, + }, + errString: "rpc error: code = InvalidArgument desc = invalid start position type: *orderer.SeekPosition_Oldest", + }, { name: "returns error obtaining ledger iterator", blocks: []*cp.Block{ @@ -1245,6 +1302,9 @@ func TestChaincodeEvents(t *testing.T) { Identity: tt.identity, ChaincodeId: testChaincode, } + if tt.startPosition != nil { + request.StartPosition = tt.startPosition + } requestBytes, err := proto.Marshal(request) require.NoError(t, err) diff --git a/vendor/github.com/hyperledger/fabric-protos-go/gateway/gateway.pb.go b/vendor/github.com/hyperledger/fabric-protos-go/gateway/gateway.pb.go index a928a59fabc..002658384c2 100644 --- a/vendor/github.com/hyperledger/fabric-protos-go/gateway/gateway.pb.go +++ b/vendor/github.com/hyperledger/fabric-protos-go/gateway/gateway.pb.go @@ -8,6 +8,7 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" common "github.com/hyperledger/fabric-protos-go/common" + orderer "github.com/hyperledger/fabric-protos-go/orderer" peer "github.com/hyperledger/fabric-protos-go/peer" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -569,10 +570,12 @@ type ChaincodeEventsRequest struct { // Name of the chaincode for which events are requested. ChaincodeId string `protobuf:"bytes,2,opt,name=chaincode_id,json=chaincodeId,proto3" json:"chaincode_id,omitempty"` // Client requestor identity. - Identity []byte `protobuf:"bytes,3,opt,name=identity,proto3" json:"identity,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Identity []byte `protobuf:"bytes,3,opt,name=identity,proto3" json:"identity,omitempty"` + // Position within the ledger at which to start reading events. + StartPosition *orderer.SeekPosition `protobuf:"bytes,4,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ChaincodeEventsRequest) Reset() { *m = ChaincodeEventsRequest{} } @@ -621,6 +624,13 @@ func (m *ChaincodeEventsRequest) GetIdentity() []byte { return nil } +func (m *ChaincodeEventsRequest) GetStartPosition() *orderer.SeekPosition { + if m != nil { + return m.StartPosition + } + return nil +} + // ChaincodeEventsResponse returns chaincode events emitted from a specific block. type ChaincodeEventsResponse struct { // Chaincode events emitted by the requested chaincode. The events are presented in the same order that the @@ -877,59 +887,62 @@ func init() { func init() { proto.RegisterFile("gateway/gateway.proto", fileDescriptor_285396c8df15061f) } var fileDescriptor_285396c8df15061f = []byte{ - // 820 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcb, 0x6e, 0xe3, 0x36, - 0x14, 0x85, 0xe2, 0xa9, 0x1f, 0xd7, 0x8e, 0x27, 0x90, 0x33, 0xb6, 0x47, 0xc8, 0x00, 0x1e, 0x01, - 0x01, 0xbc, 0xe8, 0xd8, 0x53, 0x77, 0x51, 0x14, 0x18, 0xa0, 0xc0, 0x04, 0x46, 0xe1, 0x4d, 0xeb, - 0xca, 0x83, 0x59, 0x04, 0x05, 0x0c, 0xda, 0x62, 0x65, 0x21, 0x12, 0xa9, 0x92, 0x94, 0xd3, 0x74, - 0xd5, 0x8f, 0xe8, 0xaa, 0x7f, 0xd0, 0x0f, 0xea, 0xa6, 0xdf, 0xd1, 0x0f, 0x28, 0x44, 0x91, 0x7a, - 0xf8, 0x91, 0x26, 0x68, 0x16, 0xb3, 0x92, 0x79, 0x1f, 0xe4, 0xb9, 0x97, 0xe7, 0x1e, 0x1a, 0x5e, - 0x78, 0x48, 0xe0, 0x5b, 0x74, 0x37, 0x56, 0xdf, 0x51, 0xc4, 0xa8, 0xa0, 0x66, 0x4d, 0x2d, 0x2d, - 0x2b, 0xc2, 0x98, 0x8d, 0xd7, 0x1b, 0xe4, 0x93, 0x35, 0x75, 0xf1, 0x12, 0x6f, 0x31, 0x11, 0x69, - 0x90, 0xd5, 0x91, 0xbe, 0x88, 0xd1, 0x88, 0x72, 0x14, 0x28, 0xe3, 0x45, 0xc9, 0xb8, 0x64, 0x98, - 0x47, 0x94, 0x70, 0xac, 0xbc, 0x5d, 0xe9, 0x15, 0x0c, 0x11, 0x8e, 0xd6, 0xc2, 0xa7, 0x44, 0x6f, - 0xb5, 0xa6, 0x61, 0x48, 0xc9, 0x38, 0xfd, 0xa4, 0x46, 0xfb, 0x6f, 0x03, 0xda, 0x53, 0xe2, 0x52, - 0xc6, 0xb1, 0x83, 0x7f, 0x8e, 0x31, 0x17, 0xe6, 0x25, 0xb4, 0x0b, 0xc9, 0x4b, 0xdf, 0xed, 0x1b, - 0x03, 0x63, 0xd8, 0x70, 0x4e, 0x0b, 0xd6, 0x99, 0x6b, 0xbe, 0x02, 0x58, 0x6f, 0x10, 0x21, 0x38, - 0x48, 0x42, 0x4e, 0x64, 0x48, 0x43, 0x59, 0x66, 0xae, 0x39, 0x83, 0xf3, 0x14, 0x20, 0x76, 0x97, - 0x85, 0xc4, 0x7e, 0x65, 0x60, 0x0c, 0x9b, 0x93, 0x6e, 0x7a, 0x3c, 0x1f, 0x2d, 0x7c, 0x8f, 0x60, - 0x77, 0xae, 0x4a, 0x71, 0x3a, 0x3a, 0xe7, 0x43, 0x9e, 0x62, 0x7e, 0x05, 0x3d, 0x2c, 0x21, 0xfa, - 0xc4, 0x5b, 0x52, 0xe6, 0x21, 0xe2, 0xff, 0x8a, 0x12, 0x0f, 0xef, 0x3f, 0x1b, 0x54, 0x86, 0x0d, - 0xa7, 0x9b, 0xb9, 0xbf, 0x2f, 0x7a, 0xed, 0xdf, 0x0c, 0x78, 0x9e, 0x15, 0x97, 0xf6, 0xc8, 0x1c, - 0x42, 0x95, 0x61, 0x1e, 0x07, 0x42, 0x56, 0xd5, 0x9c, 0x9c, 0x69, 0x24, 0x3a, 0xc2, 0x51, 0x7e, - 0xf3, 0x2a, 0xa9, 0x00, 0x47, 0x88, 0xed, 0x54, 0x70, 0xa2, 0xf2, 0x54, 0x1f, 0xa7, 0x64, 0x8b, - 0x03, 0x1a, 0xe1, 0x04, 0x7b, 0x1a, 0x5d, 0xc0, 0x6e, 0xff, 0x61, 0xc0, 0xe9, 0x22, 0x5e, 0x85, - 0xbe, 0x78, 0xda, 0xf6, 0x1e, 0x03, 0x57, 0x79, 0x0c, 0xb8, 0x33, 0x68, 0x6b, 0x6c, 0x69, 0xed, - 0xf6, 0x02, 0x5e, 0xa6, 0x37, 0x72, 0x45, 0xc3, 0xd0, 0x17, 0x0b, 0x81, 0x44, 0xcc, 0x35, 0xf2, - 0x3e, 0xd4, 0x58, 0xfa, 0x53, 0x42, 0x6e, 0x39, 0x7a, 0x69, 0x5e, 0x40, 0x83, 0xfb, 0x1e, 0x41, - 0x22, 0x66, 0x58, 0x62, 0x6d, 0x39, 0xb9, 0xc1, 0xbe, 0x85, 0xce, 0xa1, 0xed, 0x9e, 0xa6, 0x11, - 0x16, 0xd4, 0x7d, 0x17, 0x13, 0xe1, 0x8b, 0x3b, 0x59, 0x7c, 0xcb, 0xc9, 0xd6, 0xf6, 0x0d, 0x9c, - 0x97, 0x0f, 0x56, 0x1c, 0x78, 0x5b, 0xe2, 0x40, 0x7b, 0xd2, 0xd7, 0x1c, 0xf8, 0xf0, 0xcb, 0x47, - 0x14, 0xf8, 0xae, 0xa4, 0xcf, 0x15, 0x75, 0x73, 0x2e, 0xbc, 0x86, 0xd6, 0x2a, 0xa0, 0xeb, 0x9b, - 0x25, 0x89, 0xc3, 0x15, 0x66, 0x12, 0xc6, 0x33, 0xa7, 0x29, 0x6d, 0xdf, 0x49, 0x93, 0xfd, 0x57, - 0x42, 0xb6, 0x2d, 0x0a, 0x62, 0x24, 0x3e, 0xdd, 0x51, 0xfa, 0x02, 0xce, 0x05, 0x62, 0x1e, 0x16, - 0x07, 0xe7, 0xa8, 0x93, 0xfa, 0xca, 0x43, 0xf4, 0x0e, 0xce, 0xf2, 0xb2, 0x1e, 0x3b, 0x44, 0xf6, - 0x47, 0xb8, 0x50, 0x84, 0xd2, 0xf2, 0x36, 0x4d, 0xd4, 0xed, 0x7f, 0x73, 0x6a, 0x0b, 0xdd, 0x23, - 0x3b, 0x96, 0x9b, 0x69, 0xec, 0x36, 0xf3, 0x35, 0xb4, 0x72, 0xa5, 0xcd, 0xba, 0xdd, 0xcc, 0x6c, - 0xff, 0x41, 0xa9, 0x00, 0x7a, 0x7b, 0xe7, 0xaa, 0xa6, 0x8c, 0xa0, 0x2a, 0x95, 0x9b, 0xf7, 0x8d, - 0x41, 0xa5, 0x78, 0x31, 0xe5, 0x04, 0x47, 0x45, 0x3d, 0x84, 0x53, 0xd7, 0x70, 0x3a, 0x25, 0x6e, - 0x44, 0x7d, 0x22, 0xa6, 0x8c, 0x51, 0x96, 0xb4, 0x0b, 0xb9, 0x2e, 0xc3, 0x9c, 0xab, 0xca, 0xf4, - 0xd2, 0x7c, 0x01, 0xd5, 0x90, 0x47, 0x79, 0x45, 0x9f, 0x85, 0x3c, 0x9a, 0xb9, 0x49, 0x42, 0x88, - 0x39, 0x47, 0x1e, 0x96, 0xa5, 0x34, 0x1c, 0xbd, 0xb4, 0xff, 0x34, 0xa0, 0x33, 0x3f, 0x40, 0x91, - 0x07, 0x72, 0x76, 0x02, 0x75, 0xfd, 0x00, 0x29, 0x45, 0x3c, 0x46, 0xc4, 0x2c, 0xee, 0x3e, 0x21, - 0xaf, 0xdc, 0x2b, 0xe4, 0xbf, 0x4b, 0xac, 0x7b, 0x02, 0xf6, 0x50, 0xac, 0x9f, 0x43, 0x1d, 0x2b, - 0x21, 0x3c, 0xaa, 0xde, 0x59, 0x44, 0x81, 0xdc, 0x95, 0xfb, 0xc9, 0x3d, 0xf9, 0xe7, 0x04, 0x6a, - 0xdf, 0xa6, 0x8f, 0xb8, 0xf9, 0x0e, 0x6a, 0xea, 0xa9, 0x31, 0x7b, 0x23, 0xfd, 0xd0, 0x97, 0x5f, - 0x56, 0xab, 0xbf, 0xef, 0x50, 0xdc, 0xf9, 0x1a, 0xaa, 0xa9, 0x12, 0x9b, 0xdd, 0x2c, 0xa6, 0xf4, - 0x6c, 0x58, 0xbd, 0x3d, 0xbb, 0x4a, 0xfd, 0x01, 0x5a, 0x45, 0x91, 0x33, 0xed, 0x3c, 0xf0, 0x98, - 0x92, 0x5b, 0xaf, 0xb2, 0x98, 0x83, 0xfa, 0xf8, 0x0d, 0xd4, 0xf5, 0xc8, 0x9b, 0x05, 0xcc, 0x65, - 0x71, 0xb3, 0x5e, 0x1e, 0xf0, 0xa8, 0x0d, 0x7e, 0x84, 0xe7, 0x3b, 0x53, 0x62, 0x5e, 0xee, 0xc2, - 0x3a, 0x38, 0xbd, 0xd6, 0x20, 0x47, 0x76, 0x78, 0xcc, 0xde, 0x1a, 0xef, 0x37, 0x70, 0x49, 0x99, - 0x37, 0xda, 0xdc, 0x45, 0x98, 0x05, 0xd8, 0xf5, 0x30, 0x1b, 0xfd, 0x84, 0x56, 0xcc, 0x5f, 0xeb, - 0x8b, 0x52, 0x5b, 0xbc, 0x6f, 0xa9, 0xcb, 0x99, 0x27, 0xe6, 0xb9, 0x71, 0x3d, 0xf6, 0x7c, 0xb1, - 0x89, 0x57, 0xc9, 0xdd, 0x8f, 0x0b, 0xd9, 0xe3, 0x34, 0xfb, 0x4d, 0x9a, 0xfd, 0xc6, 0xa3, 0xfa, - 0x8f, 0xda, 0xaa, 0x2a, 0x4d, 0x5f, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc7, 0x98, 0x25, 0x58, - 0xc2, 0x09, 0x00, 0x00, + // 865 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcd, 0x6e, 0xdb, 0x46, + 0x10, 0x06, 0x2d, 0x57, 0xb6, 0xc6, 0xb2, 0x62, 0x50, 0xb6, 0xac, 0x10, 0x0e, 0xa0, 0x10, 0x30, + 0xe0, 0x43, 0x23, 0xa5, 0xea, 0xa1, 0x28, 0x60, 0xa0, 0x40, 0x0c, 0xa1, 0xf0, 0xa5, 0x55, 0xa9, + 0x20, 0x87, 0xa0, 0x80, 0xb0, 0x12, 0xa7, 0xd4, 0xc2, 0xe4, 0x2e, 0xbb, 0xbb, 0x72, 0xea, 0x9e, + 0xfa, 0x10, 0x3d, 0xf5, 0x0d, 0x7a, 0xef, 0xab, 0xf4, 0xd2, 0xe7, 0xe8, 0x03, 0x14, 0x5c, 0xee, + 0x52, 0xa4, 0x2d, 0x09, 0x0e, 0xea, 0x43, 0x4e, 0xd2, 0xce, 0xcf, 0xf2, 0x9b, 0x99, 0x6f, 0x66, + 0x16, 0x4e, 0x22, 0xa2, 0xf0, 0x03, 0xb9, 0x1b, 0x98, 0xdf, 0x7e, 0x2a, 0xb8, 0xe2, 0xee, 0x9e, + 0x39, 0x7a, 0x5e, 0x8a, 0x28, 0x06, 0xf3, 0x05, 0xa1, 0x6c, 0xce, 0x43, 0x9c, 0xe2, 0x2d, 0x32, + 0x95, 0x1b, 0x79, 0x6d, 0xad, 0x4b, 0x05, 0x4f, 0xb9, 0x24, 0xb1, 0x11, 0x9e, 0x55, 0x84, 0x53, + 0x81, 0x32, 0xe5, 0x4c, 0xa2, 0xd1, 0x76, 0xb4, 0x56, 0x09, 0xc2, 0x24, 0x99, 0x2b, 0xca, 0x99, + 0xbd, 0x6a, 0xce, 0x93, 0x84, 0xb3, 0x41, 0xfe, 0x63, 0x84, 0x47, 0x5c, 0x84, 0x28, 0x50, 0x0c, + 0xc8, 0x2c, 0x97, 0xf8, 0xff, 0x38, 0xd0, 0x1a, 0xb1, 0x90, 0x0b, 0x89, 0x01, 0xfe, 0xbc, 0x44, + 0xa9, 0xdc, 0x73, 0x68, 0x95, 0xae, 0x9b, 0xd2, 0xb0, 0xeb, 0xf4, 0x9c, 0x8b, 0x46, 0x70, 0x58, + 0x92, 0x5e, 0x87, 0xee, 0x0b, 0x80, 0xf9, 0x82, 0x30, 0x86, 0x71, 0x66, 0xb2, 0xa3, 0x4d, 0x1a, + 0x46, 0x72, 0x1d, 0xba, 0xd7, 0x70, 0x9c, 0x43, 0xc6, 0x70, 0x5a, 0x72, 0xec, 0xd6, 0x7a, 0xce, + 0xc5, 0xc1, 0xb0, 0x93, 0x7f, 0x5e, 0xf6, 0x27, 0x34, 0x62, 0x18, 0x8e, 0x4d, 0x70, 0x41, 0xdb, + 0xfa, 0xbc, 0x5d, 0xb9, 0xb8, 0x5f, 0xc1, 0x29, 0x6a, 0x88, 0x94, 0x45, 0x53, 0x2e, 0x22, 0xc2, + 0xe8, 0xaf, 0x24, 0xd3, 0xc8, 0xee, 0x6e, 0xaf, 0x76, 0xd1, 0x08, 0x3a, 0x85, 0xfa, 0xfb, 0xb2, + 0xd6, 0xff, 0xcd, 0x81, 0x67, 0x45, 0x70, 0x79, 0xd6, 0xdc, 0x0b, 0xa8, 0x0b, 0x94, 0xcb, 0x58, + 0xe9, 0xa8, 0x0e, 0x86, 0x47, 0x16, 0x89, 0xb5, 0x08, 0x8c, 0xde, 0xbd, 0xca, 0x22, 0xc0, 0x94, + 0x88, 0x7b, 0x11, 0xec, 0x18, 0x3f, 0x93, 0xd9, 0x11, 0xbb, 0xc5, 0x98, 0xa7, 0x98, 0x61, 0xcf, + 0xad, 0x4b, 0xd8, 0xfd, 0x3f, 0x1c, 0x38, 0x9c, 0x2c, 0x67, 0x09, 0x55, 0x4f, 0x9b, 0xde, 0x4d, + 0xe0, 0x6a, 0x1f, 0x03, 0xee, 0x08, 0x5a, 0x16, 0x5b, 0x1e, 0xbb, 0x3f, 0x81, 0xe7, 0x79, 0x45, + 0xae, 0x78, 0x92, 0x50, 0x35, 0x51, 0x44, 0x2d, 0xa5, 0x45, 0xde, 0x85, 0x3d, 0x91, 0xff, 0xd5, + 0x90, 0x9b, 0x81, 0x3d, 0xba, 0x67, 0xd0, 0x90, 0x34, 0x62, 0x44, 0x2d, 0x05, 0x6a, 0xac, 0xcd, + 0x60, 0x25, 0xf0, 0x3f, 0x40, 0x7b, 0xdd, 0x75, 0x4f, 0x93, 0x08, 0x0f, 0xf6, 0x69, 0x88, 0x4c, + 0x51, 0x75, 0xa7, 0x83, 0x6f, 0x06, 0xc5, 0xd9, 0xbf, 0x81, 0xe3, 0xea, 0x87, 0x0d, 0x07, 0x5e, + 0x57, 0x38, 0xd0, 0x1a, 0x76, 0x2d, 0x07, 0xde, 0xfe, 0xf2, 0x8e, 0xc4, 0x34, 0xd4, 0xf4, 0xb9, + 0xe2, 0xe1, 0x8a, 0x0b, 0x2f, 0xa1, 0x39, 0x8b, 0xf9, 0xfc, 0x66, 0xca, 0x96, 0xc9, 0x0c, 0x85, + 0x86, 0xb1, 0x1b, 0x1c, 0x68, 0xd9, 0x77, 0x5a, 0xe4, 0xff, 0x9d, 0x91, 0xed, 0x96, 0xc4, 0x4b, + 0xa2, 0x3e, 0xdd, 0x56, 0xfa, 0x02, 0x8e, 0x15, 0x11, 0x11, 0xaa, 0xb5, 0x7d, 0xd4, 0xce, 0x75, + 0xd5, 0x26, 0xba, 0x84, 0xa3, 0x55, 0x58, 0x1f, 0xdb, 0x44, 0xfe, 0x3b, 0x38, 0x33, 0x84, 0xb2, + 0x03, 0x6f, 0x94, 0xcd, 0xbb, 0xff, 0xcd, 0xa9, 0xbf, 0x1c, 0xe8, 0x6c, 0xb8, 0xb2, 0x9a, 0x4d, + 0xe7, 0x7e, 0x36, 0x5f, 0x42, 0x73, 0x35, 0x7c, 0x8b, 0x74, 0x1f, 0x14, 0xb2, 0xed, 0x9c, 0x72, + 0x2f, 0xa1, 0x25, 0x15, 0x11, 0x6a, 0x9a, 0x72, 0x49, 0x75, 0x19, 0x76, 0x75, 0x0a, 0x4e, 0xfa, + 0x66, 0xb6, 0xf6, 0x27, 0x88, 0x37, 0x63, 0xa3, 0x0c, 0x0e, 0xb5, 0xb1, 0x3d, 0xfa, 0x31, 0x9c, + 0x3e, 0x40, 0x6d, 0x72, 0xda, 0x87, 0xba, 0x5e, 0x05, 0xb2, 0xeb, 0xf4, 0x6a, 0xe5, 0xba, 0x56, + 0x1d, 0x02, 0x63, 0xf5, 0x18, 0x4a, 0xbe, 0x87, 0xc3, 0x11, 0x0b, 0x53, 0x4e, 0x99, 0x1a, 0x09, + 0xc1, 0x45, 0x96, 0x6d, 0x12, 0x86, 0x02, 0xa5, 0x34, 0x79, 0xb1, 0x47, 0xf7, 0x04, 0xea, 0x89, + 0x4c, 0x57, 0xf9, 0xf8, 0x2c, 0x91, 0xe9, 0x75, 0x98, 0x39, 0x24, 0x28, 0x25, 0x89, 0x50, 0x27, + 0xa2, 0x11, 0xd8, 0xa3, 0xff, 0xa7, 0x03, 0xed, 0xf1, 0x1a, 0x86, 0x3d, 0x92, 0xf2, 0x43, 0xd8, + 0xb7, 0x1b, 0xcd, 0x0c, 0xd4, 0x4d, 0x3c, 0x2e, 0xec, 0xb6, 0xed, 0x81, 0xda, 0xd6, 0x3d, 0xf0, + 0xbb, 0xc6, 0xfa, 0x60, 0xfe, 0x3d, 0x16, 0xeb, 0xe7, 0xb0, 0x8f, 0x66, 0x8e, 0x6e, 0x1c, 0xfe, + 0x85, 0x45, 0xa9, 0x37, 0x6a, 0xdb, 0x7b, 0x63, 0xf8, 0xef, 0x0e, 0xec, 0x7d, 0x9b, 0xbf, 0x0a, + 0xdc, 0x4b, 0xd8, 0x33, 0x9b, 0xca, 0x3d, 0xed, 0xdb, 0x97, 0x43, 0x75, 0x31, 0x7b, 0xdd, 0x87, + 0x0a, 0xc3, 0x9d, 0xaf, 0xa1, 0x9e, 0x0f, 0x72, 0xb7, 0x53, 0xd8, 0x54, 0xb6, 0x8e, 0x77, 0xfa, + 0x40, 0x6e, 0x5c, 0x7f, 0x80, 0x66, 0x79, 0x46, 0xba, 0xfe, 0xca, 0x70, 0xd3, 0x22, 0xf0, 0x5e, + 0x14, 0x36, 0x6b, 0xc7, 0xeb, 0x37, 0xb0, 0x6f, 0x27, 0x86, 0x5b, 0xc2, 0x5c, 0x9d, 0x8d, 0xde, + 0xf3, 0x35, 0x1a, 0x73, 0xc1, 0x8f, 0xf0, 0xec, 0x5e, 0x97, 0xb8, 0xe7, 0xf7, 0x61, 0xad, 0xed, + 0x7d, 0xaf, 0xb7, 0x42, 0xb6, 0xbe, 0xcd, 0x5e, 0x3b, 0x6f, 0x16, 0x70, 0xce, 0x45, 0xd4, 0x5f, + 0xdc, 0xa5, 0x28, 0x62, 0x0c, 0x23, 0x14, 0xfd, 0x9f, 0xc8, 0x4c, 0xd0, 0xb9, 0x2d, 0x94, 0xb9, + 0xe2, 0x4d, 0xd3, 0x14, 0x67, 0x9c, 0x89, 0xc7, 0xce, 0xfb, 0x41, 0x44, 0xd5, 0x62, 0x39, 0xcb, + 0x6a, 0x3f, 0x28, 0x79, 0x0f, 0x72, 0xef, 0x57, 0xb9, 0xf7, 0xab, 0x88, 0xdb, 0x97, 0xdf, 0xac, + 0xae, 0x45, 0x5f, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, 0xe2, 0x75, 0xb1, 0xfb, 0x13, 0x0a, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/vendor/modules.txt b/vendor/modules.txt index 8a8fe3d5271..d9f349eda03 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -195,7 +195,7 @@ github.com/hyperledger/fabric-config/protolator/protoext/peerext # github.com/hyperledger/fabric-lib-go v1.0.0 ## explicit github.com/hyperledger/fabric-lib-go/healthz -# github.com/hyperledger/fabric-protos-go v0.0.0-20210720123151-f0dc3e2a0871 +# github.com/hyperledger/fabric-protos-go v0.0.0-20210903093419-e9e1b9f969d8 ## explicit github.com/hyperledger/fabric-protos-go/common github.com/hyperledger/fabric-protos-go/discovery