From 99f9ee0f63627462e4daa3e785ec23086aa3a0b5 Mon Sep 17 00:00:00 2001 From: William Banfield <4561443+williambanfield@users.noreply.github.com> Date: Fri, 1 Apr 2022 17:44:38 -0400 Subject: [PATCH 1/5] abci++: correct max-size check to only operate on added and unmodified (#8242) --- types/tx.go | 14 ++++++++------ types/tx_test.go | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/types/tx.go b/types/tx.go index b81114452..0c354a941 100644 --- a/types/tx.go +++ b/types/tx.go @@ -188,13 +188,7 @@ func (t TxRecordSet) Validate(maxSizeBytes int64, otxs Txs) error { // Only the slices are copied, the transaction contents are shared. allCopy := sortedCopy(t.all) - var size int64 for i, cur := range allCopy { - size += int64(len(cur)) - if size > maxSizeBytes { - return fmt.Errorf("transaction data size %d exceeds maximum %d", size, maxSizeBytes) - } - // allCopy is sorted, so any duplicated data will be adjacent. if i+1 < len(allCopy) && bytes.Equal(cur, allCopy[i+1]) { return fmt.Errorf("found duplicate transaction with hash: %x", cur.Hash()) @@ -207,6 +201,14 @@ func (t TxRecordSet) Validate(maxSizeBytes int64, otxs Txs) error { removedCopy := sortedCopy(t.removed) unmodifiedCopy := sortedCopy(t.unmodified) + var size int64 + for _, cur := range append(unmodifiedCopy, addedCopy...) { + size += int64(len(cur)) + if size > maxSizeBytes { + return fmt.Errorf("transaction data size %d exceeds maximum %d", size, maxSizeBytes) + } + } + // make a defensive copy of otxs so that the order of // the caller's data is not altered. otxsCopy := sortedCopy(otxs) diff --git a/types/tx_test.go b/types/tx_test.go index d8737e9f0..77afa1b23 100644 --- a/types/tx_test.go +++ b/types/tx_test.go @@ -64,6 +64,25 @@ func TestValidateTxRecordSet(t *testing.T) { err := txrSet.Validate(9, []Tx{}) require.Error(t, err) }) + t.Run("should not error on removed transaction size exceeding max data size", func(t *testing.T) { + trs := []*abci.TxRecord{ + { + Action: abci.TxRecord_ADDED, + Tx: Tx([]byte{1, 2, 3, 4, 5}), + }, + { + Action: abci.TxRecord_ADDED, + Tx: Tx([]byte{6, 7, 8, 9}), + }, + { + Action: abci.TxRecord_REMOVED, + Tx: Tx([]byte{10}), + }, + } + txrSet := NewTxRecordSet(trs) + err := txrSet.Validate(9, []Tx{[]byte{10}}) + require.NoError(t, err) + }) t.Run("should error on duplicate transactions with the same action", func(t *testing.T) { trs := []*abci.TxRecord{ { From 9fe25a1ed101a4fe7d62ce2d4e2a196ff5841a5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Apr 2022 11:49:00 +0200 Subject: [PATCH 2/5] build(deps): Bump bufbuild/buf-setup-action from 1.3.0 to 1.3.1 (#8245) --- .github/workflows/proto-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/proto-lint.yml b/.github/workflows/proto-lint.yml index 2d4052f90..8d0da6798 100644 --- a/.github/workflows/proto-lint.yml +++ b/.github/workflows/proto-lint.yml @@ -15,7 +15,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.3.0 + - uses: bufbuild/buf-setup-action@v1.3.1 - uses: bufbuild/buf-lint-action@v1 with: input: 'proto' From 8df38db82e3641cff6ece710fc5bc422b8feff41 Mon Sep 17 00:00:00 2001 From: Sergio Mena Date: Mon, 4 Apr 2022 12:43:01 +0200 Subject: [PATCH 3/5] Remove `ModifiedTxStatus` from the spec and the code (#8210) * Outstanding abci-gen changes to 'pb.go' files * Removed modified_tx_status from spec and protobufs * Fix sed for OSX * Regenerated abci protobufs with 'abci-proto-gen' * Code changes. UTs e2e tests passing * Recovered UT: TestPrepareProposalModifiedTxStatusFalse * Adapted UT * Fixed UT * Revert "Fix sed for OSX" This reverts commit e576708c618f0ef732498f4d348503b823b6c9e8. * Update internal/state/execution_test.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update abci/example/kvstore/kvstore.go Co-authored-by: M. J. Fromberger * Update internal/state/execution_test.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update spec/abci++/abci++_tmint_expected_behavior_002_draft.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Addressed some comments * Added one test that tests error at the ABCI client + Fixed some mock calls * Addressed remaining comments * Update abci/example/kvstore/kvstore.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update abci/example/kvstore/kvstore.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update abci/example/kvstore/kvstore.go Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update spec/abci++/abci++_tmint_expected_behavior_002_draft.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Addressed William's latest comments * Adressed Michael's comment * Fixed UT * Some md fixes * More md fixes * gofmt Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> Co-authored-by: M. J. Fromberger --- abci/client/mocks/client.go | 1 + abci/example/kvstore/kvstore.go | 31 +- abci/types/application.go | 14 +- abci/types/mocks/application.go | 1 + abci/types/types.go | 8 - abci/types/types.pb.go | 1974 ++++++++--------- cmd/tendermint/commands/debug/debug.go | 1 + internal/consensus/mempool_test.go | 15 +- internal/consensus/mocks/cons_sync_reactor.go | 1 + internal/consensus/peer_state_test.go | 1 + internal/consensus/state.go | 6 +- internal/evidence/mocks/block_store.go | 1 + internal/mempool/mempool_bench_test.go | 1 + internal/proxy/client.go | 1 + internal/proxy/client_test.go | 3 +- internal/state/execution.go | 17 +- internal/state/execution_test.go | 129 +- internal/state/helpers_test.go | 2 +- internal/state/indexer/mocks/event_sink.go | 1 + internal/state/mocks/evidence_pool.go | 1 + internal/state/mocks/store.go | 1 + internal/state/test/factory/block.go | 2 +- internal/state/validation_test.go | 2 +- internal/statesync/mocks/state_provider.go | 1 + internal/test/factory/tx.go | 6 +- proto/tendermint/abci/types.proto | 17 +- .../tendermint/abci/types.proto.intermediate | 17 +- spec/abci++/abci++_methods_002_draft.md | 48 +- ...bci++_tmint_expected_behavior_002_draft.md | 23 +- test/e2e/app/app.go | 14 +- types/tx.go | 2 +- 31 files changed, 1163 insertions(+), 1179 deletions(-) diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index 37df53979..7743e5897 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -6,6 +6,7 @@ import ( context "context" mock "github.com/stretchr/testify/mock" + types "github.com/tendermint/tendermint/abci/types" ) diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go index 40f45d459..0563cd7e6 100644 --- a/abci/example/kvstore/kvstore.go +++ b/abci/example/kvstore/kvstore.go @@ -285,8 +285,7 @@ func (app *Application) PrepareProposal(req types.RequestPrepareProposal) types. defer app.mu.Unlock() return types.ResponsePrepareProposal{ - ModifiedTxStatus: types.ResponsePrepareProposal_MODIFIED, - TxRecords: app.substPrepareTx(req.Txs), + TxRecords: app.substPrepareTx(req.Txs, req.MaxTxBytes), } } @@ -434,28 +433,32 @@ func (app *Application) execPrepareTx(tx []byte) *types.ExecTxResult { } // substPrepareTx substitutes all the transactions prefixed with 'prepare' in the -// proposal for transactions with the prefix strips. +// proposal for transactions with the prefix stripped. // It marks all of the original transactions as 'REMOVED' so that // Tendermint will remove them from its mempool. -func (app *Application) substPrepareTx(blockData [][]byte) []*types.TxRecord { - trs := make([]*types.TxRecord, len(blockData)) +func (app *Application) substPrepareTx(blockData [][]byte, maxTxBytes int64) []*types.TxRecord { + trs := make([]*types.TxRecord, 0, len(blockData)) var removed []*types.TxRecord - for i, tx := range blockData { + var totalBytes int64 + for _, tx := range blockData { + txMod := tx + action := types.TxRecord_UNMODIFIED if isPrepareTx(tx) { removed = append(removed, &types.TxRecord{ Tx: tx, Action: types.TxRecord_REMOVED, }) - trs[i] = &types.TxRecord{ - Tx: bytes.TrimPrefix(tx, []byte(PreparePrefix)), - Action: types.TxRecord_ADDED, - } - continue + txMod = bytes.TrimPrefix(tx, []byte(PreparePrefix)) + action = types.TxRecord_ADDED } - trs[i] = &types.TxRecord{ - Tx: tx, - Action: types.TxRecord_UNMODIFIED, + totalBytes += int64(len(txMod)) + if totalBytes > maxTxBytes { + break } + trs = append(trs, &types.TxRecord{ + Tx: txMod, + Action: action, + }) } return append(trs, removed...) diff --git a/abci/types/application.go b/abci/types/application.go index 8b8991adc..959311e3b 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -95,7 +95,19 @@ func (BaseApplication) ApplySnapshotChunk(req RequestApplySnapshotChunk) Respons } func (BaseApplication) PrepareProposal(req RequestPrepareProposal) ResponsePrepareProposal { - return ResponsePrepareProposal{ModifiedTxStatus: ResponsePrepareProposal_UNMODIFIED} + trs := make([]*TxRecord, 0, len(req.Txs)) + var totalBytes int64 + for _, tx := range req.Txs { + totalBytes += int64(len(tx)) + if totalBytes > req.MaxTxBytes { + break + } + trs = append(trs, &TxRecord{ + Action: TxRecord_UNMODIFIED, + Tx: tx, + }) + } + return ResponsePrepareProposal{TxRecords: trs} } func (BaseApplication) ProcessProposal(req RequestProcessProposal) ResponseProcessProposal { diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index 30bf0f84c..45e2f1c45 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -4,6 +4,7 @@ package mocks import ( mock "github.com/stretchr/testify/mock" + types "github.com/tendermint/tendermint/abci/types" ) diff --git a/abci/types/types.go b/abci/types/types.go index 3955e7af0..d74a2289a 100644 --- a/abci/types/types.go +++ b/abci/types/types.go @@ -53,14 +53,6 @@ func (r ResponseQuery) IsErr() bool { return r.Code != CodeTypeOK } -func (r ResponsePrepareProposal) IsTxStatusUnknown() bool { - return r.ModifiedTxStatus == ResponsePrepareProposal_UNKNOWN -} - -func (r ResponsePrepareProposal) IsTxStatusModified() bool { - return r.ModifiedTxStatus == ResponsePrepareProposal_MODIFIED -} - func (r ResponseProcessProposal) IsAccepted() bool { return r.Status == ResponseProcessProposal_ACCEPT } diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index cbea553af..cd3ced31f 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -160,62 +160,6 @@ func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{35, 0} } -type ResponseVerifyVoteExtension_VerifyStatus int32 - -const ( - ResponseVerifyVoteExtension_UNKNOWN ResponseVerifyVoteExtension_VerifyStatus = 0 - ResponseVerifyVoteExtension_ACCEPT ResponseVerifyVoteExtension_VerifyStatus = 1 - ResponseVerifyVoteExtension_REJECT ResponseVerifyVoteExtension_VerifyStatus = 2 -) - -var ResponseVerifyVoteExtension_VerifyStatus_name = map[int32]string{ - 0: "UNKNOWN", - 1: "ACCEPT", - 2: "REJECT", -} - -var ResponseVerifyVoteExtension_VerifyStatus_value = map[string]int32{ - "UNKNOWN": 0, - "ACCEPT": 1, - "REJECT": 2, -} - -func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { - return proto.EnumName(ResponseVerifyVoteExtension_VerifyStatus_name, int32(x)) -} - -func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37, 0} -} - -type ResponsePrepareProposal_ModifiedTxStatus int32 - -const ( - ResponsePrepareProposal_UNKNOWN ResponsePrepareProposal_ModifiedTxStatus = 0 - ResponsePrepareProposal_UNMODIFIED ResponsePrepareProposal_ModifiedTxStatus = 1 - ResponsePrepareProposal_MODIFIED ResponsePrepareProposal_ModifiedTxStatus = 2 -) - -var ResponsePrepareProposal_ModifiedTxStatus_name = map[int32]string{ - 0: "UNKNOWN", - 1: "UNMODIFIED", - 2: "MODIFIED", -} - -var ResponsePrepareProposal_ModifiedTxStatus_value = map[string]int32{ - "UNKNOWN": 0, - "UNMODIFIED": 1, - "MODIFIED": 2, -} - -func (x ResponsePrepareProposal_ModifiedTxStatus) String() string { - return proto.EnumName(ResponsePrepareProposal_ModifiedTxStatus_name, int32(x)) -} - -func (ResponsePrepareProposal_ModifiedTxStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38, 0} -} - type ResponseProcessProposal_ProposalStatus int32 const ( @@ -241,6 +185,34 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{37, 0} +} + +type ResponseVerifyVoteExtension_VerifyStatus int32 + +const ( + ResponseVerifyVoteExtension_UNKNOWN ResponseVerifyVoteExtension_VerifyStatus = 0 + ResponseVerifyVoteExtension_ACCEPT ResponseVerifyVoteExtension_VerifyStatus = 1 + ResponseVerifyVoteExtension_REJECT ResponseVerifyVoteExtension_VerifyStatus = 2 +) + +var ResponseVerifyVoteExtension_VerifyStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ACCEPT", + 2: "REJECT", +} + +var ResponseVerifyVoteExtension_VerifyStatus_value = map[string]int32{ + "UNKNOWN": 0, + "ACCEPT": 1, + "REJECT": 2, +} + +func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { + return proto.EnumName(ResponseVerifyVoteExtension_VerifyStatus_name, int32(x)) +} + +func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{39, 0} } @@ -1341,96 +1313,6 @@ func (m *RequestApplySnapshotChunk) GetSender() string { return "" } -// Extends a vote with application-side injection -type RequestExtendVote struct { - Vote *types1.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` -} - -func (m *RequestExtendVote) Reset() { *m = RequestExtendVote{} } -func (m *RequestExtendVote) String() string { return proto.CompactTextString(m) } -func (*RequestExtendVote) ProtoMessage() {} -func (*RequestExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{15} -} -func (m *RequestExtendVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RequestExtendVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RequestExtendVote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RequestExtendVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestExtendVote.Merge(m, src) -} -func (m *RequestExtendVote) XXX_Size() int { - return m.Size() -} -func (m *RequestExtendVote) XXX_DiscardUnknown() { - xxx_messageInfo_RequestExtendVote.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestExtendVote proto.InternalMessageInfo - -func (m *RequestExtendVote) GetVote() *types1.Vote { - if m != nil { - return m.Vote - } - return nil -} - -// Verify the vote extension -type RequestVerifyVoteExtension struct { - Vote *types1.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` -} - -func (m *RequestVerifyVoteExtension) Reset() { *m = RequestVerifyVoteExtension{} } -func (m *RequestVerifyVoteExtension) String() string { return proto.CompactTextString(m) } -func (*RequestVerifyVoteExtension) ProtoMessage() {} -func (*RequestVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{16} -} -func (m *RequestVerifyVoteExtension) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RequestVerifyVoteExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RequestVerifyVoteExtension.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RequestVerifyVoteExtension) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestVerifyVoteExtension.Merge(m, src) -} -func (m *RequestVerifyVoteExtension) XXX_Size() int { - return m.Size() -} -func (m *RequestVerifyVoteExtension) XXX_DiscardUnknown() { - xxx_messageInfo_RequestVerifyVoteExtension.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestVerifyVoteExtension proto.InternalMessageInfo - -func (m *RequestVerifyVoteExtension) GetVote() *types1.Vote { - if m != nil { - return m.Vote - } - return nil -} - type RequestPrepareProposal struct { Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` Header types1.Header `protobuf:"bytes,2,opt,name=header,proto3" json:"header"` @@ -1447,7 +1329,7 @@ func (m *RequestPrepareProposal) Reset() { *m = RequestPrepareProposal{} func (m *RequestPrepareProposal) String() string { return proto.CompactTextString(m) } func (*RequestPrepareProposal) ProtoMessage() {} func (*RequestPrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{17} + return fileDescriptor_252557cfdd89a31a, []int{15} } func (m *RequestPrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1530,7 +1412,7 @@ func (m *RequestProcessProposal) Reset() { *m = RequestProcessProposal{} func (m *RequestProcessProposal) String() string { return proto.CompactTextString(m) } func (*RequestProcessProposal) ProtoMessage() {} func (*RequestProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{18} + return fileDescriptor_252557cfdd89a31a, []int{16} } func (m *RequestProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1594,6 +1476,96 @@ func (m *RequestProcessProposal) GetByzantineValidators() []Evidence { return nil } +// Extends a vote with application-side injection +type RequestExtendVote struct { + Vote *types1.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` +} + +func (m *RequestExtendVote) Reset() { *m = RequestExtendVote{} } +func (m *RequestExtendVote) String() string { return proto.CompactTextString(m) } +func (*RequestExtendVote) ProtoMessage() {} +func (*RequestExtendVote) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{17} +} +func (m *RequestExtendVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestExtendVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestExtendVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestExtendVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestExtendVote.Merge(m, src) +} +func (m *RequestExtendVote) XXX_Size() int { + return m.Size() +} +func (m *RequestExtendVote) XXX_DiscardUnknown() { + xxx_messageInfo_RequestExtendVote.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestExtendVote proto.InternalMessageInfo + +func (m *RequestExtendVote) GetVote() *types1.Vote { + if m != nil { + return m.Vote + } + return nil +} + +// Verify the vote extension +type RequestVerifyVoteExtension struct { + Vote *types1.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` +} + +func (m *RequestVerifyVoteExtension) Reset() { *m = RequestVerifyVoteExtension{} } +func (m *RequestVerifyVoteExtension) String() string { return proto.CompactTextString(m) } +func (*RequestVerifyVoteExtension) ProtoMessage() {} +func (*RequestVerifyVoteExtension) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{18} +} +func (m *RequestVerifyVoteExtension) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestVerifyVoteExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestVerifyVoteExtension.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestVerifyVoteExtension) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestVerifyVoteExtension.Merge(m, src) +} +func (m *RequestVerifyVoteExtension) XXX_Size() int { + return m.Size() +} +func (m *RequestVerifyVoteExtension) XXX_DiscardUnknown() { + xxx_messageInfo_RequestVerifyVoteExtension.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestVerifyVoteExtension proto.InternalMessageInfo + +func (m *RequestVerifyVoteExtension) GetVote() *types1.Vote { + if m != nil { + return m.Vote + } + return nil +} + type RequestFinalizeBlock struct { Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` Header types1.Header `protobuf:"bytes,2,opt,name=header,proto3" json:"header"` @@ -2937,108 +2909,19 @@ func (m *ResponseApplySnapshotChunk) GetRejectSenders() []string { return nil } -type ResponseExtendVote struct { - VoteExtension *types1.VoteExtension `protobuf:"bytes,1,opt,name=vote_extension,json=voteExtension,proto3" json:"vote_extension,omitempty"` -} - -func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } -func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } -func (*ResponseExtendVote) ProtoMessage() {} -func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} -} -func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseExtendVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseExtendVote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ResponseExtendVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseExtendVote.Merge(m, src) -} -func (m *ResponseExtendVote) XXX_Size() int { - return m.Size() -} -func (m *ResponseExtendVote) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseExtendVote.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseExtendVote proto.InternalMessageInfo - -func (m *ResponseExtendVote) GetVoteExtension() *types1.VoteExtension { - if m != nil { - return m.VoteExtension - } - return nil -} - -type ResponseVerifyVoteExtension struct { - Status ResponseVerifyVoteExtension_VerifyStatus `protobuf:"varint,1,opt,name=status,proto3,enum=tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus" json:"status,omitempty"` -} - -func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteExtension{} } -func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } -func (*ResponseVerifyVoteExtension) ProtoMessage() {} -func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} -} -func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResponseVerifyVoteExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseVerifyVoteExtension.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ResponseVerifyVoteExtension) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseVerifyVoteExtension.Merge(m, src) -} -func (m *ResponseVerifyVoteExtension) XXX_Size() int { - return m.Size() -} -func (m *ResponseVerifyVoteExtension) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseVerifyVoteExtension.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseVerifyVoteExtension proto.InternalMessageInfo - -func (m *ResponseVerifyVoteExtension) GetStatus() ResponseVerifyVoteExtension_VerifyStatus { - if m != nil { - return m.Status - } - return ResponseVerifyVoteExtension_UNKNOWN -} - type ResponsePrepareProposal struct { - ModifiedTxStatus ResponsePrepareProposal_ModifiedTxStatus `protobuf:"varint,1,opt,name=modified_tx_status,json=modifiedTxStatus,proto3,enum=tendermint.abci.ResponsePrepareProposal_ModifiedTxStatus" json:"modified_tx_status,omitempty"` - TxRecords []*TxRecord `protobuf:"bytes,2,rep,name=tx_records,json=txRecords,proto3" json:"tx_records,omitempty"` - AppHash []byte `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` - TxResults []*ExecTxResult `protobuf:"bytes,4,rep,name=tx_results,json=txResults,proto3" json:"tx_results,omitempty"` - ValidatorUpdates []*ValidatorUpdate `protobuf:"bytes,5,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates,omitempty"` - ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,6,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` + TxRecords []*TxRecord `protobuf:"bytes,1,rep,name=tx_records,json=txRecords,proto3" json:"tx_records,omitempty"` + AppHash []byte `protobuf:"bytes,2,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + TxResults []*ExecTxResult `protobuf:"bytes,3,rep,name=tx_results,json=txResults,proto3" json:"tx_results,omitempty"` + ValidatorUpdates []*ValidatorUpdate `protobuf:"bytes,4,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates,omitempty"` + ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,5,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` } func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal{} } func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3067,13 +2950,6 @@ func (m *ResponsePrepareProposal) XXX_DiscardUnknown() { var xxx_messageInfo_ResponsePrepareProposal proto.InternalMessageInfo -func (m *ResponsePrepareProposal) GetModifiedTxStatus() ResponsePrepareProposal_ModifiedTxStatus { - if m != nil { - return m.ModifiedTxStatus - } - return ResponsePrepareProposal_UNKNOWN -} - func (m *ResponsePrepareProposal) GetTxRecords() []*TxRecord { if m != nil { return m.TxRecords @@ -3121,7 +2997,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3185,6 +3061,94 @@ func (m *ResponseProcessProposal) GetConsensusParamUpdates() *types1.ConsensusPa return nil } +type ResponseExtendVote struct { + VoteExtension *types1.VoteExtension `protobuf:"bytes,1,opt,name=vote_extension,json=voteExtension,proto3" json:"vote_extension,omitempty"` +} + +func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } +func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } +func (*ResponseExtendVote) ProtoMessage() {} +func (*ResponseExtendVote) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{38} +} +func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseExtendVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseExtendVote.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponseExtendVote) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseExtendVote.Merge(m, src) +} +func (m *ResponseExtendVote) XXX_Size() int { + return m.Size() +} +func (m *ResponseExtendVote) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseExtendVote.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseExtendVote proto.InternalMessageInfo + +func (m *ResponseExtendVote) GetVoteExtension() *types1.VoteExtension { + if m != nil { + return m.VoteExtension + } + return nil +} + +type ResponseVerifyVoteExtension struct { + Status ResponseVerifyVoteExtension_VerifyStatus `protobuf:"varint,1,opt,name=status,proto3,enum=tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus" json:"status,omitempty"` +} + +func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteExtension{} } +func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } +func (*ResponseVerifyVoteExtension) ProtoMessage() {} +func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{39} +} +func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseVerifyVoteExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseVerifyVoteExtension.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponseVerifyVoteExtension) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseVerifyVoteExtension.Merge(m, src) +} +func (m *ResponseVerifyVoteExtension) XXX_Size() int { + return m.Size() +} +func (m *ResponseVerifyVoteExtension) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseVerifyVoteExtension.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseVerifyVoteExtension proto.InternalMessageInfo + +func (m *ResponseVerifyVoteExtension) GetStatus() ResponseVerifyVoteExtension_VerifyStatus { + if m != nil { + return m.Status + } + return ResponseVerifyVoteExtension_UNKNOWN +} + type ResponseFinalizeBlock struct { Events []Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` TxResults []*ExecTxResult `protobuf:"bytes,2,rep,name=tx_results,json=txResults,proto3" json:"tx_results,omitempty"` @@ -4098,9 +4062,8 @@ func init() { proto.RegisterEnum("tendermint.abci.EvidenceType", EvidenceType_name, EvidenceType_value) proto.RegisterEnum("tendermint.abci.ResponseOfferSnapshot_Result", ResponseOfferSnapshot_Result_name, ResponseOfferSnapshot_Result_value) proto.RegisterEnum("tendermint.abci.ResponseApplySnapshotChunk_Result", ResponseApplySnapshotChunk_Result_name, ResponseApplySnapshotChunk_Result_value) - proto.RegisterEnum("tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus", ResponseVerifyVoteExtension_VerifyStatus_name, ResponseVerifyVoteExtension_VerifyStatus_value) - proto.RegisterEnum("tendermint.abci.ResponsePrepareProposal_ModifiedTxStatus", ResponsePrepareProposal_ModifiedTxStatus_name, ResponsePrepareProposal_ModifiedTxStatus_value) proto.RegisterEnum("tendermint.abci.ResponseProcessProposal_ProposalStatus", ResponseProcessProposal_ProposalStatus_name, ResponseProcessProposal_ProposalStatus_value) + proto.RegisterEnum("tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus", ResponseVerifyVoteExtension_VerifyStatus_name, ResponseVerifyVoteExtension_VerifyStatus_value) proto.RegisterEnum("tendermint.abci.TxRecord_TxAction", TxRecord_TxAction_name, TxRecord_TxAction_value) proto.RegisterType((*Request)(nil), "tendermint.abci.Request") proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") @@ -4117,10 +4080,10 @@ func init() { proto.RegisterType((*RequestOfferSnapshot)(nil), "tendermint.abci.RequestOfferSnapshot") proto.RegisterType((*RequestLoadSnapshotChunk)(nil), "tendermint.abci.RequestLoadSnapshotChunk") proto.RegisterType((*RequestApplySnapshotChunk)(nil), "tendermint.abci.RequestApplySnapshotChunk") - proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote") - proto.RegisterType((*RequestVerifyVoteExtension)(nil), "tendermint.abci.RequestVerifyVoteExtension") proto.RegisterType((*RequestPrepareProposal)(nil), "tendermint.abci.RequestPrepareProposal") proto.RegisterType((*RequestProcessProposal)(nil), "tendermint.abci.RequestProcessProposal") + proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote") + proto.RegisterType((*RequestVerifyVoteExtension)(nil), "tendermint.abci.RequestVerifyVoteExtension") proto.RegisterType((*RequestFinalizeBlock)(nil), "tendermint.abci.RequestFinalizeBlock") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") @@ -4138,10 +4101,10 @@ func init() { proto.RegisterType((*ResponseOfferSnapshot)(nil), "tendermint.abci.ResponseOfferSnapshot") proto.RegisterType((*ResponseLoadSnapshotChunk)(nil), "tendermint.abci.ResponseLoadSnapshotChunk") proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk") - proto.RegisterType((*ResponseExtendVote)(nil), "tendermint.abci.ResponseExtendVote") - proto.RegisterType((*ResponseVerifyVoteExtension)(nil), "tendermint.abci.ResponseVerifyVoteExtension") proto.RegisterType((*ResponsePrepareProposal)(nil), "tendermint.abci.ResponsePrepareProposal") proto.RegisterType((*ResponseProcessProposal)(nil), "tendermint.abci.ResponseProcessProposal") + proto.RegisterType((*ResponseExtendVote)(nil), "tendermint.abci.ResponseExtendVote") + proto.RegisterType((*ResponseVerifyVoteExtension)(nil), "tendermint.abci.ResponseVerifyVoteExtension") proto.RegisterType((*ResponseFinalizeBlock)(nil), "tendermint.abci.ResponseFinalizeBlock") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") @@ -4161,223 +4124,219 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3443 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0xcb, 0x73, 0x1b, 0xc7, - 0xd1, 0xc7, 0xfb, 0xd1, 0x78, 0x2d, 0x87, 0xb4, 0x0c, 0xc1, 0x12, 0x29, 0xaf, 0xca, 0xb6, 0x2c, - 0xdb, 0xd4, 0x67, 0xa9, 0x64, 0xcb, 0x9f, 0xed, 0xcf, 0x45, 0x82, 0xa0, 0x41, 0x89, 0x22, 0xe9, - 0x25, 0x28, 0x97, 0xbf, 0xcf, 0x9f, 0xd6, 0x4b, 0xec, 0x10, 0x58, 0x0b, 0xc0, 0xae, 0x77, 0x17, - 0x34, 0xe8, 0x53, 0x2a, 0x55, 0xbe, 0xb8, 0x52, 0x15, 0xdf, 0x92, 0xaa, 0x94, 0x2b, 0x97, 0xa4, - 0x2a, 0x7f, 0x42, 0x4e, 0xb9, 0x24, 0x07, 0x1f, 0x72, 0xf0, 0x2d, 0xa9, 0x1c, 0x9c, 0x94, 0x7d, - 0xcb, 0x3f, 0x90, 0x53, 0x9c, 0xd4, 0x3c, 0xf6, 0x09, 0x2c, 0x1e, 0x96, 0xe4, 0x4b, 0x6e, 0x33, - 0x8d, 0xee, 0xde, 0x99, 0x9e, 0x99, 0xee, 0xfe, 0xf5, 0x0c, 0xe0, 0x29, 0x1b, 0x0f, 0x54, 0x6c, - 0xf6, 0xb5, 0x81, 0x7d, 0x4d, 0x39, 0x6e, 0x6b, 0xd7, 0xec, 0x33, 0x03, 0x5b, 0xeb, 0x86, 0xa9, - 0xdb, 0x3a, 0xaa, 0x78, 0x3f, 0xae, 0x93, 0x1f, 0x6b, 0x17, 0x7d, 0xdc, 0x6d, 0xf3, 0xcc, 0xb0, - 0xf5, 0x6b, 0x86, 0xa9, 0xeb, 0x27, 0x8c, 0xbf, 0x76, 0xc1, 0xf7, 0x33, 0xd5, 0xe3, 0xd7, 0x16, - 0xf8, 0x95, 0x0b, 0x3f, 0xc0, 0x67, 0xce, 0xaf, 0x17, 0xc7, 0x64, 0x0d, 0xc5, 0x54, 0xfa, 0xce, - 0xcf, 0x6b, 0x1d, 0x5d, 0xef, 0xf4, 0xf0, 0x35, 0xda, 0x3b, 0x1e, 0x9e, 0x5c, 0xb3, 0xb5, 0x3e, - 0xb6, 0x6c, 0xa5, 0x6f, 0x70, 0x86, 0x95, 0x8e, 0xde, 0xd1, 0x69, 0xf3, 0x1a, 0x69, 0x31, 0xaa, - 0xf8, 0x2f, 0x80, 0xac, 0x84, 0x3f, 0x1a, 0x62, 0xcb, 0x46, 0xd7, 0x21, 0x85, 0xdb, 0x5d, 0xbd, - 0x1a, 0xbf, 0x14, 0xbf, 0x52, 0xb8, 0x7e, 0x61, 0x3d, 0x34, 0xb9, 0x75, 0xce, 0xd7, 0x68, 0x77, - 0xf5, 0x66, 0x4c, 0xa2, 0xbc, 0xe8, 0x26, 0xa4, 0x4f, 0x7a, 0x43, 0xab, 0x5b, 0x4d, 0x50, 0xa1, - 0x8b, 0x51, 0x42, 0xdb, 0x84, 0xa9, 0x19, 0x93, 0x18, 0x37, 0xf9, 0x94, 0x36, 0x38, 0xd1, 0xab, - 0xc9, 0xe9, 0x9f, 0xda, 0x19, 0x9c, 0xd0, 0x4f, 0x11, 0x5e, 0xb4, 0x09, 0xa0, 0x0d, 0x34, 0x5b, - 0x6e, 0x77, 0x15, 0x6d, 0x50, 0x4d, 0x51, 0xc9, 0xa7, 0xa3, 0x25, 0x35, 0xbb, 0x4e, 0x18, 0x9b, - 0x31, 0x29, 0xaf, 0x39, 0x1d, 0x32, 0xdc, 0x8f, 0x86, 0xd8, 0x3c, 0xab, 0xa6, 0xa7, 0x0f, 0xf7, - 0x1d, 0xc2, 0x44, 0x86, 0x4b, 0xb9, 0xd1, 0x0e, 0x14, 0x8e, 0x71, 0x47, 0x1b, 0xc8, 0xc7, 0x3d, - 0xbd, 0xfd, 0xa0, 0x9a, 0xa1, 0xc2, 0x62, 0x94, 0xf0, 0x26, 0x61, 0xdd, 0x24, 0x9c, 0x9b, 0x89, - 0x6a, 0xbc, 0x19, 0x93, 0xe0, 0xd8, 0xa5, 0xa0, 0x37, 0x20, 0xd7, 0xee, 0xe2, 0xf6, 0x03, 0xd9, - 0x1e, 0x55, 0xb3, 0x54, 0xcf, 0x5a, 0x94, 0x9e, 0x3a, 0xe1, 0x6b, 0x8d, 0x9a, 0x31, 0x29, 0xdb, - 0x66, 0x4d, 0xb4, 0x0d, 0xa0, 0xe2, 0x9e, 0x76, 0x8a, 0x4d, 0x22, 0x9f, 0x9b, 0x6e, 0x83, 0x2d, - 0xc6, 0xd9, 0x1a, 0xf1, 0x61, 0xe4, 0x55, 0x87, 0x80, 0xea, 0x90, 0xc7, 0x03, 0x95, 0x4f, 0x27, - 0x4f, 0xd5, 0x5c, 0x8a, 0x5c, 0xef, 0x81, 0xea, 0x9f, 0x4c, 0x0e, 0xf3, 0x3e, 0xba, 0x05, 0x99, - 0xb6, 0xde, 0xef, 0x6b, 0x76, 0x15, 0xa8, 0x86, 0xd5, 0xc8, 0x89, 0x50, 0xae, 0x66, 0x4c, 0xe2, - 0xfc, 0x68, 0x0f, 0xca, 0x3d, 0xcd, 0xb2, 0x65, 0x6b, 0xa0, 0x18, 0x56, 0x57, 0xb7, 0xad, 0x6a, - 0x81, 0x6a, 0x78, 0x26, 0x4a, 0xc3, 0xae, 0x66, 0xd9, 0x87, 0x0e, 0x73, 0x33, 0x26, 0x95, 0x7a, - 0x7e, 0x02, 0xd1, 0xa7, 0x9f, 0x9c, 0x60, 0xd3, 0x55, 0x58, 0x2d, 0x4e, 0xd7, 0xb7, 0x4f, 0xb8, - 0x1d, 0x79, 0xa2, 0x4f, 0xf7, 0x13, 0xd0, 0xff, 0xc1, 0x72, 0x4f, 0x57, 0x54, 0x57, 0x9d, 0xdc, - 0xee, 0x0e, 0x07, 0x0f, 0xaa, 0x25, 0xaa, 0xf4, 0xf9, 0xc8, 0x41, 0xea, 0x8a, 0xea, 0xa8, 0xa8, - 0x13, 0x81, 0x66, 0x4c, 0x5a, 0xea, 0x85, 0x89, 0xe8, 0x3e, 0xac, 0x28, 0x86, 0xd1, 0x3b, 0x0b, - 0x6b, 0x2f, 0x53, 0xed, 0x57, 0xa3, 0xb4, 0x6f, 0x10, 0x99, 0xb0, 0x7a, 0xa4, 0x8c, 0x51, 0x51, - 0x0b, 0x04, 0xc3, 0xc4, 0x86, 0x62, 0x62, 0xd9, 0x30, 0x75, 0x43, 0xb7, 0x94, 0x5e, 0xb5, 0x42, - 0x75, 0x3f, 0x17, 0xa5, 0xfb, 0x80, 0xf1, 0x1f, 0x70, 0xf6, 0x66, 0x4c, 0xaa, 0x18, 0x41, 0x12, - 0xd3, 0xaa, 0xb7, 0xb1, 0x65, 0x79, 0x5a, 0x85, 0x59, 0x5a, 0x29, 0x7f, 0x50, 0x6b, 0x80, 0x84, - 0x1a, 0x50, 0xc0, 0x23, 0x22, 0x2e, 0x9f, 0xea, 0x36, 0xae, 0x2e, 0x4d, 0x3f, 0x58, 0x0d, 0xca, - 0x7a, 0x4f, 0xb7, 0x31, 0x39, 0x54, 0xd8, 0xed, 0x21, 0x05, 0x9e, 0x38, 0xc5, 0xa6, 0x76, 0x72, - 0x46, 0xd5, 0xc8, 0xf4, 0x17, 0x4b, 0xd3, 0x07, 0x55, 0x44, 0x15, 0xbe, 0x10, 0xa5, 0xf0, 0x1e, - 0x15, 0x22, 0x2a, 0x1a, 0x8e, 0x48, 0x33, 0x26, 0x2d, 0x9f, 0x8e, 0x93, 0xc9, 0x16, 0x3b, 0xd1, - 0x06, 0x4a, 0x4f, 0xfb, 0x04, 0xf3, 0x63, 0xb3, 0x3c, 0x7d, 0x8b, 0x6d, 0x73, 0x6e, 0x7a, 0x56, - 0xc8, 0x16, 0x3b, 0xf1, 0x13, 0x36, 0xb3, 0x90, 0x3e, 0x55, 0x7a, 0x43, 0x2c, 0x3e, 0x07, 0x05, - 0x9f, 0x63, 0x45, 0x55, 0xc8, 0xf6, 0xb1, 0x65, 0x29, 0x1d, 0x4c, 0xfd, 0x70, 0x5e, 0x72, 0xba, - 0x62, 0x19, 0x8a, 0x7e, 0x67, 0x2a, 0x7e, 0x1e, 0x77, 0x25, 0x89, 0x9f, 0x24, 0x92, 0xa7, 0xd8, - 0xa4, 0xd3, 0xe6, 0x92, 0xbc, 0x8b, 0x2e, 0x43, 0x89, 0x0e, 0x59, 0x76, 0x7e, 0x27, 0xce, 0x3a, - 0x25, 0x15, 0x29, 0xf1, 0x1e, 0x67, 0x5a, 0x83, 0x82, 0x71, 0xdd, 0x70, 0x59, 0x92, 0x94, 0x05, - 0x8c, 0xeb, 0x86, 0xc3, 0xf0, 0x34, 0x14, 0xc9, 0xfc, 0x5c, 0x8e, 0x14, 0xfd, 0x48, 0x81, 0xd0, - 0x38, 0x8b, 0xf8, 0xc7, 0x04, 0x08, 0x61, 0x07, 0x8c, 0x6e, 0x41, 0x8a, 0xc4, 0x22, 0x1e, 0x56, - 0x6a, 0xeb, 0x2c, 0x50, 0xad, 0x3b, 0x81, 0x6a, 0xbd, 0xe5, 0x04, 0xaa, 0xcd, 0xdc, 0x97, 0x5f, - 0xaf, 0xc5, 0x3e, 0xff, 0xeb, 0x5a, 0x5c, 0xa2, 0x12, 0xe8, 0x3c, 0xf1, 0x95, 0x8a, 0x36, 0x90, - 0x35, 0x95, 0x0e, 0x39, 0x4f, 0x1c, 0xa1, 0xa2, 0x0d, 0x76, 0x54, 0xb4, 0x0b, 0x42, 0x5b, 0x1f, - 0x58, 0x78, 0x60, 0x0d, 0x2d, 0x99, 0x05, 0x42, 0x1e, 0x4c, 0x02, 0xee, 0x90, 0x85, 0xd7, 0xba, - 0xc3, 0x79, 0x40, 0x19, 0xa5, 0x4a, 0x3b, 0x48, 0x20, 0x6e, 0xf5, 0x54, 0xe9, 0x69, 0xaa, 0x62, - 0xeb, 0xa6, 0x55, 0x4d, 0x5d, 0x4a, 0x4e, 0xf4, 0x87, 0xf7, 0x1c, 0x96, 0x23, 0x43, 0x55, 0x6c, - 0xbc, 0x99, 0x22, 0xc3, 0x95, 0x7c, 0x92, 0xe8, 0x59, 0xa8, 0x28, 0x86, 0x21, 0x5b, 0xb6, 0x62, - 0x63, 0xf9, 0xf8, 0xcc, 0xc6, 0x16, 0x0d, 0x34, 0x45, 0xa9, 0xa4, 0x18, 0xc6, 0x21, 0xa1, 0x6e, - 0x12, 0x22, 0x7a, 0x06, 0xca, 0x24, 0x26, 0x69, 0x4a, 0x4f, 0xee, 0x62, 0xad, 0xd3, 0xb5, 0x69, - 0x48, 0x49, 0x4a, 0x25, 0x4e, 0x6d, 0x52, 0xa2, 0xa8, 0xba, 0x2b, 0x4e, 0xe3, 0x11, 0x42, 0x90, - 0x52, 0x15, 0x5b, 0xa1, 0x96, 0x2c, 0x4a, 0xb4, 0x4d, 0x68, 0x86, 0x62, 0x77, 0xb9, 0x7d, 0x68, - 0x1b, 0x9d, 0x83, 0x0c, 0x57, 0x9b, 0xa4, 0x6a, 0x79, 0x0f, 0xad, 0x40, 0xda, 0x30, 0xf5, 0x53, - 0x4c, 0x97, 0x2e, 0x27, 0xb1, 0x8e, 0xf8, 0xa3, 0x04, 0x2c, 0x8d, 0x45, 0x2e, 0xa2, 0xb7, 0xab, - 0x58, 0x5d, 0xe7, 0x5b, 0xa4, 0x8d, 0x5e, 0x21, 0x7a, 0x15, 0x15, 0x9b, 0x3c, 0xda, 0x57, 0xc7, - 0x4d, 0xdd, 0xa4, 0xbf, 0x73, 0xd3, 0x70, 0x6e, 0x74, 0x07, 0x84, 0x9e, 0x62, 0xd9, 0x32, 0xf3, - 0xfe, 0xb2, 0x2f, 0xf2, 0x3f, 0x35, 0x66, 0x64, 0x16, 0x2b, 0xc8, 0x86, 0xe6, 0x4a, 0xca, 0x44, - 0xd4, 0xa3, 0x22, 0x09, 0x56, 0x8e, 0xcf, 0x3e, 0x51, 0x06, 0xb6, 0x36, 0xc0, 0xf2, 0xd8, 0xaa, - 0x9d, 0x1f, 0x53, 0xd8, 0x38, 0xd5, 0x54, 0x3c, 0x68, 0x3b, 0xcb, 0xb5, 0xec, 0x0a, 0xbb, 0xcb, - 0x69, 0x89, 0x12, 0x94, 0x83, 0x31, 0x17, 0x95, 0x21, 0x61, 0x8f, 0xf8, 0xe4, 0x13, 0xf6, 0x08, - 0xfd, 0x17, 0xa4, 0xc8, 0x04, 0xe9, 0xc4, 0xcb, 0x13, 0x12, 0x16, 0x2e, 0xd7, 0x3a, 0x33, 0xb0, - 0x44, 0x39, 0x45, 0xd1, 0x3d, 0x0a, 0x6e, 0x1c, 0x0e, 0x6b, 0x15, 0x9f, 0x87, 0x4a, 0x28, 0xc8, - 0xfa, 0xd6, 0x2e, 0xee, 0x5f, 0x3b, 0xb1, 0x02, 0xa5, 0x40, 0x34, 0x15, 0xcf, 0xc1, 0xca, 0xa4, - 0xe0, 0x28, 0x76, 0x5d, 0x7a, 0x20, 0xc8, 0xa1, 0x9b, 0x90, 0x73, 0xa3, 0x23, 0x3b, 0x8a, 0xe3, - 0xb6, 0x72, 0x98, 0x25, 0x97, 0x95, 0x9c, 0x41, 0xb2, 0xa5, 0xe9, 0x5e, 0x48, 0xd0, 0x81, 0x67, - 0x15, 0xc3, 0x68, 0x2a, 0x56, 0x57, 0xfc, 0x00, 0xaa, 0x51, 0x91, 0x2f, 0x34, 0x8d, 0x94, 0xbb, - 0x05, 0xcf, 0x41, 0xe6, 0x44, 0x37, 0xfb, 0x8a, 0x4d, 0x95, 0x95, 0x24, 0xde, 0x23, 0x5b, 0x93, - 0x45, 0xc1, 0x24, 0x25, 0xb3, 0x8e, 0x28, 0xc3, 0xf9, 0xc8, 0xe8, 0x47, 0x44, 0xb4, 0x81, 0x8a, - 0x99, 0x3d, 0x4b, 0x12, 0xeb, 0x78, 0x8a, 0xd8, 0x60, 0x59, 0x87, 0x7c, 0xd6, 0xa2, 0x73, 0xa5, - 0xfa, 0xf3, 0x12, 0xef, 0x89, 0x6f, 0xb9, 0x5b, 0xdf, 0x8b, 0x2d, 0xe8, 0x2a, 0xa4, 0x68, 0x34, - 0x62, 0x56, 0x3a, 0x37, 0xbe, 0xc9, 0x09, 0x97, 0x44, 0x79, 0xc4, 0x26, 0xd4, 0xa2, 0x63, 0xc9, - 0x42, 0x9a, 0x7e, 0x9f, 0x80, 0x73, 0x93, 0xc3, 0xf1, 0x23, 0x3d, 0x8b, 0x02, 0x24, 0xed, 0x11, - 0xf1, 0x95, 0xc9, 0x2b, 0x45, 0x89, 0x34, 0xd1, 0x11, 0x2c, 0xf5, 0xf4, 0xb6, 0xd2, 0x93, 0x7d, - 0x67, 0x94, 0xa7, 0xd7, 0x97, 0xc7, 0x4f, 0x13, 0x35, 0x13, 0x56, 0xc7, 0x8e, 0x69, 0x85, 0xea, - 0xd8, 0x75, 0xcf, 0x6a, 0xe4, 0x39, 0x4d, 0x7f, 0xff, 0x73, 0x8a, 0x2e, 0x41, 0xb1, 0xaf, 0x8c, - 0x64, 0x7b, 0xc4, 0x9d, 0x2b, 0xf3, 0x9a, 0xd0, 0x57, 0x46, 0xad, 0x11, 0xf5, 0xac, 0xe2, 0x2f, - 0xfd, 0x56, 0x0c, 0xe6, 0x1a, 0x8f, 0xd7, 0x8a, 0x87, 0xb0, 0xc2, 0xf2, 0x22, 0xac, 0x4e, 0x30, - 0xe4, 0x1c, 0x7e, 0x0e, 0x39, 0xe2, 0x8f, 0xd7, 0x86, 0xe2, 0x2f, 0x12, 0xae, 0x83, 0x08, 0xa4, - 0x28, 0x8f, 0xd9, 0x3e, 0xef, 0xc0, 0xb2, 0x8a, 0xdb, 0x9a, 0xfa, 0x7d, 0xcd, 0xb3, 0xc4, 0xa5, - 0x1f, 0xb3, 0x75, 0xfe, 0x54, 0x80, 0x9c, 0x84, 0x2d, 0x83, 0x24, 0x08, 0x68, 0x13, 0xf2, 0x78, - 0xd4, 0xc6, 0x86, 0xed, 0xe4, 0x54, 0x93, 0x73, 0x53, 0xc6, 0xdd, 0x70, 0x38, 0x09, 0xd2, 0x72, - 0xc5, 0xd0, 0x0d, 0x0e, 0xaa, 0xa3, 0xf1, 0x31, 0x17, 0xf7, 0xa3, 0xea, 0x57, 0x1c, 0x54, 0x9d, - 0x8c, 0x04, 0x56, 0x4c, 0x2a, 0x04, 0xab, 0x6f, 0x70, 0x58, 0x9d, 0x9a, 0xf1, 0xb1, 0x00, 0xae, - 0xae, 0x07, 0x70, 0x75, 0x7a, 0xc6, 0x34, 0x23, 0x80, 0xf5, 0x2b, 0x0e, 0xb0, 0xce, 0xcc, 0x18, - 0x71, 0x08, 0x59, 0xdf, 0x0e, 0x22, 0xeb, 0x6c, 0x84, 0xdb, 0x71, 0xa4, 0xa7, 0x42, 0xeb, 0x37, - 0x7d, 0xd0, 0x3a, 0x17, 0x89, 0x69, 0x99, 0xa2, 0x09, 0xd8, 0xfa, 0xed, 0x00, 0xb6, 0xce, 0xcf, - 0xb0, 0xc3, 0x14, 0x70, 0xbd, 0xe5, 0x07, 0xd7, 0x10, 0x89, 0xd1, 0xf9, 0xba, 0x47, 0xa1, 0xeb, - 0xd7, 0x5c, 0x74, 0x5d, 0x88, 0x2c, 0x13, 0xf0, 0xb9, 0x84, 0xe1, 0xf5, 0xfe, 0x18, 0xbc, 0x66, - 0x70, 0xf8, 0xd9, 0x48, 0x15, 0x33, 0xf0, 0xf5, 0xfe, 0x18, 0xbe, 0x2e, 0xcd, 0x50, 0x38, 0x03, - 0x60, 0xbf, 0x3f, 0x19, 0x60, 0x47, 0x43, 0x60, 0x3e, 0xcc, 0xf9, 0x10, 0xb6, 0x1c, 0x81, 0xb0, - 0x2b, 0x91, 0x68, 0x90, 0xa9, 0x9f, 0x1b, 0x62, 0x1f, 0x4d, 0x80, 0xd8, 0x0c, 0x0c, 0x5f, 0x89, - 0x54, 0x3e, 0x07, 0xc6, 0x3e, 0x9a, 0x80, 0xb1, 0x97, 0x66, 0xaa, 0x9d, 0x09, 0xb2, 0xb7, 0x83, - 0x20, 0x1b, 0xcd, 0x38, 0x63, 0x91, 0x28, 0xfb, 0x38, 0x0a, 0x65, 0x33, 0x24, 0xfc, 0x62, 0xa4, - 0xc6, 0x05, 0x60, 0xf6, 0xfe, 0x18, 0xcc, 0x5e, 0x99, 0xb1, 0xd3, 0xe6, 0xc5, 0xd9, 0xcf, 0x93, - 0x54, 0x2f, 0xe4, 0xaa, 0x49, 0xb6, 0x88, 0x4d, 0x53, 0x37, 0x39, 0x62, 0x66, 0x1d, 0xf1, 0x0a, - 0xc1, 0x5d, 0x9e, 0x5b, 0x9e, 0x82, 0xc9, 0x69, 0x56, 0xee, 0x73, 0xc5, 0xe2, 0x6f, 0xe3, 0x9e, - 0x2c, 0x85, 0x2b, 0x7e, 0xcc, 0x96, 0xe7, 0x98, 0xcd, 0x87, 0xd4, 0x13, 0x41, 0xa4, 0xbe, 0x06, - 0x05, 0x92, 0x6d, 0x87, 0x40, 0xb8, 0x62, 0xb8, 0x20, 0xfc, 0x2a, 0x2c, 0xd1, 0xf0, 0xc9, 0xf0, - 0x3c, 0x4f, 0xb1, 0x53, 0x34, 0x0d, 0xaa, 0x90, 0x1f, 0x98, 0x15, 0x58, 0xae, 0xfd, 0x12, 0x2c, - 0xfb, 0x78, 0xdd, 0x2c, 0x9e, 0x21, 0x52, 0xc1, 0xe5, 0xde, 0xe0, 0xe9, 0xfc, 0x1f, 0xe2, 0x9e, - 0x85, 0x3c, 0xf4, 0x3e, 0x09, 0x68, 0xc7, 0x1f, 0x11, 0xd0, 0x4e, 0x7c, 0x6f, 0xa0, 0xed, 0x47, - 0x25, 0xc9, 0x20, 0x2a, 0xf9, 0x47, 0xdc, 0x5b, 0x13, 0x17, 0x36, 0xb7, 0x75, 0x15, 0x73, 0x9c, - 0x40, 0xdb, 0x24, 0x41, 0xe9, 0xe9, 0x1d, 0x8e, 0x06, 0x48, 0x93, 0x70, 0xb9, 0xb1, 0x33, 0xcf, - 0x43, 0xa3, 0x0b, 0x31, 0xd2, 0xd4, 0xc2, 0x1c, 0x62, 0x08, 0x90, 0x7c, 0x80, 0x59, 0xa4, 0x2b, - 0x4a, 0xa4, 0x49, 0xf8, 0xe8, 0x26, 0xa3, 0xf1, 0xab, 0x28, 0xb1, 0x0e, 0xba, 0x05, 0x79, 0x5a, - 0xfc, 0x97, 0x75, 0xc3, 0xe2, 0x01, 0x29, 0x90, 0xe8, 0xb0, 0x1a, 0xff, 0xfa, 0x01, 0xe1, 0xd9, - 0x37, 0x2c, 0x29, 0x67, 0xf0, 0x96, 0x0f, 0x3d, 0xe5, 0x03, 0x00, 0xfe, 0x02, 0xe4, 0xc9, 0xe8, - 0x2d, 0x43, 0x69, 0x63, 0x1a, 0x59, 0xf2, 0x92, 0x47, 0x10, 0xef, 0x03, 0x1a, 0x8f, 0x93, 0xa8, - 0x09, 0x19, 0x7c, 0x8a, 0x07, 0x36, 0x59, 0xb6, 0x64, 0x18, 0x85, 0xf0, 0xbc, 0x08, 0x0f, 0xec, - 0xcd, 0x2a, 0x31, 0xf2, 0xdf, 0xbf, 0x5e, 0x13, 0x18, 0xf7, 0x8b, 0x7a, 0x5f, 0xb3, 0x71, 0xdf, - 0xb0, 0xcf, 0x24, 0x2e, 0x2f, 0xfe, 0x25, 0x41, 0xe0, 0x6a, 0x20, 0x7e, 0x4e, 0xb4, 0xad, 0xb3, - 0xe5, 0x13, 0xbe, 0x32, 0xc5, 0x7c, 0xf6, 0xbe, 0x08, 0xd0, 0x51, 0x2c, 0xf9, 0x63, 0x65, 0x60, - 0x63, 0x95, 0x1b, 0x3d, 0xdf, 0x51, 0xac, 0x77, 0x29, 0x81, 0xac, 0x3a, 0xf9, 0x79, 0x68, 0x61, - 0x95, 0xa7, 0xfe, 0xd9, 0x8e, 0x62, 0x1d, 0x59, 0x58, 0xf5, 0xcd, 0x32, 0xfb, 0x70, 0xb3, 0x0c, - 0xda, 0x38, 0x17, 0xb2, 0xb1, 0x0f, 0x48, 0xe6, 0xfd, 0x40, 0x12, 0xd5, 0x20, 0x67, 0x98, 0x9a, - 0x6e, 0x6a, 0xf6, 0x19, 0x5d, 0x98, 0xa4, 0xe4, 0xf6, 0xd1, 0x65, 0x28, 0xf5, 0x71, 0xdf, 0xd0, - 0xf5, 0x9e, 0xcc, 0x9c, 0x4d, 0x81, 0x8a, 0x16, 0x39, 0xb1, 0x41, 0x7d, 0xce, 0xa7, 0x09, 0xef, - 0xf4, 0x79, 0x05, 0x83, 0x47, 0x6b, 0xde, 0xd5, 0x09, 0xe6, 0xf5, 0x51, 0xc8, 0x24, 0x42, 0xf6, - 0x75, 0xfb, 0x3f, 0x94, 0x81, 0xc5, 0x9f, 0xd0, 0x12, 0x62, 0x30, 0x37, 0x42, 0x87, 0xb0, 0xe4, - 0x1e, 0x7e, 0x79, 0x48, 0x9d, 0x82, 0xb3, 0x9d, 0xe7, 0xf5, 0x1e, 0xc2, 0x69, 0x90, 0x6c, 0xa1, - 0xf7, 0xe0, 0xc9, 0x90, 0x67, 0x73, 0x55, 0x27, 0xe6, 0x75, 0x70, 0x4f, 0x04, 0x1d, 0x9c, 0xa3, - 0xda, 0x33, 0x56, 0xf2, 0x21, 0xcf, 0xdc, 0x0e, 0x94, 0x83, 0x69, 0xde, 0xc4, 0xe5, 0xbf, 0x0c, - 0x25, 0x13, 0xdb, 0x8a, 0x36, 0x90, 0x03, 0x75, 0xbf, 0x22, 0x23, 0xf2, 0x6a, 0xe2, 0x01, 0x3c, - 0x31, 0x31, 0xdd, 0x43, 0xaf, 0x42, 0xde, 0xcb, 0x14, 0xe3, 0x11, 0xe0, 0xc9, 0x2d, 0x0d, 0x79, - 0xbc, 0xe2, 0xef, 0xe2, 0x9e, 0xca, 0x60, 0xb1, 0xa9, 0x01, 0x19, 0x13, 0x5b, 0xc3, 0x1e, 0x2b, - 0xff, 0x94, 0xaf, 0xbf, 0x34, 0x5f, 0xa2, 0x48, 0xa8, 0xc3, 0x9e, 0x2d, 0x71, 0x61, 0xf1, 0x3e, - 0x64, 0x18, 0x05, 0x15, 0x20, 0x7b, 0xb4, 0x77, 0x67, 0x6f, 0xff, 0xdd, 0x3d, 0x21, 0x86, 0x00, - 0x32, 0x1b, 0xf5, 0x7a, 0xe3, 0xa0, 0x25, 0xc4, 0x51, 0x1e, 0xd2, 0x1b, 0x9b, 0xfb, 0x52, 0x4b, - 0x48, 0x10, 0xb2, 0xd4, 0xb8, 0xdd, 0xa8, 0xb7, 0x84, 0x24, 0x5a, 0x82, 0x12, 0x6b, 0xcb, 0xdb, - 0xfb, 0xd2, 0xdd, 0x8d, 0x96, 0x90, 0xf2, 0x91, 0x0e, 0x1b, 0x7b, 0x5b, 0x0d, 0x49, 0x48, 0x8b, - 0x2f, 0xc3, 0xf9, 0xc8, 0xd4, 0xd2, 0xab, 0x24, 0xc5, 0x7d, 0x95, 0x24, 0xf1, 0xe7, 0x09, 0xa8, - 0x45, 0xe7, 0x8b, 0xe8, 0x76, 0x68, 0xe2, 0xd7, 0x17, 0x48, 0x36, 0x43, 0xb3, 0x47, 0xcf, 0x40, - 0xd9, 0xc4, 0x27, 0xd8, 0x6e, 0x77, 0x59, 0xfe, 0xca, 0x02, 0x66, 0x49, 0x2a, 0x71, 0x2a, 0x15, - 0xb2, 0x18, 0xdb, 0x87, 0xb8, 0x6d, 0xcb, 0xcc, 0x17, 0xb1, 0x4d, 0x97, 0x27, 0x6c, 0x84, 0x7a, - 0xc8, 0x88, 0xe2, 0x07, 0x0b, 0xd9, 0x32, 0x0f, 0x69, 0xa9, 0xd1, 0x92, 0xde, 0x13, 0x92, 0x08, - 0x41, 0x99, 0x36, 0xe5, 0xc3, 0xbd, 0x8d, 0x83, 0xc3, 0xe6, 0x3e, 0xb1, 0xe5, 0x32, 0x54, 0x1c, - 0x5b, 0x3a, 0xc4, 0xb4, 0xf8, 0xbe, 0x17, 0x7f, 0x7c, 0xd5, 0xb4, 0x6d, 0x28, 0x87, 0xd2, 0xc5, - 0xf8, 0x38, 0x9e, 0xf1, 0xaa, 0x61, 0x6e, 0x2a, 0x28, 0x95, 0x4e, 0xfd, 0x5d, 0xf1, 0xd7, 0x71, - 0x78, 0x6a, 0x4a, 0x42, 0x89, 0xde, 0x81, 0x8c, 0x65, 0x2b, 0xf6, 0xd0, 0xe2, 0x96, 0x7f, 0x6d, - 0x91, 0x74, 0x74, 0x9d, 0xd1, 0x0e, 0xa9, 0x02, 0x89, 0x2b, 0x12, 0x6f, 0x40, 0xd1, 0x4f, 0x8f, - 0x36, 0x9c, 0xb7, 0xf3, 0x12, 0xe2, 0x77, 0x49, 0x78, 0x32, 0x22, 0xe7, 0x47, 0x1d, 0x40, 0x7d, - 0x5d, 0xd5, 0x4e, 0x34, 0xac, 0xca, 0xf6, 0x48, 0x9e, 0x73, 0xbc, 0x21, 0x2d, 0xeb, 0x77, 0xb9, - 0x8a, 0xd6, 0x88, 0x8f, 0x57, 0xe8, 0x87, 0x28, 0xe8, 0x16, 0x80, 0x3d, 0x92, 0x4d, 0xdc, 0xd6, - 0x4d, 0xd5, 0xc9, 0xb3, 0xc6, 0xcf, 0x74, 0x6b, 0x24, 0x51, 0x0e, 0x29, 0x6f, 0xf3, 0xd6, 0xb4, - 0xcc, 0x0a, 0xbd, 0xc1, 0x95, 0x92, 0x4d, 0xe4, 0xd4, 0xdb, 0x2f, 0x4e, 0xa8, 0x10, 0xe2, 0x36, - 0x51, 0x4c, 0xb7, 0x32, 0x55, 0x4c, 0xf9, 0xd1, 0xdd, 0x49, 0x3e, 0x3c, 0x3d, 0x9f, 0x0f, 0x5f, - 0xcc, 0x7b, 0x67, 0x1e, 0xce, 0x7b, 0x8b, 0x6f, 0x82, 0x10, 0x36, 0x71, 0x70, 0xe9, 0xcb, 0x00, - 0x47, 0x7b, 0x77, 0xf7, 0xb7, 0x76, 0xb6, 0x77, 0x1a, 0x5b, 0x42, 0x1c, 0x15, 0x21, 0xe7, 0xf6, - 0x12, 0xe2, 0xaf, 0x02, 0x1b, 0x20, 0x08, 0xc5, 0xf6, 0x43, 0x9b, 0xf4, 0xd5, 0x79, 0x71, 0xdd, - 0xba, 0xd3, 0x08, 0x6e, 0xd1, 0x29, 0xe5, 0xf9, 0xd0, 0x72, 0x25, 0x1f, 0xc5, 0x72, 0xa5, 0x1e, - 0xc7, 0x72, 0xa5, 0x1f, 0x72, 0xb9, 0x6e, 0x42, 0x39, 0x68, 0x9c, 0xf9, 0xce, 0xe9, 0x4f, 0x93, - 0x5e, 0xf0, 0x0a, 0x16, 0x42, 0x1f, 0x59, 0xc6, 0x1c, 0x5a, 0x82, 0xc4, 0x82, 0x4b, 0x30, 0x31, - 0xeb, 0x49, 0x3e, 0xbe, 0xac, 0x27, 0xf5, 0x90, 0x59, 0x8f, 0x7f, 0x2f, 0xa6, 0x83, 0x7b, 0x71, - 0x2c, 0x41, 0xc9, 0x4c, 0x48, 0x50, 0xde, 0x03, 0xf0, 0xdd, 0xf3, 0xad, 0x40, 0xda, 0xd4, 0x87, - 0x03, 0x95, 0x9e, 0x94, 0xb4, 0xc4, 0x3a, 0xe8, 0x26, 0xa4, 0x49, 0x58, 0x88, 0xf6, 0x69, 0xc4, - 0xad, 0xfb, 0xca, 0xc6, 0x8c, 0x5b, 0xd4, 0x00, 0x8d, 0xdf, 0x5c, 0x44, 0x7c, 0xe2, 0xcd, 0xe0, - 0x27, 0x9e, 0x8e, 0xbc, 0x03, 0x99, 0xfc, 0xa9, 0x4f, 0x20, 0x4d, 0xb7, 0x07, 0x49, 0xd4, 0xe8, - 0x95, 0x21, 0x47, 0xfe, 0xa4, 0x8d, 0xfe, 0x1f, 0x40, 0xb1, 0x6d, 0x53, 0x3b, 0x1e, 0x7a, 0x1f, - 0x58, 0x9b, 0xbc, 0xbd, 0x36, 0x1c, 0xbe, 0xcd, 0x0b, 0x7c, 0x9f, 0xad, 0x78, 0xa2, 0xbe, 0xbd, - 0xe6, 0x53, 0x28, 0xee, 0x41, 0x39, 0x28, 0xeb, 0x60, 0x55, 0x36, 0x86, 0x20, 0x56, 0x65, 0xa5, - 0x07, 0x8e, 0x55, 0x5d, 0xa4, 0x9b, 0x64, 0x57, 0xc3, 0xb4, 0x23, 0x7e, 0x17, 0x87, 0xa2, 0x7f, - 0x77, 0xfe, 0xa7, 0xc1, 0x3d, 0xf1, 0xd3, 0x38, 0xe4, 0xdc, 0xc9, 0x47, 0x5c, 0xcd, 0x7a, 0xb6, - 0x4b, 0xf8, 0x2f, 0x22, 0xd9, 0x5d, 0x6f, 0xd2, 0xbd, 0x41, 0x7e, 0xdd, 0xcd, 0x0c, 0xa3, 0xaa, - 0xf3, 0x7e, 0x4b, 0x3b, 0xf7, 0x29, 0x3c, 0x11, 0xfe, 0x19, 0x1f, 0x07, 0x89, 0xd1, 0xe8, 0xbf, - 0x21, 0xa3, 0xb4, 0xdd, 0x3b, 0x89, 0xf2, 0x84, 0x22, 0xb5, 0xc3, 0xba, 0xde, 0x1a, 0x6d, 0x50, - 0x4e, 0x89, 0x4b, 0xf0, 0x51, 0x25, 0xdc, 0x1b, 0xe8, 0xb7, 0x88, 0x5e, 0xc6, 0x33, 0x3d, 0xc6, - 0x91, 0xdc, 0x70, 0x6b, 0x8b, 0x04, 0x38, 0xc2, 0x27, 0x35, 0xee, 0xee, 0xdf, 0x6b, 0x6c, 0x09, - 0x49, 0xf1, 0x75, 0xc8, 0xbb, 0xae, 0x07, 0x55, 0x21, 0xab, 0xa8, 0xaa, 0x89, 0x2d, 0x8b, 0x27, - 0xcd, 0x4e, 0x97, 0x3e, 0x3d, 0xd0, 0x3f, 0xe6, 0xf7, 0xaf, 0x49, 0x89, 0x75, 0x44, 0x15, 0x2a, - 0x21, 0xbf, 0x85, 0x5e, 0x87, 0xac, 0x31, 0x3c, 0x96, 0x9d, 0x4d, 0x1b, 0x7a, 0x1c, 0xe8, 0x94, - 0x4c, 0x86, 0xc7, 0x3d, 0xad, 0x7d, 0x07, 0x9f, 0x39, 0x66, 0x32, 0x86, 0xc7, 0x77, 0xd8, 0xde, - 0x66, 0x5f, 0x49, 0xf8, 0xbf, 0xf2, 0xe3, 0x38, 0xe4, 0x9c, 0xb3, 0x8a, 0xfe, 0x07, 0xf2, 0xae, - 0x4f, 0x74, 0x9f, 0xa4, 0x44, 0x3a, 0x53, 0xae, 0xdf, 0x13, 0x41, 0x57, 0x61, 0xc9, 0xd2, 0x3a, - 0x03, 0xe7, 0x1a, 0x8b, 0xd5, 0x28, 0x13, 0xf4, 0xd0, 0x54, 0xd8, 0x0f, 0xbb, 0x4e, 0x61, 0xed, - 0x76, 0x2a, 0x97, 0x14, 0x52, 0xb7, 0x53, 0xb9, 0x94, 0x90, 0x26, 0xe9, 0xab, 0x10, 0x76, 0x1c, - 0x3f, 0xe4, 0x60, 0x08, 0x4c, 0x08, 0xe5, 0xe1, 0x6c, 0x6f, 0x86, 0xd2, 0xec, 0x7f, 0xc6, 0x21, - 0xe7, 0x5c, 0x94, 0xa1, 0x97, 0x7d, 0x2e, 0xac, 0x3c, 0x69, 0xc7, 0x72, 0x46, 0xef, 0xd9, 0x43, - 0x70, 0x4a, 0x89, 0xc5, 0xa7, 0x14, 0xf5, 0x76, 0xc5, 0x79, 0x45, 0x94, 0x5a, 0xf8, 0x15, 0xd1, - 0x8b, 0x80, 0x6c, 0xdd, 0x56, 0x7a, 0xf2, 0xa9, 0x6e, 0x6b, 0x83, 0x8e, 0xcc, 0x76, 0x08, 0xf3, - 0x36, 0x02, 0xfd, 0xe5, 0x1e, 0xfd, 0xe1, 0xc0, 0xdd, 0x2c, 0x2e, 0x8c, 0x5d, 0xf4, 0x15, 0xc3, - 0x39, 0xc8, 0x70, 0xa4, 0xc6, 0x9e, 0x31, 0xf0, 0x9e, 0x7b, 0xb5, 0x9a, 0xf2, 0x5d, 0xad, 0xd6, - 0x20, 0xd7, 0xc7, 0xb6, 0x42, 0x5d, 0x27, 0x8b, 0x96, 0x6e, 0xff, 0xea, 0x6b, 0x50, 0xf0, 0x3d, - 0x28, 0x21, 0xde, 0x74, 0xaf, 0xf1, 0xae, 0x10, 0xab, 0x65, 0x3f, 0xfb, 0xe2, 0x52, 0x72, 0x0f, - 0x7f, 0x4c, 0x0e, 0x9a, 0xd4, 0xa8, 0x37, 0x1b, 0xf5, 0x3b, 0x42, 0xbc, 0x56, 0xf8, 0xec, 0x8b, - 0x4b, 0x59, 0x09, 0xd3, 0x7b, 0xac, 0xab, 0x4d, 0x28, 0xfa, 0x57, 0x25, 0x78, 0xa8, 0x11, 0x94, - 0xb7, 0x8e, 0x0e, 0x76, 0x77, 0xea, 0x1b, 0xad, 0x86, 0x7c, 0x6f, 0xbf, 0xd5, 0x10, 0xe2, 0xe8, - 0x49, 0x58, 0xde, 0xdd, 0x79, 0xbb, 0xd9, 0x92, 0xeb, 0xbb, 0x3b, 0x8d, 0xbd, 0x96, 0xbc, 0xd1, - 0x6a, 0x6d, 0xd4, 0xef, 0x08, 0x89, 0xeb, 0xbf, 0x29, 0x40, 0x65, 0x63, 0xb3, 0xbe, 0x43, 0x80, - 0xaa, 0xd6, 0x56, 0xa8, 0x8b, 0xa8, 0x43, 0x8a, 0x56, 0xc4, 0xa7, 0x3e, 0x0e, 0xae, 0x4d, 0xbf, - 0xe5, 0x44, 0xdb, 0x90, 0xa6, 0xc5, 0x72, 0x34, 0xfd, 0xb5, 0x70, 0x6d, 0xc6, 0xb5, 0x27, 0x19, - 0x0c, 0x3d, 0x45, 0x53, 0x9f, 0x0f, 0xd7, 0xa6, 0xdf, 0x82, 0xa2, 0x5d, 0xc8, 0x3a, 0xb5, 0xcc, - 0x59, 0x0f, 0x71, 0x6b, 0x33, 0xaf, 0x13, 0xc9, 0xd4, 0x58, 0xcd, 0x79, 0xfa, 0xcb, 0xe2, 0xda, - 0x8c, 0xfb, 0x51, 0xb4, 0x03, 0x19, 0x5e, 0xee, 0x99, 0xf1, 0xa8, 0xb6, 0x36, 0xeb, 0x5a, 0x10, - 0x49, 0x90, 0xf7, 0xaa, 0xf9, 0xb3, 0xdf, 0x4b, 0xd7, 0xe6, 0xb8, 0xfa, 0x45, 0xf7, 0xa1, 0x14, - 0x2c, 0x21, 0xcd, 0xf7, 0x70, 0xb7, 0x36, 0xe7, 0x05, 0x24, 0xd1, 0x1f, 0xac, 0x27, 0xcd, 0xf7, - 0x90, 0xb7, 0x36, 0xe7, 0x7d, 0x24, 0xfa, 0x10, 0x96, 0xc6, 0xeb, 0x3d, 0xf3, 0xbf, 0xeb, 0xad, - 0x2d, 0x70, 0x43, 0x89, 0xfa, 0x80, 0x26, 0xd4, 0x89, 0x16, 0x78, 0xe6, 0x5b, 0x5b, 0xe4, 0xc2, - 0x12, 0xa9, 0x50, 0x09, 0x57, 0x1d, 0xe6, 0x7d, 0xf6, 0x5b, 0x9b, 0xfb, 0xf2, 0x92, 0x7d, 0x25, - 0x08, 0x6d, 0xe7, 0x7d, 0x06, 0x5c, 0x9b, 0xfb, 0x2e, 0x13, 0x1d, 0x01, 0xf8, 0x0a, 0x49, 0x73, - 0x3c, 0x0b, 0xae, 0xcd, 0x73, 0xab, 0x89, 0x0c, 0x58, 0x9e, 0x54, 0x40, 0x5a, 0xe4, 0x95, 0x70, - 0x6d, 0xa1, 0xcb, 0x4e, 0xb2, 0x9f, 0x83, 0x10, 0x73, 0xbe, 0x57, 0xc3, 0xb5, 0x39, 0x6f, 0x3d, - 0x37, 0x1b, 0x5f, 0x7e, 0xb3, 0x1a, 0xff, 0xea, 0x9b, 0xd5, 0xf8, 0xdf, 0xbe, 0x59, 0x8d, 0x7f, - 0xfe, 0xed, 0x6a, 0xec, 0xab, 0x6f, 0x57, 0x63, 0x7f, 0xfe, 0x76, 0x35, 0xf6, 0xbf, 0x2f, 0x74, - 0x34, 0xbb, 0x3b, 0x3c, 0x5e, 0x6f, 0xeb, 0xfd, 0x6b, 0xfe, 0x3f, 0x90, 0x4c, 0xfa, 0x53, 0xcb, - 0x71, 0x86, 0x46, 0xd3, 0x1b, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xb5, 0xc1, 0x14, 0x70, 0xf4, - 0x32, 0x00, 0x00, + // 3386 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x73, 0x1c, 0xd5, + 0x11, 0xdf, 0xef, 0x8f, 0xde, 0x4f, 0x3d, 0x09, 0xb3, 0x5e, 0x6c, 0xc9, 0x8c, 0x0b, 0x30, 0x06, + 0xe4, 0x60, 0x97, 0xc1, 0x04, 0x08, 0x25, 0xad, 0x56, 0xac, 0x6c, 0x59, 0x12, 0xa3, 0x95, 0x28, + 0x12, 0xe2, 0x61, 0xb4, 0xf3, 0xa4, 0x1d, 0xbc, 0x3b, 0x33, 0xcc, 0xcc, 0x8a, 0x15, 0xa7, 0x54, + 0xaa, 0xb8, 0x50, 0xa9, 0x0a, 0xb7, 0xa4, 0x2a, 0x45, 0xe5, 0x92, 0x54, 0xe5, 0x4f, 0xc8, 0x29, + 0x97, 0xe4, 0xc0, 0x21, 0x07, 0x4e, 0x49, 0x2a, 0x07, 0x92, 0x82, 0x5b, 0xfe, 0x81, 0x9c, 0xf2, + 0x51, 0xef, 0x63, 0x3e, 0x77, 0x67, 0x3f, 0xb0, 0xcd, 0x25, 0xb9, 0xcd, 0xeb, 0xed, 0xee, 0x99, + 0xd7, 0xaf, 0x5f, 0x77, 0xff, 0xfa, 0xbd, 0x85, 0x27, 0x6c, 0xac, 0x29, 0xd8, 0xec, 0xab, 0x9a, + 0x7d, 0x4d, 0x3e, 0xea, 0xa8, 0xd7, 0xec, 0x33, 0x03, 0x5b, 0xab, 0x86, 0xa9, 0xdb, 0x3a, 0xaa, + 0x78, 0x3f, 0xae, 0x92, 0x1f, 0xeb, 0x17, 0x7d, 0xdc, 0x1d, 0xf3, 0xcc, 0xb0, 0xf5, 0x6b, 0x86, + 0xa9, 0xeb, 0xc7, 0x8c, 0xbf, 0x7e, 0xc1, 0xf7, 0x33, 0xd5, 0xe3, 0xd7, 0x16, 0xf8, 0x95, 0x0b, + 0xdf, 0xc7, 0x67, 0xce, 0xaf, 0x17, 0x47, 0x64, 0x0d, 0xd9, 0x94, 0xfb, 0xce, 0xcf, 0x2b, 0x27, + 0xba, 0x7e, 0xd2, 0xc3, 0xd7, 0xe8, 0xe8, 0x68, 0x70, 0x7c, 0xcd, 0x56, 0xfb, 0xd8, 0xb2, 0xe5, + 0xbe, 0xc1, 0x19, 0x96, 0x4e, 0xf4, 0x13, 0x9d, 0x3e, 0x5e, 0x23, 0x4f, 0x8c, 0x2a, 0xfc, 0x07, + 0x20, 0x2b, 0xe2, 0x0f, 0x06, 0xd8, 0xb2, 0xd1, 0x75, 0x48, 0xe1, 0x4e, 0x57, 0xaf, 0xc5, 0x2f, + 0xc5, 0xaf, 0x14, 0xae, 0x5f, 0x58, 0x0d, 0x4d, 0x6e, 0x95, 0xf3, 0x35, 0x3b, 0x5d, 0xbd, 0x15, + 0x13, 0x29, 0x2f, 0xba, 0x09, 0xe9, 0xe3, 0xde, 0xc0, 0xea, 0xd6, 0x12, 0x54, 0xe8, 0x62, 0x94, + 0xd0, 0x26, 0x61, 0x6a, 0xc5, 0x44, 0xc6, 0x4d, 0x5e, 0xa5, 0x6a, 0xc7, 0x7a, 0x2d, 0x39, 0xf9, + 0x55, 0x5b, 0xda, 0x31, 0x7d, 0x15, 0xe1, 0x45, 0xeb, 0x00, 0xaa, 0xa6, 0xda, 0x52, 0xa7, 0x2b, + 0xab, 0x5a, 0x2d, 0x45, 0x25, 0x9f, 0x8c, 0x96, 0x54, 0xed, 0x06, 0x61, 0x6c, 0xc5, 0xc4, 0xbc, + 0xea, 0x0c, 0xc8, 0xe7, 0x7e, 0x30, 0xc0, 0xe6, 0x59, 0x2d, 0x3d, 0xf9, 0x73, 0xdf, 0x22, 0x4c, + 0xe4, 0x73, 0x29, 0x37, 0xda, 0x82, 0xc2, 0x11, 0x3e, 0x51, 0x35, 0xe9, 0xa8, 0xa7, 0x77, 0xee, + 0xd7, 0x32, 0x54, 0x58, 0x88, 0x12, 0x5e, 0x27, 0xac, 0xeb, 0x84, 0x73, 0x3d, 0x51, 0x8b, 0xb7, + 0x62, 0x22, 0x1c, 0xb9, 0x14, 0xf4, 0x1a, 0xe4, 0x3a, 0x5d, 0xdc, 0xb9, 0x2f, 0xd9, 0xc3, 0x5a, + 0x96, 0xea, 0x59, 0x89, 0xd2, 0xd3, 0x20, 0x7c, 0xed, 0x61, 0x2b, 0x26, 0x66, 0x3b, 0xec, 0x11, + 0x6d, 0x02, 0x28, 0xb8, 0xa7, 0x9e, 0x62, 0x93, 0xc8, 0xe7, 0x26, 0xdb, 0x60, 0x83, 0x71, 0xb6, + 0x87, 0xfc, 0x33, 0xf2, 0x8a, 0x43, 0x40, 0x0d, 0xc8, 0x63, 0x4d, 0xe1, 0xd3, 0xc9, 0x53, 0x35, + 0x97, 0x22, 0xd7, 0x5b, 0x53, 0xfc, 0x93, 0xc9, 0x61, 0x3e, 0x46, 0xb7, 0x20, 0xd3, 0xd1, 0xfb, + 0x7d, 0xd5, 0xae, 0x01, 0xd5, 0xb0, 0x1c, 0x39, 0x11, 0xca, 0xd5, 0x8a, 0x89, 0x9c, 0x1f, 0xed, + 0x40, 0xb9, 0xa7, 0x5a, 0xb6, 0x64, 0x69, 0xb2, 0x61, 0x75, 0x75, 0xdb, 0xaa, 0x15, 0xa8, 0x86, + 0xa7, 0xa2, 0x34, 0x6c, 0xab, 0x96, 0xbd, 0xef, 0x30, 0xb7, 0x62, 0x62, 0xa9, 0xe7, 0x27, 0x10, + 0x7d, 0xfa, 0xf1, 0x31, 0x36, 0x5d, 0x85, 0xb5, 0xe2, 0x64, 0x7d, 0xbb, 0x84, 0xdb, 0x91, 0x27, + 0xfa, 0x74, 0x3f, 0x01, 0xfd, 0x00, 0x16, 0x7b, 0xba, 0xac, 0xb8, 0xea, 0xa4, 0x4e, 0x77, 0xa0, + 0xdd, 0xaf, 0x95, 0xa8, 0xd2, 0x67, 0x23, 0x3f, 0x52, 0x97, 0x15, 0x47, 0x45, 0x83, 0x08, 0xb4, + 0x62, 0xe2, 0x42, 0x2f, 0x4c, 0x44, 0xf7, 0x60, 0x49, 0x36, 0x8c, 0xde, 0x59, 0x58, 0x7b, 0x99, + 0x6a, 0xbf, 0x1a, 0xa5, 0x7d, 0x8d, 0xc8, 0x84, 0xd5, 0x23, 0x79, 0x84, 0x8a, 0xda, 0x50, 0x35, + 0x4c, 0x6c, 0xc8, 0x26, 0x96, 0x0c, 0x53, 0x37, 0x74, 0x4b, 0xee, 0xd5, 0x2a, 0x54, 0xf7, 0x33, + 0x51, 0xba, 0xf7, 0x18, 0xff, 0x1e, 0x67, 0x6f, 0xc5, 0xc4, 0x8a, 0x11, 0x24, 0x31, 0xad, 0x7a, + 0x07, 0x5b, 0x96, 0xa7, 0xb5, 0x3a, 0x4d, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x13, 0x0a, + 0x78, 0x48, 0xc4, 0xa5, 0x53, 0xdd, 0xc6, 0xb5, 0x85, 0xc9, 0x1b, 0xab, 0x49, 0x59, 0x0f, 0x75, + 0x1b, 0x93, 0x4d, 0x85, 0xdd, 0x11, 0x92, 0xe1, 0xb1, 0x53, 0x6c, 0xaa, 0xc7, 0x67, 0x54, 0x8d, + 0x44, 0x7f, 0xb1, 0x54, 0x5d, 0xab, 0x21, 0xaa, 0xf0, 0xb9, 0x28, 0x85, 0x87, 0x54, 0x88, 0xa8, + 0x68, 0x3a, 0x22, 0xad, 0x98, 0xb8, 0x78, 0x3a, 0x4a, 0x26, 0x2e, 0x76, 0xac, 0x6a, 0x72, 0x4f, + 0xfd, 0x08, 0xf3, 0x6d, 0xb3, 0x38, 0xd9, 0xc5, 0x36, 0x39, 0x37, 0xdd, 0x2b, 0xc4, 0xc5, 0x8e, + 0xfd, 0x84, 0xf5, 0x2c, 0xa4, 0x4f, 0xe5, 0xde, 0x00, 0x0b, 0xcf, 0x40, 0xc1, 0x17, 0x58, 0x51, + 0x0d, 0xb2, 0x7d, 0x6c, 0x59, 0xf2, 0x09, 0xa6, 0x71, 0x38, 0x2f, 0x3a, 0x43, 0xa1, 0x0c, 0x45, + 0x7f, 0x30, 0x15, 0x3e, 0x8d, 0xbb, 0x92, 0x24, 0x4e, 0x12, 0xc9, 0x53, 0x6c, 0xd2, 0x69, 0x73, + 0x49, 0x3e, 0x44, 0x97, 0xa1, 0x44, 0x3f, 0x59, 0x72, 0x7e, 0x27, 0xc1, 0x3a, 0x25, 0x16, 0x29, + 0xf1, 0x90, 0x33, 0xad, 0x40, 0xc1, 0xb8, 0x6e, 0xb8, 0x2c, 0x49, 0xca, 0x02, 0xc6, 0x75, 0xc3, + 0x61, 0x78, 0x12, 0x8a, 0x64, 0x7e, 0x2e, 0x47, 0x8a, 0xbe, 0xa4, 0x40, 0x68, 0x9c, 0x45, 0xf8, + 0x63, 0x02, 0xaa, 0xe1, 0x00, 0x8c, 0x6e, 0x41, 0x8a, 0xe4, 0x22, 0x9e, 0x56, 0xea, 0xab, 0x2c, + 0x51, 0xad, 0x3a, 0x89, 0x6a, 0xb5, 0xed, 0x24, 0xaa, 0xf5, 0xdc, 0xe7, 0x5f, 0xae, 0xc4, 0x3e, + 0xfd, 0xdb, 0x4a, 0x5c, 0xa4, 0x12, 0xe8, 0x3c, 0x89, 0x95, 0xb2, 0xaa, 0x49, 0xaa, 0x42, 0x3f, + 0x39, 0x4f, 0x02, 0xa1, 0xac, 0x6a, 0x5b, 0x0a, 0xda, 0x86, 0x6a, 0x47, 0xd7, 0x2c, 0xac, 0x59, + 0x03, 0x4b, 0x62, 0x89, 0x90, 0x27, 0x93, 0x40, 0x38, 0x64, 0xe9, 0xb5, 0xe1, 0x70, 0xee, 0x51, + 0x46, 0xb1, 0xd2, 0x09, 0x12, 0x48, 0x58, 0x3d, 0x95, 0x7b, 0xaa, 0x22, 0xdb, 0xba, 0x69, 0xd5, + 0x52, 0x97, 0x92, 0x63, 0xe3, 0xe1, 0xa1, 0xc3, 0x72, 0x60, 0x28, 0xb2, 0x8d, 0xd7, 0x53, 0xe4, + 0x73, 0x45, 0x9f, 0x24, 0x7a, 0x1a, 0x2a, 0xb2, 0x61, 0x48, 0x96, 0x2d, 0xdb, 0x58, 0x3a, 0x3a, + 0xb3, 0xb1, 0x45, 0x13, 0x4d, 0x51, 0x2c, 0xc9, 0x86, 0xb1, 0x4f, 0xa8, 0xeb, 0x84, 0x88, 0x9e, + 0x82, 0x32, 0xc9, 0x49, 0xaa, 0xdc, 0x93, 0xba, 0x58, 0x3d, 0xe9, 0xda, 0x34, 0xa5, 0x24, 0xc5, + 0x12, 0xa7, 0xb6, 0x28, 0x51, 0x50, 0xdc, 0x15, 0xa7, 0xf9, 0x08, 0x21, 0x48, 0x29, 0xb2, 0x2d, + 0x53, 0x4b, 0x16, 0x45, 0xfa, 0x4c, 0x68, 0x86, 0x6c, 0x77, 0xb9, 0x7d, 0xe8, 0x33, 0x3a, 0x07, + 0x19, 0xae, 0x36, 0x49, 0xd5, 0xf2, 0x11, 0x5a, 0x82, 0xb4, 0x61, 0xea, 0xa7, 0x98, 0x2e, 0x5d, + 0x4e, 0x64, 0x03, 0xe1, 0x47, 0x09, 0x58, 0x18, 0xc9, 0x5c, 0x44, 0x6f, 0x57, 0xb6, 0xba, 0xce, + 0xbb, 0xc8, 0x33, 0x7a, 0x89, 0xe8, 0x95, 0x15, 0x6c, 0xf2, 0x6c, 0x5f, 0x1b, 0x35, 0x75, 0x8b, + 0xfe, 0xce, 0x4d, 0xc3, 0xb9, 0xd1, 0x1d, 0xa8, 0xf6, 0x64, 0xcb, 0x96, 0x58, 0xf4, 0x97, 0x7c, + 0x99, 0xff, 0x89, 0x11, 0x23, 0xb3, 0x5c, 0x41, 0x1c, 0x9a, 0x2b, 0x29, 0x13, 0x51, 0x8f, 0x8a, + 0x44, 0x58, 0x3a, 0x3a, 0xfb, 0x48, 0xd6, 0x6c, 0x55, 0xc3, 0xd2, 0xc8, 0xaa, 0x9d, 0x1f, 0x51, + 0xd8, 0x3c, 0x55, 0x15, 0xac, 0x75, 0x9c, 0xe5, 0x5a, 0x74, 0x85, 0xdd, 0xe5, 0xb4, 0x04, 0x11, + 0xca, 0xc1, 0x9c, 0x8b, 0xca, 0x90, 0xb0, 0x87, 0x7c, 0xf2, 0x09, 0x7b, 0x88, 0xbe, 0x03, 0x29, + 0x32, 0x41, 0x3a, 0xf1, 0xf2, 0x98, 0x82, 0x85, 0xcb, 0xb5, 0xcf, 0x0c, 0x2c, 0x52, 0x4e, 0x41, + 0x70, 0xb7, 0x82, 0x9b, 0x87, 0xc3, 0x5a, 0x85, 0x67, 0xa1, 0x12, 0x4a, 0xb2, 0xbe, 0xb5, 0x8b, + 0xfb, 0xd7, 0x4e, 0xa8, 0x40, 0x29, 0x90, 0x4d, 0x85, 0x73, 0xb0, 0x34, 0x2e, 0x39, 0x0a, 0x5d, + 0x97, 0x1e, 0x48, 0x72, 0xe8, 0x26, 0xe4, 0xdc, 0xec, 0xc8, 0xb6, 0xe2, 0xa8, 0xad, 0x1c, 0x66, + 0xd1, 0x65, 0x25, 0x7b, 0x90, 0xb8, 0x34, 0xf5, 0x85, 0x04, 0xfd, 0xf0, 0xac, 0x6c, 0x18, 0x2d, + 0xd9, 0xea, 0x0a, 0xef, 0x41, 0x2d, 0x2a, 0xf3, 0x85, 0xa6, 0x91, 0x72, 0x5d, 0xf0, 0x1c, 0x64, + 0x8e, 0x75, 0xb3, 0x2f, 0xdb, 0x54, 0x59, 0x49, 0xe4, 0x23, 0xe2, 0x9a, 0x2c, 0x0b, 0x26, 0x29, + 0x99, 0x0d, 0x04, 0x09, 0xce, 0x47, 0x66, 0x3f, 0x22, 0xa2, 0x6a, 0x0a, 0x66, 0xf6, 0x2c, 0x89, + 0x6c, 0xe0, 0x29, 0x62, 0x1f, 0xcb, 0x06, 0xe4, 0xb5, 0x16, 0x9d, 0x2b, 0xd5, 0x9f, 0x17, 0xf9, + 0x48, 0xf8, 0x7d, 0x02, 0xce, 0x8d, 0xcf, 0x81, 0x0f, 0x75, 0x03, 0x54, 0x21, 0x69, 0x0f, 0x49, + 0x80, 0x4a, 0x5e, 0x29, 0x8a, 0xe4, 0x11, 0x1d, 0xc0, 0x42, 0x4f, 0xef, 0xc8, 0x3d, 0xc9, 0xb7, + 0x31, 0x78, 0x4d, 0x7b, 0x79, 0xd4, 0x85, 0x69, 0xa6, 0xc3, 0xca, 0xc8, 0xde, 0xa8, 0x50, 0x1d, + 0xdb, 0xee, 0x06, 0x89, 0xdc, 0x1c, 0xe9, 0x6f, 0xbe, 0x39, 0xd0, 0x25, 0x28, 0xf6, 0xe5, 0xa1, + 0x64, 0x0f, 0x79, 0x44, 0x63, 0xa1, 0x0a, 0xfa, 0xf2, 0xb0, 0x3d, 0xa4, 0xe1, 0x4c, 0xf8, 0xa5, + 0xdf, 0x8a, 0xc1, 0x04, 0xff, 0x68, 0xad, 0xb8, 0x0f, 0x4b, 0xac, 0x18, 0xc1, 0xca, 0x18, 0x43, + 0xce, 0x10, 0x5c, 0x90, 0x23, 0xfe, 0x68, 0x6d, 0x28, 0xbc, 0xe1, 0x86, 0x58, 0xaf, 0x86, 0x41, + 0x57, 0x21, 0x45, 0xab, 0x1e, 0xb6, 0x1b, 0xcf, 0x8d, 0x5a, 0x81, 0x70, 0x89, 0x94, 0x47, 0x68, + 0x41, 0x3d, 0xba, 0x66, 0x99, 0x4b, 0xd3, 0x2f, 0x12, 0x6e, 0x80, 0x08, 0x94, 0x28, 0x8f, 0x78, + 0xa9, 0xde, 0x82, 0x45, 0x05, 0x77, 0x54, 0xe5, 0x9b, 0xae, 0xd4, 0x02, 0x97, 0x7e, 0xc4, 0x0b, + 0xf5, 0xe7, 0x02, 0xe4, 0x44, 0x6c, 0x19, 0xa4, 0x40, 0x40, 0xeb, 0x90, 0xc7, 0xc3, 0x0e, 0x36, + 0x6c, 0xa7, 0xa6, 0x1a, 0x5f, 0x9b, 0x32, 0xee, 0xa6, 0xc3, 0x49, 0x90, 0x96, 0x2b, 0x86, 0x6e, + 0x70, 0x50, 0x1d, 0x8d, 0x8f, 0xb9, 0xb8, 0x1f, 0x55, 0xbf, 0xe4, 0xa0, 0xea, 0x64, 0x24, 0xb0, + 0x62, 0x52, 0x21, 0x58, 0x7d, 0x83, 0xc3, 0xea, 0xd4, 0x94, 0x97, 0x05, 0x70, 0x75, 0x23, 0x80, + 0xab, 0xd3, 0x53, 0xa6, 0x19, 0x01, 0xac, 0x5f, 0x72, 0x80, 0x75, 0x66, 0xca, 0x17, 0x87, 0x90, + 0xf5, 0xed, 0x20, 0xb2, 0xce, 0x46, 0x44, 0x40, 0x47, 0x7a, 0x22, 0xb4, 0x7e, 0xdd, 0x07, 0xad, + 0x73, 0x91, 0x98, 0x96, 0x29, 0x1a, 0x83, 0xad, 0xdf, 0x0c, 0x60, 0xeb, 0xfc, 0x14, 0x3b, 0x4c, + 0x00, 0xd7, 0x1b, 0x7e, 0x70, 0x0d, 0x91, 0x18, 0x9d, 0xaf, 0x7b, 0x14, 0xba, 0x7e, 0xc5, 0x45, + 0xd7, 0x85, 0xc8, 0x36, 0x01, 0x9f, 0x4b, 0x18, 0x5e, 0xef, 0x8e, 0xc0, 0x6b, 0x06, 0x87, 0x9f, + 0x8e, 0x54, 0x31, 0x05, 0x5f, 0xef, 0x8e, 0xe0, 0xeb, 0xd2, 0x14, 0x85, 0x53, 0x00, 0xf6, 0xbb, + 0xe3, 0x01, 0x76, 0x34, 0x04, 0xe6, 0x9f, 0x39, 0x1b, 0xc2, 0x96, 0x22, 0x10, 0x76, 0x25, 0x12, + 0x0d, 0x32, 0xf5, 0x33, 0x43, 0xec, 0x83, 0x31, 0x10, 0x9b, 0x81, 0xe1, 0x2b, 0x91, 0xca, 0x67, + 0xc0, 0xd8, 0x07, 0x63, 0x30, 0xf6, 0xc2, 0x54, 0xb5, 0x53, 0x41, 0xf6, 0x66, 0x10, 0x64, 0xa3, + 0x29, 0x7b, 0x2c, 0x12, 0x65, 0x1f, 0x45, 0xa1, 0x6c, 0x86, 0x84, 0x9f, 0x8f, 0xd4, 0x38, 0x07, + 0xcc, 0xde, 0x1d, 0x81, 0xd9, 0x4b, 0x53, 0x3c, 0x6d, 0x56, 0x9c, 0xfd, 0x2c, 0x49, 0xc1, 0xa1, + 0x50, 0x4d, 0xaa, 0x45, 0x6c, 0x9a, 0xba, 0xc9, 0x11, 0x33, 0x1b, 0x08, 0x57, 0x08, 0xee, 0xf2, + 0xc2, 0xf2, 0x04, 0x4c, 0x4e, 0xab, 0x72, 0x5f, 0x28, 0x16, 0x7e, 0x1b, 0xf7, 0x64, 0x29, 0x5c, + 0xf1, 0x63, 0xb6, 0x3c, 0xc7, 0x6c, 0x3e, 0xa4, 0x9e, 0x08, 0x22, 0xf5, 0x15, 0x28, 0x90, 0x6a, + 0x3b, 0x04, 0xc2, 0x65, 0xc3, 0x05, 0xe1, 0x57, 0x61, 0x81, 0xa6, 0x4f, 0x86, 0xe7, 0x79, 0x89, + 0x9d, 0xa2, 0x15, 0x59, 0x85, 0xfc, 0xc0, 0xac, 0xc0, 0x6a, 0xed, 0x17, 0x60, 0xd1, 0xc7, 0xeb, + 0x56, 0xf1, 0x0c, 0x91, 0x56, 0x5d, 0xee, 0x35, 0x5e, 0xce, 0xff, 0x21, 0xee, 0x59, 0xc8, 0x43, + 0xef, 0xe3, 0x80, 0x76, 0xfc, 0x21, 0x01, 0xed, 0xc4, 0x37, 0x06, 0xda, 0x7e, 0x54, 0x92, 0x0c, + 0xa2, 0x92, 0x7f, 0xc6, 0xbd, 0x35, 0x71, 0x61, 0x73, 0x47, 0x57, 0x30, 0xc7, 0x09, 0xf4, 0x99, + 0x14, 0x28, 0x3d, 0xfd, 0x84, 0xa3, 0x01, 0xf2, 0x48, 0xb8, 0xdc, 0xdc, 0x99, 0xe7, 0xa9, 0xd1, + 0x85, 0x18, 0x69, 0x6a, 0x61, 0x0e, 0x31, 0xaa, 0x90, 0xbc, 0x8f, 0x59, 0xa6, 0x2b, 0x8a, 0xe4, + 0x91, 0xf0, 0x51, 0x27, 0xa3, 0xf9, 0xab, 0x28, 0xb2, 0x01, 0xba, 0x05, 0x79, 0xda, 0xfc, 0x97, + 0x74, 0xc3, 0xe2, 0x09, 0x29, 0x50, 0xe8, 0xb0, 0x1e, 0xff, 0xea, 0x1e, 0xe1, 0xd9, 0x35, 0x2c, + 0x31, 0x67, 0xf0, 0x27, 0x1f, 0x7a, 0xca, 0x07, 0x00, 0xfc, 0x05, 0xc8, 0x93, 0xaf, 0xb7, 0x0c, + 0xb9, 0x83, 0x69, 0x66, 0xc9, 0x8b, 0x1e, 0x41, 0xb8, 0x07, 0x68, 0x34, 0x4f, 0xa2, 0x16, 0x64, + 0xf0, 0x29, 0xd6, 0x6c, 0xb2, 0x6c, 0xc9, 0x70, 0x75, 0xc8, 0xeb, 0x22, 0xac, 0xd9, 0xeb, 0x35, + 0x62, 0xe4, 0x7f, 0x7c, 0xb9, 0x52, 0x65, 0xdc, 0xcf, 0xeb, 0x7d, 0xd5, 0xc6, 0x7d, 0xc3, 0x3e, + 0x13, 0xb9, 0xbc, 0xf0, 0xd7, 0x04, 0x81, 0xab, 0x81, 0xfc, 0x39, 0xd6, 0xb6, 0x8e, 0xcb, 0x27, + 0x7c, 0x6d, 0x8a, 0xd9, 0xec, 0x7d, 0x11, 0xe0, 0x44, 0xb6, 0xa4, 0x0f, 0x65, 0xcd, 0xc6, 0x0a, + 0x37, 0x7a, 0xfe, 0x44, 0xb6, 0xde, 0xa6, 0x04, 0xb2, 0xea, 0xe4, 0xe7, 0x81, 0x85, 0x15, 0x8e, + 0x42, 0xb2, 0x27, 0xb2, 0x75, 0x60, 0x61, 0xc5, 0x37, 0xcb, 0xec, 0x83, 0xcd, 0x32, 0x68, 0xe3, + 0x5c, 0xc8, 0xc6, 0x3e, 0x20, 0x99, 0xf7, 0x03, 0x49, 0x54, 0x87, 0x9c, 0x61, 0xaa, 0xba, 0xa9, + 0xda, 0x67, 0x74, 0x61, 0x92, 0xa2, 0x3b, 0x46, 0x97, 0xa1, 0xd4, 0xc7, 0x7d, 0x43, 0xd7, 0x7b, + 0x12, 0x0b, 0x36, 0x05, 0x2a, 0x5a, 0xe4, 0xc4, 0x26, 0x8d, 0x39, 0x1f, 0x27, 0xbc, 0xdd, 0xe7, + 0x35, 0x0c, 0x1e, 0xae, 0x79, 0x97, 0xc7, 0x98, 0xd7, 0x47, 0x21, 0x93, 0x08, 0xd9, 0xd7, 0x1d, + 0x7f, 0x5b, 0x06, 0x16, 0x7e, 0x42, 0x5b, 0x88, 0xc1, 0xda, 0x08, 0xed, 0xc3, 0x82, 0xbb, 0xf9, + 0xa5, 0x01, 0x0d, 0x0a, 0x8e, 0x3b, 0xcf, 0x1a, 0x3d, 0xaa, 0xa7, 0x41, 0xb2, 0x85, 0xde, 0x81, + 0xc7, 0x43, 0x91, 0xcd, 0x55, 0x9d, 0x98, 0x35, 0xc0, 0x3d, 0x16, 0x0c, 0x70, 0x8e, 0x6a, 0xcf, + 0x58, 0xc9, 0x07, 0xdc, 0x73, 0x5b, 0x50, 0x0e, 0x96, 0x79, 0x63, 0x97, 0xff, 0x32, 0x94, 0x4c, + 0x6c, 0xcb, 0xaa, 0x26, 0x05, 0xfa, 0x7e, 0x45, 0x46, 0xe4, 0xdd, 0xc4, 0x3d, 0x78, 0x6c, 0x6c, + 0xb9, 0x87, 0x5e, 0x86, 0xbc, 0x57, 0x29, 0xc6, 0x23, 0xc0, 0x93, 0xdb, 0x1a, 0xf2, 0x78, 0x85, + 0xdf, 0xc5, 0x3d, 0x95, 0xc1, 0x66, 0x53, 0x13, 0x32, 0x26, 0xb6, 0x06, 0x3d, 0xd6, 0xfe, 0x29, + 0x5f, 0x7f, 0x61, 0xb6, 0x42, 0x91, 0x50, 0x07, 0x3d, 0x5b, 0xe4, 0xc2, 0xc2, 0x3d, 0xc8, 0x30, + 0x0a, 0x2a, 0x40, 0xf6, 0x60, 0xe7, 0xce, 0xce, 0xee, 0xdb, 0x3b, 0xd5, 0x18, 0x02, 0xc8, 0xac, + 0x35, 0x1a, 0xcd, 0xbd, 0x76, 0x35, 0x8e, 0xf2, 0x90, 0x5e, 0x5b, 0xdf, 0x15, 0xdb, 0xd5, 0x04, + 0x21, 0x8b, 0xcd, 0xdb, 0xcd, 0x46, 0xbb, 0x9a, 0x44, 0x0b, 0x50, 0x62, 0xcf, 0xd2, 0xe6, 0xae, + 0x78, 0x77, 0xad, 0x5d, 0x4d, 0xf9, 0x48, 0xfb, 0xcd, 0x9d, 0x8d, 0xa6, 0x58, 0x4d, 0x0b, 0x2f, + 0xc2, 0xf9, 0xc8, 0xd2, 0xd2, 0xeb, 0x24, 0xc5, 0x7d, 0x9d, 0x24, 0xe1, 0xe7, 0x09, 0x82, 0xc4, + 0xa3, 0xea, 0x45, 0x74, 0x3b, 0x34, 0xf1, 0xeb, 0x73, 0x14, 0x9b, 0xa1, 0xd9, 0xa3, 0xa7, 0xa0, + 0x6c, 0xe2, 0x63, 0x6c, 0x77, 0xba, 0xac, 0x7e, 0x65, 0x09, 0xb3, 0x24, 0x96, 0x38, 0x95, 0x0a, + 0x59, 0x8c, 0xed, 0x7d, 0xdc, 0xb1, 0x25, 0x16, 0x8b, 0x98, 0xd3, 0xe5, 0x09, 0x1b, 0xa1, 0xee, + 0x33, 0xa2, 0xf0, 0xde, 0x5c, 0xb6, 0xcc, 0x43, 0x5a, 0x6c, 0xb6, 0xc5, 0x77, 0xaa, 0x49, 0x84, + 0xa0, 0x4c, 0x1f, 0xa5, 0xfd, 0x9d, 0xb5, 0xbd, 0xfd, 0xd6, 0x2e, 0xb1, 0xe5, 0x22, 0x54, 0x1c, + 0x5b, 0x3a, 0xc4, 0xb4, 0xf0, 0xa7, 0x04, 0x3c, 0x1e, 0x51, 0xed, 0xa2, 0x5b, 0x00, 0xf6, 0x50, + 0x32, 0x71, 0x47, 0x37, 0x95, 0x68, 0x27, 0x6b, 0x0f, 0x45, 0xca, 0x21, 0xe6, 0x6d, 0xfe, 0x64, + 0x4d, 0x68, 0x40, 0xa2, 0xd7, 0xb8, 0x52, 0x32, 0x2b, 0x67, 0xab, 0x5d, 0x1c, 0xd3, 0x3d, 0xc3, + 0x1d, 0xa2, 0x98, 0xda, 0x96, 0x2a, 0xa6, 0xfc, 0xe8, 0xee, 0xb8, 0xa0, 0x32, 0x63, 0xef, 0x7f, + 0xbe, 0x70, 0x92, 0x7e, 0xb0, 0x70, 0x22, 0xfc, 0x2a, 0xe9, 0x37, 0x6c, 0xb0, 0xb8, 0xdf, 0x85, + 0x8c, 0x65, 0xcb, 0xf6, 0xc0, 0xe2, 0x0e, 0xf7, 0xf2, 0xac, 0x48, 0x61, 0xd5, 0x79, 0xd8, 0xa7, + 0xe2, 0x22, 0x57, 0xf3, 0x7f, 0x7b, 0x5b, 0xc2, 0x4d, 0x28, 0x07, 0x8d, 0x13, 0xbd, 0x65, 0xbc, + 0x98, 0x93, 0x10, 0xde, 0xf5, 0xea, 0x2f, 0x5f, 0x97, 0x6f, 0x13, 0xca, 0x21, 0xb8, 0x14, 0x1f, + 0xc5, 0xf3, 0x5e, 0x97, 0xce, 0x85, 0x42, 0x62, 0xe9, 0xd4, 0x3f, 0x14, 0x7e, 0x1d, 0x87, 0x27, + 0x26, 0x00, 0x2a, 0xf4, 0x56, 0xc8, 0x11, 0x5e, 0x99, 0x07, 0x8e, 0xad, 0x32, 0x5a, 0xd0, 0x15, + 0x84, 0x1b, 0x50, 0xf4, 0xd3, 0x67, 0xb3, 0xc2, 0x4f, 0x93, 0x5e, 0x52, 0x08, 0x36, 0x18, 0x1f, + 0x5a, 0x25, 0x1a, 0x72, 0xc4, 0xc4, 0x9c, 0x8e, 0x38, 0xb6, 0x9a, 0x48, 0x3e, 0xba, 0x6a, 0x22, + 0xf5, 0x80, 0xd5, 0x84, 0x7f, 0x47, 0xa6, 0x83, 0x3b, 0x72, 0x24, 0xf1, 0x67, 0xc6, 0x24, 0xfe, + 0x77, 0x00, 0x7c, 0xe7, 0x67, 0x4b, 0x90, 0x36, 0xf5, 0x81, 0xa6, 0x50, 0x37, 0x49, 0x8b, 0x6c, + 0x80, 0x6e, 0x42, 0x9a, 0xb8, 0x9b, 0x63, 0xcc, 0xd1, 0xd0, 0x4c, 0xdc, 0xc5, 0xd7, 0x8e, 0x65, + 0xdc, 0x82, 0x0a, 0x68, 0xf4, 0x70, 0x22, 0xe2, 0x15, 0xaf, 0x07, 0x5f, 0xf1, 0x64, 0xe4, 0x31, + 0xc7, 0xf8, 0x57, 0x7d, 0x04, 0x69, 0xea, 0x1e, 0xa4, 0x00, 0xa2, 0x47, 0x71, 0x1c, 0x51, 0x93, + 0x67, 0xf4, 0x43, 0x00, 0xd9, 0xb6, 0x4d, 0xf5, 0x68, 0xe0, 0xbd, 0x60, 0x65, 0xbc, 0x7b, 0xad, + 0x39, 0x7c, 0xeb, 0x17, 0xb8, 0x9f, 0x2d, 0x79, 0xa2, 0x3e, 0x5f, 0xf3, 0x29, 0x14, 0x76, 0xa0, + 0x1c, 0x94, 0x75, 0x30, 0x20, 0xfb, 0x86, 0x20, 0x06, 0x64, 0x90, 0x9e, 0x63, 0x40, 0x17, 0x41, + 0x26, 0xd9, 0x91, 0x2b, 0x1d, 0x08, 0xff, 0x8e, 0x43, 0xd1, 0xef, 0x9d, 0xff, 0x6b, 0x30, 0x4a, + 0xf8, 0x38, 0x0e, 0x39, 0x77, 0xf2, 0x11, 0x47, 0x9e, 0x9e, 0xed, 0x12, 0xfe, 0x03, 0x3e, 0x76, + 0x86, 0x9a, 0x74, 0x4f, 0x66, 0x5f, 0x75, 0x2b, 0xae, 0xa8, 0xae, 0xb7, 0xdf, 0xd2, 0xce, 0x39, + 0x05, 0x2f, 0x30, 0x7f, 0xc6, 0xbf, 0x83, 0x94, 0x1a, 0xe8, 0xbb, 0x90, 0x91, 0x3b, 0x6e, 0xaf, + 0xbf, 0x3c, 0xa6, 0xf9, 0xeb, 0xb0, 0xae, 0xb6, 0x87, 0x6b, 0x94, 0x53, 0xe4, 0x12, 0xfc, 0xab, + 0x12, 0xee, 0xc9, 0xee, 0x1b, 0x44, 0x2f, 0xe3, 0x09, 0x86, 0xcd, 0x32, 0xc0, 0xc1, 0xce, 0xdd, + 0xdd, 0x8d, 0xad, 0xcd, 0xad, 0xe6, 0x06, 0xaf, 0xb9, 0x36, 0x36, 0x9a, 0x1b, 0xd5, 0x04, 0xe1, + 0x13, 0x9b, 0x77, 0x77, 0x0f, 0x9b, 0x1b, 0xd5, 0xa4, 0xf0, 0x2a, 0xe4, 0xdd, 0xd0, 0x83, 0x6a, + 0x90, 0x95, 0x15, 0xc5, 0xc4, 0x96, 0xc5, 0x8b, 0x51, 0x67, 0x48, 0x8f, 0xf4, 0xf5, 0x0f, 0xf9, + 0xb9, 0x66, 0x52, 0x64, 0x03, 0x41, 0x81, 0x4a, 0x28, 0x6e, 0xa1, 0x57, 0x21, 0x6b, 0x0c, 0x8e, + 0x24, 0xc7, 0x69, 0x43, 0x97, 0xee, 0x9c, 0x56, 0xc4, 0xe0, 0xa8, 0xa7, 0x76, 0xee, 0xe0, 0x33, + 0xc7, 0x4c, 0xc6, 0xe0, 0xe8, 0x0e, 0xf3, 0x6d, 0xf6, 0x96, 0x84, 0xff, 0x2d, 0x3f, 0x8e, 0x43, + 0xce, 0xd9, 0xab, 0xe8, 0x7b, 0x90, 0x77, 0x63, 0xa2, 0x7b, 0xd5, 0x23, 0x32, 0x98, 0x72, 0xfd, + 0x9e, 0x08, 0xba, 0x0a, 0x0b, 0x96, 0x7a, 0xa2, 0x39, 0xc7, 0x43, 0xac, 0xf7, 0x97, 0xa0, 0x9b, + 0xa6, 0xc2, 0x7e, 0xd8, 0x76, 0x1a, 0x56, 0xb7, 0x53, 0xb9, 0x64, 0x35, 0x75, 0x3b, 0x95, 0x4b, + 0x55, 0xd3, 0x24, 0x2d, 0x56, 0xc3, 0x81, 0xe3, 0xdb, 0xfc, 0x18, 0x52, 0x7e, 0x87, 0xf2, 0x3b, + 0xf3, 0xcd, 0x50, 0xfa, 0xfe, 0x57, 0x1c, 0x72, 0xce, 0x01, 0x14, 0x7a, 0xd1, 0x17, 0xc2, 0xca, + 0xe3, 0x3c, 0x96, 0x33, 0x7a, 0xd7, 0x09, 0x82, 0x53, 0x4a, 0xcc, 0x3f, 0xa5, 0xa8, 0x3b, 0x21, + 0xce, 0xed, 0x9c, 0xd4, 0xdc, 0xb7, 0x73, 0x9e, 0x07, 0x64, 0xeb, 0xb6, 0xdc, 0x93, 0x4e, 0x75, + 0x5b, 0xd5, 0x4e, 0x24, 0xe6, 0x21, 0x2c, 0xda, 0x54, 0xe9, 0x2f, 0x87, 0xf4, 0x87, 0x3d, 0xd7, + 0x59, 0x5c, 0x78, 0x38, 0xef, 0xed, 0x80, 0x73, 0x90, 0xe1, 0x08, 0x88, 0x5d, 0x0f, 0xe0, 0x23, + 0xf7, 0xc8, 0x32, 0xe5, 0x3b, 0xb2, 0xac, 0x43, 0xae, 0x8f, 0x6d, 0x99, 0x86, 0x4e, 0x96, 0x2d, + 0xdd, 0xf1, 0xd5, 0x57, 0xa0, 0xe0, 0xbb, 0xa8, 0x41, 0xa2, 0xe9, 0x4e, 0xf3, 0xed, 0x6a, 0xac, + 0x9e, 0xfd, 0xe4, 0xb3, 0x4b, 0xc9, 0x1d, 0xfc, 0x21, 0xd9, 0x68, 0x62, 0xb3, 0xd1, 0x6a, 0x36, + 0xee, 0x54, 0xe3, 0xf5, 0xc2, 0x27, 0x9f, 0x5d, 0xca, 0x8a, 0x98, 0x9e, 0x0f, 0x5d, 0x6d, 0x41, + 0xd1, 0xbf, 0x2a, 0xc1, 0x4d, 0x8d, 0xa0, 0xbc, 0x71, 0xb0, 0xb7, 0xbd, 0xd5, 0x58, 0x6b, 0x37, + 0xa5, 0xc3, 0xdd, 0x76, 0xb3, 0x1a, 0x47, 0x8f, 0xc3, 0xe2, 0xf6, 0xd6, 0x9b, 0xad, 0xb6, 0xd4, + 0xd8, 0xde, 0x6a, 0xee, 0xb4, 0xa5, 0xb5, 0x76, 0x7b, 0xad, 0x71, 0xa7, 0x9a, 0xb8, 0xfe, 0x9b, + 0x02, 0x54, 0xd6, 0xd6, 0x1b, 0x5b, 0x04, 0x00, 0xaa, 0x1d, 0x99, 0x86, 0x88, 0x06, 0xa4, 0x68, + 0xa7, 0x79, 0xe2, 0xa5, 0xdb, 0xfa, 0xe4, 0xd3, 0x43, 0xb4, 0x09, 0x69, 0xda, 0x84, 0x46, 0x93, + 0x6f, 0xe1, 0xd6, 0xa7, 0x1c, 0x27, 0x92, 0x8f, 0xa1, 0xbb, 0x68, 0xe2, 0xb5, 0xdc, 0xfa, 0xe4, + 0xd3, 0x45, 0xb4, 0x0d, 0x59, 0xa7, 0x47, 0x38, 0xed, 0x82, 0x6b, 0x7d, 0xea, 0x31, 0x1d, 0x99, + 0x1a, 0xeb, 0xe5, 0x4e, 0xbe, 0xb1, 0x5b, 0x9f, 0x72, 0xee, 0x88, 0xb6, 0x20, 0xc3, 0xdb, 0x28, + 0x53, 0x2e, 0xab, 0xd6, 0xa7, 0x1d, 0xb7, 0x21, 0x11, 0xf2, 0x5e, 0x97, 0x7c, 0xfa, 0x3d, 0xe4, + 0xfa, 0x0c, 0x47, 0xaa, 0xe8, 0x1e, 0x94, 0x82, 0xad, 0x99, 0xd9, 0x2e, 0xc4, 0xd6, 0x67, 0x3c, + 0xd8, 0x23, 0xfa, 0x83, 0x7d, 0x9a, 0xd9, 0x2e, 0xc8, 0xd6, 0x67, 0x3c, 0xe7, 0x43, 0xef, 0xc3, + 0xc2, 0x68, 0x1f, 0x65, 0xf6, 0xfb, 0xb2, 0xf5, 0x39, 0x4e, 0xfe, 0x50, 0x1f, 0xd0, 0x98, 0xfe, + 0xcb, 0x1c, 0xd7, 0x67, 0xeb, 0xf3, 0x1c, 0x04, 0x22, 0x05, 0x2a, 0xe1, 0x9e, 0xc6, 0xac, 0xd7, + 0x69, 0xeb, 0x33, 0x1f, 0x0a, 0xb2, 0xb7, 0x04, 0x01, 0xfe, 0xac, 0xd7, 0x6b, 0xeb, 0x33, 0x9f, + 0x11, 0xa2, 0x03, 0x00, 0x1f, 0x40, 0x9d, 0xe1, 0xba, 0x6d, 0x7d, 0x96, 0xd3, 0x42, 0x64, 0xc0, + 0xe2, 0x38, 0x60, 0x3a, 0xcf, 0xed, 0xdb, 0xfa, 0x5c, 0x87, 0x88, 0xc4, 0x9f, 0x83, 0x10, 0x73, + 0xb6, 0xdb, 0xb8, 0xf5, 0x19, 0x4f, 0x13, 0xd7, 0x9b, 0x9f, 0x7f, 0xb5, 0x1c, 0xff, 0xe2, 0xab, + 0xe5, 0xf8, 0xdf, 0xbf, 0x5a, 0x8e, 0x7f, 0xfa, 0xf5, 0x72, 0xec, 0x8b, 0xaf, 0x97, 0x63, 0x7f, + 0xf9, 0x7a, 0x39, 0xf6, 0xfd, 0xe7, 0x4e, 0x54, 0xbb, 0x3b, 0x38, 0x5a, 0xed, 0xe8, 0xfd, 0x6b, + 0xfe, 0x3f, 0x66, 0x8c, 0xfb, 0xb3, 0xc8, 0x51, 0x86, 0x66, 0xd3, 0x1b, 0xff, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0x07, 0x27, 0x03, 0x70, 0x4c, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5992,76 +5951,6 @@ func (m *RequestApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *RequestExtendVote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RequestExtendVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Vote != nil { - { - size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RequestVerifyVoteExtension) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RequestVerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RequestVerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Vote != nil { - { - size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *RequestPrepareProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6213,6 +6102,76 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *RequestExtendVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestExtendVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Vote != nil { + { + size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RequestVerifyVoteExtension) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestVerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestVerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Vote != nil { + { + size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *RequestFinalizeBlock) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7490,69 +7449,6 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *ResponseExtendVote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResponseExtendVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResponseExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.VoteExtension != nil { - { - size, err := m.VoteExtension.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ResponseVerifyVoteExtension) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResponseVerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResponseVerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Status != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Status)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - func (m *ResponsePrepareProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7583,7 +7479,7 @@ func (m *ResponsePrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 + dAtA[i] = 0x2a } if len(m.ValidatorUpdates) > 0 { for iNdEx := len(m.ValidatorUpdates) - 1; iNdEx >= 0; iNdEx-- { @@ -7596,7 +7492,7 @@ func (m *ResponsePrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } } if len(m.TxResults) > 0 { @@ -7610,7 +7506,7 @@ func (m *ResponsePrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } if len(m.AppHash) > 0 { @@ -7618,7 +7514,7 @@ func (m *ResponsePrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) copy(dAtA[i:], m.AppHash) i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } if len(m.TxRecords) > 0 { for iNdEx := len(m.TxRecords) - 1; iNdEx >= 0; iNdEx-- { @@ -7631,14 +7527,9 @@ func (m *ResponsePrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } } - if m.ModifiedTxStatus != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ModifiedTxStatus)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } @@ -7717,6 +7608,69 @@ func (m *ResponseProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ResponseExtendVote) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseExtendVote) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.VoteExtension != nil { + { + size, err := m.VoteExtension.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResponseVerifyVoteExtension) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseVerifyVoteExtension) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseVerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Status != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *ResponseFinalizeBlock) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8908,32 +8862,6 @@ func (m *RequestApplySnapshotChunk) Size() (n int) { return n } -func (m *RequestExtendVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Vote != nil { - l = m.Vote.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *RequestVerifyVoteExtension) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Vote != nil { - l = m.Vote.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - func (m *RequestPrepareProposal) Size() (n int) { if m == nil { return 0 @@ -8995,6 +8923,32 @@ func (m *RequestProcessProposal) Size() (n int) { return n } +func (m *RequestExtendVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Vote != nil { + l = m.Vote.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *RequestVerifyVoteExtension) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Vote != nil { + l = m.Vote.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *RequestFinalizeBlock) Size() (n int) { if m == nil { return 0 @@ -9615,40 +9569,12 @@ func (m *ResponseApplySnapshotChunk) Size() (n int) { return n } -func (m *ResponseExtendVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.VoteExtension != nil { - l = m.VoteExtension.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *ResponseVerifyVoteExtension) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Status != 0 { - n += 1 + sovTypes(uint64(m.Status)) - } - return n -} - func (m *ResponsePrepareProposal) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.ModifiedTxStatus != 0 { - n += 1 + sovTypes(uint64(m.ModifiedTxStatus)) - } if len(m.TxRecords) > 0 { for _, e := range m.TxRecords { l = e.Size() @@ -9710,6 +9636,31 @@ func (m *ResponseProcessProposal) Size() (n int) { return n } +func (m *ResponseExtendVote) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.VoteExtension != nil { + l = m.VoteExtension.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponseVerifyVoteExtension) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + sovTypes(uint64(m.Status)) + } + return n +} + func (m *ResponseFinalizeBlock) Size() (n int) { if m == nil { return 0 @@ -12310,178 +12261,6 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestExtendVote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestExtendVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestExtendVote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vote == nil { - m.Vote = &types1.Vote{} - } - if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RequestVerifyVoteExtension) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RequestVerifyVoteExtension: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestVerifyVoteExtension: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vote == nil { - m.Vote = &types1.Vote{} - } - if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *RequestPrepareProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -12933,6 +12712,178 @@ func (m *RequestProcessProposal) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestExtendVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestExtendVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestExtendVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vote == nil { + m.Vote = &types1.Vote{} + } + if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestVerifyVoteExtension) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestVerifyVoteExtension: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestVerifyVoteExtension: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vote == nil { + m.Vote = &types1.Vote{} + } + if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RequestFinalizeBlock) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -16140,161 +16091,6 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseExtendVote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResponseExtendVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseExtendVote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VoteExtension", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.VoteExtension == nil { - m.VoteExtension = &types1.VoteExtension{} - } - if err := m.VoteExtension.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResponseVerifyVoteExtension) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResponseVerifyVoteExtension: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseVerifyVoteExtension: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - m.Status = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Status |= ResponseVerifyVoteExtension_VerifyStatus(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -16325,25 +16121,6 @@ func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ModifiedTxStatus", wireType) - } - m.ModifiedTxStatus = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ModifiedTxStatus |= ResponsePrepareProposal_ModifiedTxStatus(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field TxRecords", wireType) } @@ -16377,7 +16154,7 @@ func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) } @@ -16411,7 +16188,7 @@ func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { m.AppHash = []byte{} } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field TxResults", wireType) } @@ -16445,7 +16222,7 @@ func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorUpdates", wireType) } @@ -16479,7 +16256,7 @@ func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParamUpdates", wireType) } @@ -16743,6 +16520,161 @@ func (m *ResponseProcessProposal) Unmarshal(dAtA []byte) error { } return nil } +func (m *ResponseExtendVote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseExtendVote: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseExtendVote: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VoteExtension", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.VoteExtension == nil { + m.VoteExtension = &types1.VoteExtension{} + } + if err := m.VoteExtension.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseVerifyVoteExtension) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseVerifyVoteExtension: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseVerifyVoteExtension: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= ResponseVerifyVoteExtension_VerifyStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ResponseFinalizeBlock) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/cmd/tendermint/commands/debug/debug.go b/cmd/tendermint/commands/debug/debug.go index 478a03d55..7fd5b030f 100644 --- a/cmd/tendermint/commands/debug/debug.go +++ b/cmd/tendermint/commands/debug/debug.go @@ -2,6 +2,7 @@ package debug import ( "github.com/spf13/cobra" + "github.com/tendermint/tendermint/libs/log" ) diff --git a/internal/consensus/mempool_test.go b/internal/consensus/mempool_test.go index f218a5cf1..ab7a2baf3 100644 --- a/internal/consensus/mempool_test.go +++ b/internal/consensus/mempool_test.go @@ -317,9 +317,20 @@ func (app *CounterApplication) Commit() abci.ResponseCommit { func (app *CounterApplication) PrepareProposal( req abci.RequestPrepareProposal) abci.ResponsePrepareProposal { - return abci.ResponsePrepareProposal{ - ModifiedTxStatus: abci.ResponsePrepareProposal_UNMODIFIED, + + trs := make([]*abci.TxRecord, 0, len(req.Txs)) + var totalBytes int64 + for _, tx := range req.Txs { + totalBytes += int64(len(tx)) + if totalBytes > req.MaxTxBytes { + break + } + trs = append(trs, &abci.TxRecord{ + Action: abci.TxRecord_UNMODIFIED, + Tx: tx, + }) } + return abci.ResponsePrepareProposal{TxRecords: trs} } func (app *CounterApplication) ProcessProposal( diff --git a/internal/consensus/mocks/cons_sync_reactor.go b/internal/consensus/mocks/cons_sync_reactor.go index 5ac592f0d..b254fc701 100644 --- a/internal/consensus/mocks/cons_sync_reactor.go +++ b/internal/consensus/mocks/cons_sync_reactor.go @@ -4,6 +4,7 @@ package mocks import ( mock "github.com/stretchr/testify/mock" + state "github.com/tendermint/tendermint/internal/state" ) diff --git a/internal/consensus/peer_state_test.go b/internal/consensus/peer_state_test.go index 2b5712455..97be569ff 100644 --- a/internal/consensus/peer_state_test.go +++ b/internal/consensus/peer_state_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/types" diff --git a/internal/consensus/state.go b/internal/consensus/state.go index b96c9cecb..670d0c42b 100644 --- a/internal/consensus/state.go +++ b/internal/consensus/state.go @@ -1415,7 +1415,11 @@ func (cs *State) createProposalBlock(ctx context.Context) (*types.Block, error) proposerAddr := cs.privValidatorPubKey.Address() - return cs.blockExec.CreateProposalBlock(ctx, cs.Height, cs.state, commit, proposerAddr, cs.LastCommit.GetVotes()) + ret, err := cs.blockExec.CreateProposalBlock(ctx, cs.Height, cs.state, commit, proposerAddr, cs.LastCommit.GetVotes()) + if err != nil { + panic(err) + } + return ret, nil } // Enter: `timeoutPropose` after entering Propose. diff --git a/internal/evidence/mocks/block_store.go b/internal/evidence/mocks/block_store.go index ef3346b2a..5ea8d8344 100644 --- a/internal/evidence/mocks/block_store.go +++ b/internal/evidence/mocks/block_store.go @@ -4,6 +4,7 @@ package mocks import ( mock "github.com/stretchr/testify/mock" + types "github.com/tendermint/tendermint/types" ) diff --git a/internal/mempool/mempool_bench_test.go b/internal/mempool/mempool_bench_test.go index 843e42e87..cc3ff7368 100644 --- a/internal/mempool/mempool_bench_test.go +++ b/internal/mempool/mempool_bench_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/stretchr/testify/require" + abciclient "github.com/tendermint/tendermint/abci/client" "github.com/tendermint/tendermint/abci/example/kvstore" "github.com/tendermint/tendermint/libs/log" diff --git a/internal/proxy/client.go b/internal/proxy/client.go index 7444c841e..2af1b1021 100644 --- a/internal/proxy/client.go +++ b/internal/proxy/client.go @@ -8,6 +8,7 @@ import ( "time" "github.com/go-kit/kit/metrics" + abciclient "github.com/tendermint/tendermint/abci/client" "github.com/tendermint/tendermint/abci/example/kvstore" "github.com/tendermint/tendermint/abci/types" diff --git a/internal/proxy/client_test.go b/internal/proxy/client_test.go index c3991a8e2..057177a60 100644 --- a/internal/proxy/client_test.go +++ b/internal/proxy/client_test.go @@ -14,6 +14,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "gotest.tools/assert" + abciclient "github.com/tendermint/tendermint/abci/client" abcimocks "github.com/tendermint/tendermint/abci/client/mocks" "github.com/tendermint/tendermint/abci/example/kvstore" @@ -21,7 +23,6 @@ import ( "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" tmrand "github.com/tendermint/tendermint/libs/rand" - "gotest.tools/assert" ) //---------------------------------------- diff --git a/internal/state/execution.go b/internal/state/execution.go index bd800ae8e..b28288f49 100644 --- a/internal/state/execution.go +++ b/internal/state/execution.go @@ -121,22 +121,15 @@ func (blockExec *BlockExecutor) CreateProposalBlock( // transaction causing an error. // // Also, the App can simply skip any transaction that could cause any kind of trouble. - // Either way, we can not recover in a meaningful way, unless we skip proposing - // this block, repair what caused the error and try again. Hence, we panic on - // purpose for now. - panic(err) - } - if rpp.IsTxStatusUnknown() { - panic(fmt.Sprintf("PrepareProposal responded with ModifiedTxStatus %s", rpp.ModifiedTxStatus.String())) - } - - if !rpp.IsTxStatusModified() { - return block, nil + // Either way, we cannot recover in a meaningful way, unless we skip proposing + // this block, repair what caused the error and try again. Hence, we return an + // error for now (the production code calling this function is expected to panic). + return nil, err } txrSet := types.NewTxRecordSet(rpp.TxRecords) if err := txrSet.Validate(maxDataBytes, block.Txs); err != nil { - panic(fmt.Errorf("ResponsePrepareProposal validation: %w", err)) + return nil, err } for _, rtx := range txrSet.RemovedTxs() { diff --git a/internal/state/execution_test.go b/internal/state/execution_test.go index 9c5042645..3093e2c53 100644 --- a/internal/state/execution_test.go +++ b/internal/state/execution_test.go @@ -2,6 +2,7 @@ package state_test import ( "context" + "errors" "testing" "time" @@ -11,6 +12,7 @@ import ( dbm "github.com/tendermint/tm-db" abciclient "github.com/tendermint/tendermint/abci/client" + abciclientmocks "github.com/tendermint/tendermint/abci/client/mocks" abci "github.com/tendermint/tendermint/abci/types" abcimocks "github.com/tendermint/tendermint/abci/types/mocks" "github.com/tendermint/tendermint/crypto" @@ -271,7 +273,7 @@ func TestFinalizeBlockByzantineValidators(t *testing.T) { func TestProcessProposal(t *testing.T) { const height = 2 - txs := factory.MakeTenTxs(height) + txs := factory.MakeNTxs(height, 10) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -617,9 +619,7 @@ func TestEmptyPrepareProposal(t *testing.T) { require.NoError(t, eventBus.Start(ctx)) app := abcimocks.NewBaseMock() - app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTxStatus: abci.ResponsePrepareProposal_UNMODIFIED, - }, nil) + app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{}) cc := abciclient.NewLocalClient(logger, app) proxyApp := proxy.New(cc, logger, proxy.NopMetrics()) err := proxyApp.Start(ctx) @@ -656,9 +656,10 @@ func TestEmptyPrepareProposal(t *testing.T) { require.NoError(t, err) } -// TestPrepareProposalPanicOnInvalid tests that the block creation logic panics -// if the ResponsePrepareProposal returned from the application is invalid. -func TestPrepareProposalPanicOnInvalid(t *testing.T) { +// TestPrepareProposalErrorOnNonExistingRemoved tests that the block creation logic returns +// an error if the ResponsePrepareProposal returned from the application marks +// a transaction as REMOVED that was not present in the original proposal. +func TestPrepareProposalErrorOnNonExistingRemoved(t *testing.T) { const height = 2 ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -680,7 +681,6 @@ func TestPrepareProposalPanicOnInvalid(t *testing.T) { // create an invalid ResponsePrepareProposal rpp := abci.ResponsePrepareProposal{ - ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, TxRecords: []*abci.TxRecord{ { Action: abci.TxRecord_REMOVED, @@ -688,7 +688,7 @@ func TestPrepareProposalPanicOnInvalid(t *testing.T) { }, }, } - app.On("PrepareProposal", mock.Anything).Return(rpp, nil) + app.On("PrepareProposal", mock.Anything).Return(rpp) cc := abciclient.NewLocalClient(logger, app) proxyApp := proxy.New(cc, logger, proxy.NopMetrics()) @@ -707,10 +707,9 @@ func TestPrepareProposalPanicOnInvalid(t *testing.T) { ) pa, _ := state.Validators.GetByIndex(0) commit := makeValidCommit(ctx, t, height, types.BlockID{}, state.Validators, privVals) - require.Panics(t, - func() { - blockExec.CreateProposalBlock(ctx, height, state, commit, pa, nil) //nolint:errcheck - }) + block, err := blockExec.CreateProposalBlock(ctx, height, state, commit, pa, nil) + require.Nil(t, block) + require.ErrorContains(t, err, "new transaction incorrectly marked as removed") mp.AssertExpectations(t) } @@ -733,7 +732,7 @@ func TestPrepareProposalRemoveTxs(t *testing.T) { evpool := &mocks.EvidencePool{} evpool.On("PendingEvidence", mock.Anything).Return([]types.Evidence{}, int64(0)) - txs := factory.MakeTenTxs(height) + txs := factory.MakeNTxs(height, 10) mp := &mpmocks.Mempool{} mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs(txs)) @@ -744,9 +743,8 @@ func TestPrepareProposalRemoveTxs(t *testing.T) { app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, - TxRecords: trs, - }, nil) + TxRecords: trs, + }) cc := abciclient.NewLocalClient(logger, app) proxyApp := proxy.New(cc, logger, proxy.NopMetrics()) @@ -794,7 +792,7 @@ func TestPrepareProposalAddedTxsIncluded(t *testing.T) { evpool := &mocks.EvidencePool{} evpool.On("PendingEvidence", mock.Anything).Return([]types.Evidence{}, int64(0)) - txs := factory.MakeTenTxs(height) + txs := factory.MakeNTxs(height, 10) mp := &mpmocks.Mempool{} mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs(txs[2:])) @@ -804,9 +802,8 @@ func TestPrepareProposalAddedTxsIncluded(t *testing.T) { app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, - TxRecords: trs, - }, nil) + TxRecords: trs, + }) cc := abciclient.NewLocalClient(logger, app) proxyApp := proxy.New(cc, logger, proxy.NopMetrics()) @@ -851,7 +848,7 @@ func TestPrepareProposalReorderTxs(t *testing.T) { evpool := &mocks.EvidencePool{} evpool.On("PendingEvidence", mock.Anything).Return([]types.Evidence{}, int64(0)) - txs := factory.MakeTenTxs(height) + txs := factory.MakeNTxs(height, 10) mp := &mpmocks.Mempool{} mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs(txs)) @@ -861,9 +858,8 @@ func TestPrepareProposalReorderTxs(t *testing.T) { app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, - TxRecords: trs, - }, nil) + TxRecords: trs, + }) cc := abciclient.NewLocalClient(logger, app) proxyApp := proxy.New(cc, logger, proxy.NopMetrics()) @@ -892,10 +888,9 @@ func TestPrepareProposalReorderTxs(t *testing.T) { } -// TestPrepareProposalModifiedTxStatusFalse tests that CreateBlock correctly ignores -// the ResponsePrepareProposal TxRecords if ResponsePrepareProposal does not -// set ModifiedTxStatus to true. -func TestPrepareProposalModifiedTxStatusFalse(t *testing.T) { +// TestPrepareProposalErrorOnTooManyTxs tests that the block creation logic returns +// an error if the ResponsePrepareProposal returned from the application is invalid. +func TestPrepareProposalErrorOnTooManyTxs(t *testing.T) { const height = 2 ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -905,29 +900,26 @@ func TestPrepareProposalModifiedTxStatusFalse(t *testing.T) { require.NoError(t, eventBus.Start(ctx)) state, stateDB, privVals := makeState(t, 1, height) + // limit max block size + state.ConsensusParams.Block.MaxBytes = 60 * 1024 stateStore := sm.NewStore(stateDB) evpool := &mocks.EvidencePool{} evpool.On("PendingEvidence", mock.Anything).Return([]types.Evidence{}, int64(0)) - txs := factory.MakeTenTxs(height) + const nValidators = 1 + var bytesPerTx int64 = 3 + maxDataBytes := types.MaxDataBytes(state.ConsensusParams.Block.MaxBytes, 0, nValidators) + txs := factory.MakeNTxs(height, maxDataBytes/bytesPerTx+2) // +2 so that tx don't fit mp := &mpmocks.Mempool{} mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs(txs)) trs := txsToTxRecords(types.Txs(txs)) - trs = append(trs[len(trs)/2:], trs[:len(trs)/2]...) - trs = trs[1:] - trs[0].Action = abci.TxRecord_REMOVED - trs[1] = &abci.TxRecord{ - Tx: []byte("new"), - Action: abci.TxRecord_ADDED, - } app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTxStatus: abci.ResponsePrepareProposal_UNMODIFIED, - TxRecords: trs, - }, nil) + TxRecords: trs, + }) cc := abciclient.NewLocalClient(logger, app) proxyApp := proxy.New(cc, logger, proxy.NopMetrics()) @@ -946,11 +938,62 @@ func TestPrepareProposalModifiedTxStatusFalse(t *testing.T) { ) pa, _ := state.Validators.GetByIndex(0) commit := makeValidCommit(ctx, t, height, types.BlockID{}, state.Validators, privVals) + block, err := blockExec.CreateProposalBlock(ctx, height, state, commit, pa, nil) + require.Nil(t, block) + require.ErrorContains(t, err, "transaction data size exceeds maximum") + + mp.AssertExpectations(t) +} + +// TestPrepareProposalErrorOnPrepareProposalError tests when the client returns an error +// upon calling PrepareProposal on it. +func TestPrepareProposalErrorOnPrepareProposalError(t *testing.T) { + const height = 2 + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + logger := log.NewNopLogger() + eventBus := eventbus.NewDefault(logger) + require.NoError(t, eventBus.Start(ctx)) + + state, stateDB, privVals := makeState(t, 1, height) + stateStore := sm.NewStore(stateDB) + + evpool := &mocks.EvidencePool{} + evpool.On("PendingEvidence", mock.Anything).Return([]types.Evidence{}, int64(0)) + + txs := factory.MakeNTxs(height, 10) + mp := &mpmocks.Mempool{} + mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs(txs)) + + cm := &abciclientmocks.Client{} + cm.On("IsRunning").Return(true) + cm.On("Error").Return(nil) + cm.On("Start", mock.Anything).Return(nil).Once() + cm.On("Wait").Return(nil).Once() + cm.On("PrepareProposal", mock.Anything, mock.Anything).Return(nil, errors.New("an injected error")).Once() + + proxyApp := proxy.New(cm, logger, proxy.NopMetrics()) + err := proxyApp.Start(ctx) require.NoError(t, err) - for i, tx := range block.Data.Txs { - require.Equal(t, txs[i], tx) - } + + blockExec := sm.NewBlockExecutor( + stateStore, + logger, + proxyApp, + mp, + evpool, + nil, + eventBus, + sm.NopMetrics(), + ) + pa, _ := state.Validators.GetByIndex(0) + commit := makeValidCommit(ctx, t, height, types.BlockID{}, state.Validators, privVals) + + block, err := blockExec.CreateProposalBlock(ctx, height, state, commit, pa, nil) + require.Nil(t, block) + require.ErrorContains(t, err, "an injected error") mp.AssertExpectations(t) } diff --git a/internal/state/helpers_test.go b/internal/state/helpers_test.go index 1e0187247..6e97abccb 100644 --- a/internal/state/helpers_test.go +++ b/internal/state/helpers_test.go @@ -62,7 +62,7 @@ func makeAndApplyGoodBlock( evidence []types.Evidence, ) (sm.State, types.BlockID) { t.Helper() - block := state.MakeBlock(height, factory.MakeTenTxs(height), lastCommit, evidence, proposerAddr) + block := state.MakeBlock(height, factory.MakeNTxs(height, 10), lastCommit, evidence, proposerAddr) partSet, err := block.MakePartSet(types.BlockPartSizeBytes) require.NoError(t, err) diff --git a/internal/state/indexer/mocks/event_sink.go b/internal/state/indexer/mocks/event_sink.go index d5555a417..6173480dd 100644 --- a/internal/state/indexer/mocks/event_sink.go +++ b/internal/state/indexer/mocks/event_sink.go @@ -6,6 +6,7 @@ import ( context "context" mock "github.com/stretchr/testify/mock" + indexer "github.com/tendermint/tendermint/internal/state/indexer" query "github.com/tendermint/tendermint/internal/pubsub/query" diff --git a/internal/state/mocks/evidence_pool.go b/internal/state/mocks/evidence_pool.go index 04e8be7bc..b4f42e580 100644 --- a/internal/state/mocks/evidence_pool.go +++ b/internal/state/mocks/evidence_pool.go @@ -6,6 +6,7 @@ import ( context "context" mock "github.com/stretchr/testify/mock" + state "github.com/tendermint/tendermint/internal/state" types "github.com/tendermint/tendermint/types" diff --git a/internal/state/mocks/store.go b/internal/state/mocks/store.go index 02c69d3e0..b7a58e415 100644 --- a/internal/state/mocks/store.go +++ b/internal/state/mocks/store.go @@ -4,6 +4,7 @@ package mocks import ( mock "github.com/stretchr/testify/mock" + state "github.com/tendermint/tendermint/internal/state" tendermintstate "github.com/tendermint/tendermint/proto/tendermint/state" diff --git a/internal/state/test/factory/block.go b/internal/state/test/factory/block.go index 14f49e2d5..1b3351363 100644 --- a/internal/state/test/factory/block.go +++ b/internal/state/test/factory/block.go @@ -45,7 +45,7 @@ func MakeBlocks(ctx context.Context, t *testing.T, n int, state *sm.State, privV func MakeBlock(state sm.State, height int64, c *types.Commit) *types.Block { return state.MakeBlock( height, - factory.MakeTenTxs(state.LastBlockHeight), + factory.MakeNTxs(state.LastBlockHeight, 10), c, nil, state.Validators.GetProposer().Address, diff --git a/internal/state/validation_test.go b/internal/state/validation_test.go index e111ec6cc..5e164f447 100644 --- a/internal/state/validation_test.go +++ b/internal/state/validation_test.go @@ -338,7 +338,7 @@ func TestValidateBlockEvidence(t *testing.T) { evidence = append(evidence, newEv) currentBytes += int64(len(newEv.Bytes())) } - block := state.MakeBlock(height, testfactory.MakeTenTxs(height), lastCommit, evidence, proposerAddr) + block := state.MakeBlock(height, testfactory.MakeNTxs(height, 10), lastCommit, evidence, proposerAddr) err := blockExec.ValidateBlock(ctx, state, block) if assert.Error(t, err) { diff --git a/internal/statesync/mocks/state_provider.go b/internal/statesync/mocks/state_provider.go index b8d681631..b19a6787f 100644 --- a/internal/statesync/mocks/state_provider.go +++ b/internal/statesync/mocks/state_provider.go @@ -6,6 +6,7 @@ import ( context "context" mock "github.com/stretchr/testify/mock" + state "github.com/tendermint/tendermint/internal/state" types "github.com/tendermint/tendermint/types" diff --git a/internal/test/factory/tx.go b/internal/test/factory/tx.go index 035308349..725f3c720 100644 --- a/internal/test/factory/tx.go +++ b/internal/test/factory/tx.go @@ -2,10 +2,10 @@ package factory import "github.com/tendermint/tendermint/types" -func MakeTenTxs(height int64) []types.Tx { - txs := make([]types.Tx, 10) +func MakeNTxs(height, n int64) []types.Tx { + txs := make([]types.Tx, n) for i := range txs { - txs[i] = types.Tx([]byte{byte(height), byte(i)}) + txs[i] = types.Tx([]byte{byte(height), byte(i / 256), byte(i % 256)}) } return txs } diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 53742c41e..03bf9a9e8 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -316,18 +316,11 @@ message ResponseApplySnapshotChunk { } message ResponsePrepareProposal { - ModifiedTxStatus modified_tx_status = 1; - repeated TxRecord tx_records = 2; - bytes app_hash = 3; - repeated ExecTxResult tx_results = 4; - repeated ValidatorUpdate validator_updates = 5; - tendermint.types.ConsensusParams consensus_param_updates = 6; - - enum ModifiedTxStatus { - UNKNOWN = 0; - UNMODIFIED = 1; - MODIFIED = 2; - } + repeated TxRecord tx_records = 1; + bytes app_hash = 2; + repeated ExecTxResult tx_results = 3; + repeated ValidatorUpdate validator_updates = 4; + tendermint.types.ConsensusParams consensus_param_updates = 5; } message ResponseProcessProposal { diff --git a/proto/tendermint/abci/types.proto.intermediate b/proto/tendermint/abci/types.proto.intermediate index cf77d25ea..226cb21fc 100644 --- a/proto/tendermint/abci/types.proto.intermediate +++ b/proto/tendermint/abci/types.proto.intermediate @@ -313,18 +313,11 @@ message ResponseApplySnapshotChunk { } message ResponsePrepareProposal { - ModifiedTxStatus modified_tx_status = 1; - repeated TxRecord tx_records = 2; - bytes app_hash = 3; - repeated ExecTxResult tx_results = 4; - repeated ValidatorUpdate validator_updates = 5; - tendermint.types.ConsensusParams consensus_param_updates = 6; - - enum ModifiedTxStatus { - UNKNOWN = 0; - UNMODIFIED = 1; - MODIFIED = 2; - } + repeated TxRecord tx_records = 1; + bytes app_hash = 2; + repeated ExecTxResult tx_results = 3; + repeated ValidatorUpdate validator_updates = 4; + tendermint.types.ConsensusParams consensus_param_updates = 5; } message ResponseProcessProposal { diff --git a/spec/abci++/abci++_methods_002_draft.md b/spec/abci++/abci++_methods_002_draft.md index 545f6cde0..2799e789b 100644 --- a/spec/abci++/abci++_methods_002_draft.md +++ b/spec/abci++/abci++_methods_002_draft.md @@ -298,7 +298,6 @@ title: Methods | Name | Type | Description | Field Number | |-------------------------|--------------------------------------------------|---------------------------------------------------------------------------------------------|--------------| - | modified_tx_status | [TxModifiedStatus](#TxModifiedStatus) | `enum` signaling if the application has made changes to the list of transactions. | 1 | | tx_records | repeated [TxRecord](#txrecord) | Possibly modified list of transactions that have been picked as part of the proposed block. | 2 | | app_hash | bytes | The Merkle root hash of the application state. | 3 | | tx_results | repeated [ExecTxResult](#txresult) | List of structures containing the data resulting from executing the transactions | 4 | @@ -311,19 +310,15 @@ title: Methods * The header contains the height, timestamp, and more - it exactly matches the Tendermint block header. * `RequestPrepareProposal` contains a preliminary set of transactions `txs` that Tendermint considers to be a good block proposal, called _raw proposal_. The Application can modify this set via `ResponsePrepareProposal.tx_records` (see [TxRecord](#txrecord)). - * In this case, the Application should set `ResponsePrepareProposal.modified_tx_status` to `MODIFIED`. * The Application _can_ reorder, remove or add transactions to the raw proposal. Let `tx` be a transaction in `txs`: * If the Application considers that `tx` should not be proposed in this block, e.g., there are other transactions with higher priority, then it should not include it in `tx_records`. In this case, Tendermint won't remove `tx` from the mempool. The Application should be extra-careful, as abusing this feature may cause transactions to stay forever in the mempool. * If the Application considers that a `tx` should not be included in the proposal and removed from the mempool, then the Application should include it in `tx_records` and _mark_ it as `REMOVED`. In this case, Tendermint will remove `tx` from the mempool. * If the Application wants to add a new transaction, then the Application should include it in `tx_records` and _mark_ it as `ADD`. In this case, Tendermint will add it to the mempool. * The Application should be aware that removing and adding transactions may compromise _traceability_. > Consider the following example: the Application transforms a client-submitted transaction `t1` into a second transaction `t2`, i.e., the Application asks Tendermint to remove `t1` and add `t2` to the mempool. If a client wants to eventually check what happened to `t1`, it will discover that `t_1` is not in the mempool or in a committed block, getting the wrong idea that `t_1` did not make it into a block. Note that `t_2` _will be_ in a committed block, but unless the Application tracks this information, no component will be aware of it. Thus, if the Application wants traceability, it is its responsability to support it. For instance, the Application could attach to a transformed transaction a list with the hashes of the transactions it derives from. - * If the Application does not modify the preliminary set of transactions `txs`, then it sets `ResponsePrepareProposal.modified_tx_status` to `UNMODIFIED`. In this case, Tendermint will ignore the contents of `ResponsePrepareProposal.tx_records`. * Tendermint MAY include a list of transactions in `RequestPrepareProposal.txs` whose total size in bytes exceeds `RequestPrepareProposal.max_tx_bytes`. - Therefore, if the size of `RequestPrepareProposal.txs` is greater than `RequestPrepareProposal.max_tx_bytes`: - * the Application MUST make sure that the `RequestPrepareProposal.max_tx_bytes` limit is respected by those - transaction records returned in `ResponsePrepareProposal.tx_records` that are marked as `UNMODIFIED` or `ADDED`. - * the Application MUST set `ResponsePrepareProposal.modified_tx_status` to `MODIFIED`. Tendermint will panic otherwise. + Therefore, if the size of `RequestPrepareProposal.txs` is greater than `RequestPrepareProposal.max_tx_bytes`, the Application MUST make sure that the + `RequestPrepareProposal.max_tx_bytes` limit is respected by those transaction records returned in `ResponsePrepareProposal.tx_records` that are marked as `UNMODIFIED` or `ADDED`. * In same-block execution mode, the Application must provide values for `ResponsePrepareProposal.app_hash`, `ResponsePrepareProposal.tx_results`, `ResponsePrepareProposal.validator_updates`, and `ResponsePrepareProposal.consensus_param_updates`, as a result of fully executing the block. @@ -413,7 +408,7 @@ Note that, if _p_ has a non-`nil` _validValue_, Tendermint will use it as propos | Name | Type | Description | Field Number | |-------------------------|--------------------------------------------------|-----------------------------------------------------------------------------------|--------------| - | status | [ProposalStatus](#ProposalStatus) | `enum` that signals if the application finds the proposal valid. | 1 | + | status | [ProposalStatus](#proposalstatus) | `enum` that signals if the application finds the proposal valid. | 1 | | app_hash | bytes | The Merkle root hash of the application state. | 2 | | tx_results | repeated [ExecTxResult](#txresult) | List of structures containing the data resulting from executing the transactions. | 3 | | validator_updates | repeated [ValidatorUpdate](#validatorupdate) | Changes to validator set (set voting power to 0 to remove). | 4 | @@ -539,7 +534,7 @@ a [CanonicalVoteExtension](#canonicalvoteextension) field in the `precommit nil` | Name | Type | Description | Field Number | |--------|-------------------------------|----------------------------------------------------------------|--------------| - | status | [VerifyStatus](#VerifyStatus) | `enum` signaling if the application accepts the vote extension | 1 | + | status | [VerifyStatus](#verifystatus) | `enum` signaling if the application accepts the vote extension | 1 | * **Usage**: * `RequestVerifyVoteExtension.vote_extension` can be an empty byte array. The Application's interpretation of it should be @@ -832,7 +827,7 @@ Most of the data structures used in ABCI are shared [common data structures](../ | info | string | Additional information. **May be non-deterministic.** | 4 | | gas_wanted | int64 | Amount of gas requested for transaction. | 5 | | gas_used | int64 | Amount of gas consumed by transaction. | 6 | - | events | repeated [Event](abci++_basic_concepts_002_draft.md#events) | Type & Key-Value events for indexing transactions (e.g. by account). | 7 | + | events | repeated [Event](abci++_basic_concepts_002_draft.md#events) | Type & Key-Value events for indexing transactions (e.g. by account). | 7 | | codespace | string | Namespace for the `code`. | 8 | ### TxAction @@ -852,6 +847,7 @@ enum TxAction { * If `Action` is `ADDED`, Tendermint includes the transaction in the proposal. The transaction is _not_ added to the mempool. * If `Action` is `REMOVED`, Tendermint excludes the transaction from the proposal. The transaction is also removed from the mempool if it exists, similar to `CheckTx` returning _false_. + ### TxRecord * **Fields**: @@ -872,26 +868,10 @@ enum ProposalStatus { ``` * **Usage**: - * Used within the [ProcessProposal](#ProcessProposal) response. - * If `Status` is `UNKNOWN`, a problem happened in the Application. Tendermint will assume the application is faulty and crash. - * If `Status` is `ACCEPT`, Tendermint accepts the proposal and will issue a Prevote message for it. - * If `Status` is `REJECT`, Tendermint rejects the proposal and will issue a Prevote for `nil` instead. - -### TxModifiedStatus - -```proto -enum ModifiedTxStatus { - UNKNOWN = 0; // Unknown status. Returning this from the application is always an error. - UNMODIFIED = 1; // Status that signals the application has modified the returned list of transactions. - MODIFIED = 2; // Status that signals that the application has not modified the list of transactions. -} -``` - -* **Usage**: - * Used within the [PrepareProposal](#PrepareProposal) response. - * If `TxModifiedStatus` is `UNKNOWN`, a problem happened in the Application. Tendermint will assume the application is faulty and crash. - * If `TxModifiedStatus` is `UNMODIFIED`, Tendermint will ignore the contents of the `PrepareProposal` response and use the transactions originally passed to the application during `PrepareProposal`. - * If `TxModifiedStatus` is `MODIFIED`, Tendermint will update the block proposal using the contents of the `PrepareProposal` response returned by the application. + * Used within the [ProcessProposal](#processproposal) response. + * If `Status` is `UNKNOWN`, a problem happened in the Application. Tendermint will assume the application is faulty and crash. + * If `Status` is `ACCEPT`, Tendermint accepts the proposal and will issue a Prevote message for it. + * If `Status` is `REJECT`, Tendermint rejects the proposal and will issue a Prevote for `nil` instead. ### VerifyStatus @@ -904,10 +884,10 @@ enum VerifyStatus { ``` * **Usage**: - * Used within the [VerifyVoteExtension](#VerifyVoteExtension) response. - * If `Status` is `UNKNOWN`, a problem happened in the Application. Tendermint will assume the application is faulty and crash. - * If `Status` is `ACCEPT`, Tendermint will accept the vote as valid. - * If `Status` is `REJECT`, Tendermint will reject the vote as invalid. + * Used within the [VerifyVoteExtension](#verifyvoteextension) response. + * If `Status` is `UNKNOWN`, a problem happened in the Application. Tendermint will assume the application is faulty and crash. + * If `Status` is `ACCEPT`, Tendermint will accept the vote as valid. + * If `Status` is `REJECT`, Tendermint will reject the vote as invalid. ### CanonicalVoteExtension diff --git a/spec/abci++/abci++_tmint_expected_behavior_002_draft.md b/spec/abci++/abci++_tmint_expected_behavior_002_draft.md index 2616da4fa..778689450 100644 --- a/spec/abci++/abci++_tmint_expected_behavior_002_draft.md +++ b/spec/abci++/abci++_tmint_expected_behavior_002_draft.md @@ -202,14 +202,17 @@ to undergo any changes in their implementation. As for the new methods: -* `PrepareProposal` should check whether the size of transactions exceeds the byte limit. - * If it does: remove transactions at the end of the list until the total byte size conforms to the limit, - then set `ResponsePrepareProposal.modified_tx_status` to `MODIFIED` and return. - * Else, set `ResponsePrepareProposal.modified_tx_status` to `UNMODIFIED` and return. -* `ProcessProposal` should set `ResponseProcessProposal.accept` to _true_ and return. -* `ExtendVote` should set `ResponseExtendVote.extension` to an empty byte array and return. -* `VerifyVoteExtension` should set `ResponseVerifyVoteExtension.accept` to _true_ if the extension is an empty byte array +* `PrepareProposal` must create a list of [TxRecord](./abci++_methods_002_draft.md#txrecord) each containing a + transaction passed in `RequestPrepareProposal.txs`, in the same other. The field `action` must be set to `UNMODIFIED` + for all [TxRecord](./abci++_methods_002_draft.md#txrecord) elements in the list. + The Application must check whether the size of all transactions exceeds the byte limit + (`RequestPrepareProposal.max_tx_bytes`). If so, the Application must remove transactions at the end of the list + until the total byte size is at or below the limit. +* `ProcessProposal` must set `ResponseProcessProposal.accept` to _true_ and return. +* `ExtendVote` is to set `ResponseExtendVote.extension` to an empty byte array and return. +* `VerifyVoteExtension` must set `ResponseVerifyVoteExtension.accept` to _true_ if the extension is an empty byte array and _false_ otherwise, then return. -* `FinalizeBlock` should coalesce the implementation of methods `BeginBlock`, `DeliverTx`, `EndBlock`, and `Commit`. - The logic extracted from `DeliverTx` should be wrappped by a loop that will execute as many times as - transactions exist in `RequestFinalizeBlock.tx`. +* `FinalizeBlock` is to coalesce the implementation of methods `BeginBlock`, `DeliverTx`, `EndBlock`, and `Commit`. + Legacy applications looking to reuse old code that implemented `DeliverTx` should wrap the legacy + `DeliverTx` logic in a loop that executes one transaction iteration per + transaction in `RequestFinalizeBlock.tx`. diff --git a/test/e2e/app/app.go b/test/e2e/app/app.go index 1ed1055ca..051a1ddbb 100644 --- a/test/e2e/app/app.go +++ b/test/e2e/app/app.go @@ -306,7 +306,19 @@ func (app *Application) ApplySnapshotChunk(req abci.RequestApplySnapshotChunk) a func (app *Application) PrepareProposal(req abci.RequestPrepareProposal) abci.ResponsePrepareProposal { // None of the transactions are modified by this application. - return abci.ResponsePrepareProposal{ModifiedTxStatus: abci.ResponsePrepareProposal_UNMODIFIED} + trs := make([]*abci.TxRecord, 0, len(req.Txs)) + var totalBytes int64 + for _, tx := range req.Txs { + totalBytes += int64(len(tx)) + if totalBytes > req.MaxTxBytes { + break + } + trs = append(trs, &abci.TxRecord{ + Action: abci.TxRecord_UNMODIFIED, + Tx: tx, + }) + } + return abci.ResponsePrepareProposal{TxRecords: trs} } // ProcessProposal implements part of the Application interface. diff --git a/types/tx.go b/types/tx.go index 0c354a941..c879cf3da 100644 --- a/types/tx.go +++ b/types/tx.go @@ -205,7 +205,7 @@ func (t TxRecordSet) Validate(maxSizeBytes int64, otxs Txs) error { for _, cur := range append(unmodifiedCopy, addedCopy...) { size += int64(len(cur)) if size > maxSizeBytes { - return fmt.Errorf("transaction data size %d exceeds maximum %d", size, maxSizeBytes) + return fmt.Errorf("transaction data size exceeds maximum %d", maxSizeBytes) } } From cb8e6b1c1a4f3d86f307f38a0673893ab66788e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:25:00 +0000 Subject: [PATCH 4/5] build(deps): Bump github.com/vektra/mockery/v2 from 2.10.1 to 2.10.2 (#8246) Bumps [github.com/vektra/mockery/v2](https://github.com/vektra/mockery) from 2.10.1 to 2.10.2.
Release notes

Sourced from github.com/vektra/mockery/v2's releases.

v2.10.2

Changelog

  • 8384e25 Merge pull request #443 from OrlovEvgeny/fix-build-go-version
  • 408740d fix: golang build version
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/vektra/mockery/v2&package-manager=go_modules&previous-version=2.10.1&new-version=2.10.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 21afc3375..7951b645f 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/creachadair/atomicfile v0.2.4 github.com/golangci/golangci-lint v1.45.2 github.com/google/go-cmp v0.5.7 - github.com/vektra/mockery/v2 v2.10.1 + github.com/vektra/mockery/v2 v2.10.2 gotest.tools v2.2.0+incompatible ) diff --git a/go.sum b/go.sum index 19aeb8f1f..60b4842b6 100644 --- a/go.sum +++ b/go.sum @@ -1035,8 +1035,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vektra/mockery/v2 v2.10.1 h1:EOsWLFVlkUJlNurdO/w1NBFbFE1vbemJJtaG3Bo6H/M= -github.com/vektra/mockery/v2 v2.10.1/go.mod h1:m/WO2UzWzqgVX3nvqpRQq70I4Z7jbSCRhdmkgtp+Ab4= +github.com/vektra/mockery/v2 v2.10.2 h1:ISAFkB3rQS6Y3aDZzAKtDwgeyDknwNa1aBE3Zgx0h+I= +github.com/vektra/mockery/v2 v2.10.2/go.mod h1:m/WO2UzWzqgVX3nvqpRQq70I4Z7jbSCRhdmkgtp+Ab4= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= From 97f7021712cbc0db8891a1f17c1c7406636e7c1a Mon Sep 17 00:00:00 2001 From: Sam Kleinman Date: Mon, 4 Apr 2022 12:31:15 -0400 Subject: [PATCH 5/5] statesync: merge channel processing (#8240) --- internal/blocksync/reactor.go | 1 + internal/consensus/reactor.go | 4 +++ internal/evidence/reactor.go | 1 + internal/mempool/reactor.go | 1 + internal/p2p/channel.go | 3 ++ internal/p2p/conn/connection.go | 4 +++ internal/p2p/pex/reactor.go | 1 + internal/p2p/router.go | 1 + internal/statesync/reactor.go | 53 ++++++++++++++++++++++-------- internal/statesync/reactor_test.go | 41 ++++++++++++++--------- 10 files changed, 81 insertions(+), 29 deletions(-) diff --git a/internal/blocksync/reactor.go b/internal/blocksync/reactor.go index b9c4e498c..34ed1f0fc 100644 --- a/internal/blocksync/reactor.go +++ b/internal/blocksync/reactor.go @@ -45,6 +45,7 @@ func GetChannelDescriptor() *p2p.ChannelDescriptor { SendQueueCapacity: 1000, RecvBufferCapacity: 1024, RecvMessageCapacity: MaxMsgSize, + Name: "blockSync", } } diff --git a/internal/consensus/reactor.go b/internal/consensus/reactor.go index c8d296ff9..b11775679 100644 --- a/internal/consensus/reactor.go +++ b/internal/consensus/reactor.go @@ -38,6 +38,7 @@ func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { SendQueueCapacity: 64, RecvMessageCapacity: maxMsgSize, RecvBufferCapacity: 128, + Name: "state", }, DataChannel: { // TODO: Consider a split between gossiping current block and catchup @@ -49,6 +50,7 @@ func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { SendQueueCapacity: 64, RecvBufferCapacity: 512, RecvMessageCapacity: maxMsgSize, + Name: "data", }, VoteChannel: { ID: VoteChannel, @@ -57,6 +59,7 @@ func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { SendQueueCapacity: 64, RecvBufferCapacity: 128, RecvMessageCapacity: maxMsgSize, + Name: "vote", }, VoteSetBitsChannel: { ID: VoteSetBitsChannel, @@ -65,6 +68,7 @@ func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { SendQueueCapacity: 8, RecvBufferCapacity: 128, RecvMessageCapacity: maxMsgSize, + Name: "voteSet", }, } } diff --git a/internal/evidence/reactor.go b/internal/evidence/reactor.go index 1011f732f..c52e7e32b 100644 --- a/internal/evidence/reactor.go +++ b/internal/evidence/reactor.go @@ -38,6 +38,7 @@ func GetChannelDescriptor() *p2p.ChannelDescriptor { Priority: 6, RecvMessageCapacity: maxMsgSize, RecvBufferCapacity: 32, + Name: "evidence", } } diff --git a/internal/mempool/reactor.go b/internal/mempool/reactor.go index 8f98d97f1..816589c9b 100644 --- a/internal/mempool/reactor.go +++ b/internal/mempool/reactor.go @@ -106,6 +106,7 @@ func getChannelDescriptor(cfg *config.MempoolConfig) *p2p.ChannelDescriptor { Priority: 5, RecvMessageCapacity: batchMsg.Size(), RecvBufferCapacity: 128, + Name: "mempool", } } diff --git a/internal/p2p/channel.go b/internal/p2p/channel.go index d7dad4d3b..8e6774612 100644 --- a/internal/p2p/channel.go +++ b/internal/p2p/channel.go @@ -60,6 +60,7 @@ type Channel struct { errCh chan<- PeerError // peer error reporting messageType proto.Message // the channel's message type, used for unmarshaling + name string } // NewChannel creates a new channel. It is primarily for internal and test @@ -102,6 +103,8 @@ func (ch *Channel) SendError(ctx context.Context, pe PeerError) error { } } +func (ch *Channel) String() string { return fmt.Sprintf("p2p.Channel<%d:%s>", ch.ID, ch.name) } + // Receive returns a new unbuffered iterator to receive messages from ch. // The iterator runs until ctx ends. func (ch *Channel) Receive(ctx context.Context) *ChannelIterator { diff --git a/internal/p2p/conn/connection.go b/internal/p2p/conn/connection.go index 4cbca7f19..c8fc21188 100644 --- a/internal/p2p/conn/connection.go +++ b/internal/p2p/conn/connection.go @@ -616,6 +616,10 @@ type ChannelDescriptor struct { // RecvBufferCapacity defines the max buffer size of inbound messages for a // given p2p Channel queue. RecvBufferCapacity int + + // Human readable name of the channel, used in logging and + // diagnostics. + Name string } func (chDesc ChannelDescriptor) FillDefaults() (filled ChannelDescriptor) { diff --git a/internal/p2p/pex/reactor.go b/internal/p2p/pex/reactor.go index 2beaeaa17..178524af2 100644 --- a/internal/p2p/pex/reactor.go +++ b/internal/p2p/pex/reactor.go @@ -63,6 +63,7 @@ func ChannelDescriptor() *conn.ChannelDescriptor { SendQueueCapacity: 10, RecvMessageCapacity: maxMsgSize, RecvBufferCapacity: 128, + Name: "pex", } } diff --git a/internal/p2p/router.go b/internal/p2p/router.go index f9b3d1ad8..40c24d56b 100644 --- a/internal/p2p/router.go +++ b/internal/p2p/router.go @@ -281,6 +281,7 @@ func (r *Router) OpenChannel(ctx context.Context, chDesc *ChannelDescriptor) (*C outCh := make(chan Envelope, chDesc.RecvBufferCapacity) errCh := make(chan PeerError, chDesc.RecvBufferCapacity) channel := NewChannel(id, messageType, queue.dequeue(), outCh, errCh) + channel.name = chDesc.Name var wrapper Wrapper if w, ok := messageType.(Wrapper); ok { diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go index 51f626027..dba520a1c 100644 --- a/internal/statesync/reactor.go +++ b/internal/statesync/reactor.go @@ -16,6 +16,7 @@ import ( "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/internal/eventbus" "github.com/tendermint/tendermint/internal/p2p" + "github.com/tendermint/tendermint/internal/p2p/conn" sm "github.com/tendermint/tendermint/internal/state" "github.com/tendermint/tendermint/internal/store" "github.com/tendermint/tendermint/libs/log" @@ -75,13 +76,13 @@ const ( func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { return map[p2p.ChannelID]*p2p.ChannelDescriptor{ SnapshotChannel: { - ID: SnapshotChannel, MessageType: new(ssproto.Message), Priority: 6, SendQueueCapacity: 10, RecvMessageCapacity: snapshotMsgSize, RecvBufferCapacity: 128, + Name: "snapshot", }, ChunkChannel: { ID: ChunkChannel, @@ -90,6 +91,7 @@ func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { SendQueueCapacity: 4, RecvMessageCapacity: chunkMsgSize, RecvBufferCapacity: 128, + Name: "chunk", }, LightBlockChannel: { ID: LightBlockChannel, @@ -98,6 +100,7 @@ func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { SendQueueCapacity: 10, RecvMessageCapacity: lightBlockMsgSize, RecvBufferCapacity: 128, + Name: "light-block", }, ParamsChannel: { ID: ParamsChannel, @@ -106,6 +109,7 @@ func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor { SendQueueCapacity: 10, RecvMessageCapacity: paramMsgSize, RecvBufferCapacity: 128, + Name: "params", }, } @@ -233,10 +237,7 @@ func NewReactor( // The caller must be sure to execute OnStop to ensure the outbound p2p Channels are // closed. No error is returned. func (r *Reactor) OnStart(ctx context.Context) error { - go r.processCh(ctx, r.snapshotCh, "snapshot") - go r.processCh(ctx, r.chunkCh, "chunk") - go r.processCh(ctx, r.blockCh, "light block") - go r.processCh(ctx, r.paramsCh, "consensus params") + go r.processChannels(ctx, r.snapshotCh, r.chunkCh, r.blockCh, r.paramsCh) go r.processPeerUpdates(ctx) return nil @@ -291,6 +292,7 @@ func (r *Reactor) Sync(ctx context.Context) (sm.State, error) { r.metrics, ) r.mtx.Unlock() + defer func() { r.mtx.Lock() // reset syncing objects at the close of Sync @@ -780,6 +782,8 @@ func (r *Reactor) handleParamsMessage(ctx context.Context, envelope *p2p.Envelop if sp, ok := r.stateProvider.(*stateProviderP2P); ok { select { case sp.paramsRecvCh <- cp: + case <-ctx.Done(): + return ctx.Err() case <-time.After(time.Second): return errors.New("failed to send consensus params, stateprovider not ready for response") } @@ -797,7 +801,7 @@ func (r *Reactor) handleParamsMessage(ctx context.Context, envelope *p2p.Envelop // handleMessage handles an Envelope sent from a peer on a specific p2p Channel. // It will handle errors and any possible panics gracefully. A caller can handle // any error returned by sending a PeerError on the respective channel. -func (r *Reactor) handleMessage(ctx context.Context, chID p2p.ChannelID, envelope *p2p.Envelope) (err error) { +func (r *Reactor) handleMessage(ctx context.Context, envelope *p2p.Envelope) (err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("panic in processing message: %v", e) @@ -811,7 +815,7 @@ func (r *Reactor) handleMessage(ctx context.Context, chID p2p.ChannelID, envelop r.logger.Debug("received message", "message", reflect.TypeOf(envelope.Message), "peer", envelope.From) - switch chID { + switch envelope.ChannelID { case SnapshotChannel: err = r.handleSnapshotMessage(ctx, envelope) case ChunkChannel: @@ -821,7 +825,7 @@ func (r *Reactor) handleMessage(ctx context.Context, chID p2p.ChannelID, envelop case ParamsChannel: err = r.handleParamsMessage(ctx, envelope) default: - err = fmt.Errorf("unknown channel ID (%d) for envelope (%v)", chID, envelope) + err = fmt.Errorf("unknown channel ID (%d) for envelope (%v)", envelope.ChannelID, envelope) } return err @@ -831,15 +835,35 @@ func (r *Reactor) handleMessage(ctx context.Context, chID p2p.ChannelID, envelop // encountered during message execution will result in a PeerError being sent on // the respective channel. When the reactor is stopped, we will catch the signal // and close the p2p Channel gracefully. -func (r *Reactor) processCh(ctx context.Context, ch *p2p.Channel, chName string) { - iter := ch.Receive(ctx) +func (r *Reactor) processChannels(ctx context.Context, chs ...*p2p.Channel) { + // make sure that the iterator gets cleaned up in case of error + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + chanTable := make(map[conn.ChannelID]*p2p.Channel, len(chs)) + for idx := range chs { + ch := chs[idx] + chanTable[ch.ID] = ch + } + + iter := p2p.MergedChannelIterator(ctx, chs...) for iter.Next(ctx) { envelope := iter.Envelope() - if err := r.handleMessage(ctx, ch.ID, envelope); err != nil { + if err := r.handleMessage(ctx, envelope); err != nil { + ch, ok := chanTable[envelope.ChannelID] + if !ok { + r.logger.Error("received impossible message", + "envelope_from", envelope.From, + "envelope_ch", envelope.ChannelID, + "num_chs", len(chanTable), + "err", err, + ) + return + } r.logger.Error("failed to process message", "err", err, - "channel", chName, - "ch_id", ch.ID, + "channel", ch.String(), + "ch_id", envelope.ChannelID, "envelope", envelope) if serr := ch.SendError(ctx, p2p.PeerError{ NodeID: envelope.From, @@ -875,14 +899,15 @@ func (r *Reactor) processPeerUpdate(ctx context.Context, peerUpdate p2p.PeerUpda r.mtx.Lock() defer r.mtx.Unlock() + if r.syncer == nil { return } switch peerUpdate.Status { case p2p.PeerStatusUp: - newProvider := NewBlockProvider(peerUpdate.NodeID, r.chainID, r.dispatcher) + r.providers[peerUpdate.NodeID] = newProvider err := r.syncer.AddPeer(ctx, peerUpdate.NodeID) if err != nil { diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go index c1ac1a048..709fe9a2c 100644 --- a/internal/statesync/reactor_test.go +++ b/internal/statesync/reactor_test.go @@ -257,8 +257,9 @@ func TestReactor_ChunkRequest_InvalidRequest(t *testing.T) { rts := setup(ctx, t, nil, nil, 2) rts.chunkInCh <- p2p.Envelope{ - From: types.NodeID("aa"), - Message: &ssproto.SnapshotsRequest{}, + From: types.NodeID("aa"), + ChannelID: ChunkChannel, + Message: &ssproto.SnapshotsRequest{}, } response := <-rts.chunkPeerErrCh @@ -315,8 +316,9 @@ func TestReactor_ChunkRequest(t *testing.T) { rts := setup(ctx, t, conn, nil, 2) rts.chunkInCh <- p2p.Envelope{ - From: types.NodeID("aa"), - Message: tc.request, + From: types.NodeID("aa"), + ChannelID: ChunkChannel, + Message: tc.request, } response := <-rts.chunkOutCh @@ -335,8 +337,9 @@ func TestReactor_SnapshotsRequest_InvalidRequest(t *testing.T) { rts := setup(ctx, t, nil, nil, 2) rts.snapshotInCh <- p2p.Envelope{ - From: types.NodeID("aa"), - Message: &ssproto.ChunkRequest{}, + From: types.NodeID("aa"), + ChannelID: SnapshotChannel, + Message: &ssproto.ChunkRequest{}, } response := <-rts.snapshotPeerErrCh @@ -400,8 +403,9 @@ func TestReactor_SnapshotsRequest(t *testing.T) { rts := setup(ctx, t, conn, nil, 100) rts.snapshotInCh <- p2p.Envelope{ - From: types.NodeID("aa"), - Message: &ssproto.SnapshotsRequest{}, + From: types.NodeID("aa"), + ChannelID: SnapshotChannel, + Message: &ssproto.SnapshotsRequest{}, } if len(tc.expectResponses) > 0 { @@ -457,7 +461,8 @@ func TestReactor_LightBlockResponse(t *testing.T) { rts.stateStore.On("LoadValidators", height).Return(vals, nil) rts.blockInCh <- p2p.Envelope{ - From: types.NodeID("aa"), + From: types.NodeID("aa"), + ChannelID: LightBlockChannel, Message: &ssproto.LightBlockRequest{ Height: 10, }, @@ -733,7 +738,8 @@ func handleLightBlockRequests( require.NoError(t, err) select { case sending <- p2p.Envelope{ - From: envelope.To, + From: envelope.To, + ChannelID: LightBlockChannel, Message: &ssproto.LightBlockResponse{ LightBlock: lb, }, @@ -750,7 +756,8 @@ func handleLightBlockRequests( require.NoError(t, err) select { case sending <- p2p.Envelope{ - From: envelope.To, + From: envelope.To, + ChannelID: LightBlockChannel, Message: &ssproto.LightBlockResponse{ LightBlock: differntLB, }, @@ -761,7 +768,8 @@ func handleLightBlockRequests( case 1: // send nil block i.e. pretend we don't have it select { case sending <- p2p.Envelope{ - From: envelope.To, + From: envelope.To, + ChannelID: LightBlockChannel, Message: &ssproto.LightBlockResponse{ LightBlock: nil, }, @@ -802,7 +810,8 @@ func handleConsensusParamsRequest( } select { case sending <- p2p.Envelope{ - From: envelope.To, + From: envelope.To, + ChannelID: ParamsChannel, Message: &ssproto.ParamsResponse{ Height: msg.Height, ConsensusParams: paramsProto, @@ -913,7 +922,8 @@ func handleSnapshotRequests( require.True(t, ok) for _, snapshot := range snapshots { sendingCh <- p2p.Envelope{ - From: envelope.To, + From: envelope.To, + ChannelID: SnapshotChannel, Message: &ssproto.SnapshotsResponse{ Height: snapshot.Height, Format: snapshot.Format, @@ -946,7 +956,8 @@ func handleChunkRequests( msg, ok := envelope.Message.(*ssproto.ChunkRequest) require.True(t, ok) sendingCh <- p2p.Envelope{ - From: envelope.To, + From: envelope.To, + ChannelID: ChunkChannel, Message: &ssproto.ChunkResponse{ Height: msg.Height, Format: msg.Format,