diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8f88e9d49..5fb219e24 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -49,7 +49,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Publish to Docker Hub - uses: docker/build-push-action@v2.9.0 + uses: docker/build-push-action@v2.10.0 with: context: . file: ./DOCKER/Dockerfile diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go index 6b98d54bb..40f45d459 100644 --- a/abci/example/kvstore/kvstore.go +++ b/abci/example/kvstore/kvstore.go @@ -284,16 +284,19 @@ func (app *Application) PrepareProposal(req types.RequestPrepareProposal) types. app.mu.Lock() defer app.mu.Unlock() - return types.ResponsePrepareProposal{TxRecords: app.substPrepareTx(req.Txs)} + return types.ResponsePrepareProposal{ + ModifiedTxStatus: types.ResponsePrepareProposal_MODIFIED, + TxRecords: app.substPrepareTx(req.Txs), + } } func (*Application) ProcessProposal(req types.RequestProcessProposal) types.ResponseProcessProposal { for _, tx := range req.Txs { if len(tx) == 0 { - return types.ResponseProcessProposal{Accept: false} + return types.ResponseProcessProposal{Status: types.ResponseProcessProposal_REJECT} } } - return types.ResponseProcessProposal{Accept: true} + return types.ResponseProcessProposal{Status: types.ResponseProcessProposal_ACCEPT} } //--------------------------------------------- diff --git a/abci/types/application.go b/abci/types/application.go index 6961ea200..8b8991adc 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -66,7 +66,7 @@ func (BaseApplication) ExtendVote(req RequestExtendVote) ResponseExtendVote { func (BaseApplication) VerifyVoteExtension(req RequestVerifyVoteExtension) ResponseVerifyVoteExtension { return ResponseVerifyVoteExtension{ - Result: ResponseVerifyVoteExtension_ACCEPT, + Status: ResponseVerifyVoteExtension_ACCEPT, } } @@ -95,11 +95,11 @@ func (BaseApplication) ApplySnapshotChunk(req RequestApplySnapshotChunk) Respons } func (BaseApplication) PrepareProposal(req RequestPrepareProposal) ResponsePrepareProposal { - return ResponsePrepareProposal{} + return ResponsePrepareProposal{ModifiedTxStatus: ResponsePrepareProposal_UNMODIFIED} } func (BaseApplication) ProcessProposal(req RequestProcessProposal) ResponseProcessProposal { - return ResponseProcessProposal{} + return ResponseProcessProposal{Status: ResponseProcessProposal_ACCEPT} } func (BaseApplication) FinalizeBlock(req RequestFinalizeBlock) ResponseFinalizeBlock { diff --git a/abci/types/mocks/base.go b/abci/types/mocks/base.go index f9d84b858..fe0516e26 100644 --- a/abci/types/mocks/base.go +++ b/abci/types/mocks/base.go @@ -25,8 +25,7 @@ func NewBaseMock() BaseMock { // Info/Query Connection // Return application info -func (m BaseMock) Info(input types.RequestInfo) types.ResponseInfo { - var ret types.ResponseInfo +func (m BaseMock) Info(input types.RequestInfo) (ret types.ResponseInfo) { defer func() { if r := recover(); r != nil { ret = m.base.Info(input) @@ -36,8 +35,7 @@ func (m BaseMock) Info(input types.RequestInfo) types.ResponseInfo { return ret } -func (m BaseMock) Query(input types.RequestQuery) types.ResponseQuery { - var ret types.ResponseQuery +func (m BaseMock) Query(input types.RequestQuery) (ret types.ResponseQuery) { defer func() { if r := recover(); r != nil { ret = m.base.Query(input) @@ -49,8 +47,7 @@ func (m BaseMock) Query(input types.RequestQuery) types.ResponseQuery { // Mempool Connection // Validate a tx for the mempool -func (m BaseMock) CheckTx(input types.RequestCheckTx) types.ResponseCheckTx { - var ret types.ResponseCheckTx +func (m BaseMock) CheckTx(input types.RequestCheckTx) (ret types.ResponseCheckTx) { defer func() { if r := recover(); r != nil { ret = m.base.CheckTx(input) @@ -62,8 +59,7 @@ func (m BaseMock) CheckTx(input types.RequestCheckTx) types.ResponseCheckTx { // Consensus Connection // Initialize blockchain w validators/other info from TendermintCore -func (m BaseMock) InitChain(input types.RequestInitChain) types.ResponseInitChain { - var ret types.ResponseInitChain +func (m BaseMock) InitChain(input types.RequestInitChain) (ret types.ResponseInitChain) { defer func() { if r := recover(); r != nil { ret = m.base.InitChain(input) @@ -73,8 +69,7 @@ func (m BaseMock) InitChain(input types.RequestInitChain) types.ResponseInitChai return ret } -func (m BaseMock) PrepareProposal(input types.RequestPrepareProposal) types.ResponsePrepareProposal { - var ret types.ResponsePrepareProposal +func (m BaseMock) PrepareProposal(input types.RequestPrepareProposal) (ret types.ResponsePrepareProposal) { defer func() { if r := recover(); r != nil { ret = m.base.PrepareProposal(input) @@ -84,8 +79,7 @@ func (m BaseMock) PrepareProposal(input types.RequestPrepareProposal) types.Resp return ret } -func (m BaseMock) ProcessProposal(input types.RequestProcessProposal) types.ResponseProcessProposal { - var ret types.ResponseProcessProposal +func (m BaseMock) ProcessProposal(input types.RequestProcessProposal) (ret types.ResponseProcessProposal) { defer func() { if r := recover(); r != nil { ret = m.base.ProcessProposal(input) @@ -96,8 +90,7 @@ func (m BaseMock) ProcessProposal(input types.RequestProcessProposal) types.Resp } // Commit the state and return the application Merkle root hash -func (m BaseMock) Commit() types.ResponseCommit { - var ret types.ResponseCommit +func (m BaseMock) Commit() (ret types.ResponseCommit) { defer func() { if r := recover(); r != nil { ret = m.base.Commit() @@ -108,8 +101,7 @@ func (m BaseMock) Commit() types.ResponseCommit { } // Create application specific vote extension -func (m BaseMock) ExtendVote(input types.RequestExtendVote) types.ResponseExtendVote { - var ret types.ResponseExtendVote +func (m BaseMock) ExtendVote(input types.RequestExtendVote) (ret types.ResponseExtendVote) { defer func() { if r := recover(); r != nil { ret = m.base.ExtendVote(input) @@ -120,8 +112,7 @@ func (m BaseMock) ExtendVote(input types.RequestExtendVote) types.ResponseExtend } // Verify application's vote extension data -func (m BaseMock) VerifyVoteExtension(input types.RequestVerifyVoteExtension) types.ResponseVerifyVoteExtension { - var ret types.ResponseVerifyVoteExtension +func (m BaseMock) VerifyVoteExtension(input types.RequestVerifyVoteExtension) (ret types.ResponseVerifyVoteExtension) { defer func() { if r := recover(); r != nil { ret = m.base.VerifyVoteExtension(input) @@ -133,8 +124,7 @@ func (m BaseMock) VerifyVoteExtension(input types.RequestVerifyVoteExtension) ty // State Sync Connection // List available snapshots -func (m BaseMock) ListSnapshots(input types.RequestListSnapshots) types.ResponseListSnapshots { - var ret types.ResponseListSnapshots +func (m BaseMock) ListSnapshots(input types.RequestListSnapshots) (ret types.ResponseListSnapshots) { defer func() { if r := recover(); r != nil { ret = m.base.ListSnapshots(input) @@ -144,8 +134,7 @@ func (m BaseMock) ListSnapshots(input types.RequestListSnapshots) types.Response return ret } -func (m BaseMock) OfferSnapshot(input types.RequestOfferSnapshot) types.ResponseOfferSnapshot { - var ret types.ResponseOfferSnapshot +func (m BaseMock) OfferSnapshot(input types.RequestOfferSnapshot) (ret types.ResponseOfferSnapshot) { defer func() { if r := recover(); r != nil { ret = m.base.OfferSnapshot(input) @@ -155,8 +144,7 @@ func (m BaseMock) OfferSnapshot(input types.RequestOfferSnapshot) types.Response return ret } -func (m BaseMock) LoadSnapshotChunk(input types.RequestLoadSnapshotChunk) types.ResponseLoadSnapshotChunk { - var ret types.ResponseLoadSnapshotChunk +func (m BaseMock) LoadSnapshotChunk(input types.RequestLoadSnapshotChunk) (ret types.ResponseLoadSnapshotChunk) { defer func() { if r := recover(); r != nil { ret = m.base.LoadSnapshotChunk(input) @@ -166,8 +154,7 @@ func (m BaseMock) LoadSnapshotChunk(input types.RequestLoadSnapshotChunk) types. return ret } -func (m BaseMock) ApplySnapshotChunk(input types.RequestApplySnapshotChunk) types.ResponseApplySnapshotChunk { - var ret types.ResponseApplySnapshotChunk +func (m BaseMock) ApplySnapshotChunk(input types.RequestApplySnapshotChunk) (ret types.ResponseApplySnapshotChunk) { defer func() { if r := recover(); r != nil { ret = m.base.ApplySnapshotChunk(input) @@ -177,8 +164,7 @@ func (m BaseMock) ApplySnapshotChunk(input types.RequestApplySnapshotChunk) type return ret } -func (m BaseMock) FinalizeBlock(input types.RequestFinalizeBlock) types.ResponseFinalizeBlock { - var ret types.ResponseFinalizeBlock +func (m BaseMock) FinalizeBlock(input types.RequestFinalizeBlock) (ret types.ResponseFinalizeBlock) { defer func() { if r := recover(); r != nil { ret = m.base.FinalizeBlock(input) diff --git a/abci/types/types.go b/abci/types/types.go index 4240301b5..3955e7af0 100644 --- a/abci/types/types.go +++ b/abci/types/types.go @@ -53,19 +53,35 @@ func (r ResponseQuery) IsErr() bool { return r.Code != CodeTypeOK } -// IsUnknown returns true if Code is Unknown -func (r ResponseVerifyVoteExtension) IsUnknown() bool { - return r.Result == ResponseVerifyVoteExtension_UNKNOWN +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 +} + +func (r ResponseProcessProposal) IsStatusUnknown() bool { + return r.Status == ResponseProcessProposal_UNKNOWN +} + +// IsStatusUnknown returns true if Code is Unknown +func (r ResponseVerifyVoteExtension) IsStatusUnknown() bool { + return r.Status == ResponseVerifyVoteExtension_UNKNOWN } // IsOK returns true if Code is OK func (r ResponseVerifyVoteExtension) IsOK() bool { - return r.Result == ResponseVerifyVoteExtension_ACCEPT + return r.Status == ResponseVerifyVoteExtension_ACCEPT } // IsErr returns true if Code is something other than OK. func (r ResponseVerifyVoteExtension) IsErr() bool { - return r.Result != ResponseVerifyVoteExtension_ACCEPT + return r.Status != ResponseVerifyVoteExtension_ACCEPT } //--------------------------------------------------------------------------- @@ -159,12 +175,12 @@ func RespondExtendVote(appDataToSign, appDataSelfAuthenticating []byte) Response } func RespondVerifyVoteExtension(ok bool) ResponseVerifyVoteExtension { - result := ResponseVerifyVoteExtension_REJECT + status := ResponseVerifyVoteExtension_REJECT if ok { - result = ResponseVerifyVoteExtension_ACCEPT + status = ResponseVerifyVoteExtension_ACCEPT } return ResponseVerifyVoteExtension{ - Result: result, + Status: status, } } diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index b42c1e0bf..cbea553af 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -160,37 +160,90 @@ func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{35, 0} } -type ResponseVerifyVoteExtension_Result int32 +type ResponseVerifyVoteExtension_VerifyStatus int32 const ( - ResponseVerifyVoteExtension_UNKNOWN ResponseVerifyVoteExtension_Result = 0 - ResponseVerifyVoteExtension_ACCEPT ResponseVerifyVoteExtension_Result = 1 - ResponseVerifyVoteExtension_SLASH ResponseVerifyVoteExtension_Result = 2 - ResponseVerifyVoteExtension_REJECT ResponseVerifyVoteExtension_Result = 3 + ResponseVerifyVoteExtension_UNKNOWN ResponseVerifyVoteExtension_VerifyStatus = 0 + ResponseVerifyVoteExtension_ACCEPT ResponseVerifyVoteExtension_VerifyStatus = 1 + ResponseVerifyVoteExtension_REJECT ResponseVerifyVoteExtension_VerifyStatus = 2 ) -var ResponseVerifyVoteExtension_Result_name = map[int32]string{ +var ResponseVerifyVoteExtension_VerifyStatus_name = map[int32]string{ 0: "UNKNOWN", 1: "ACCEPT", - 2: "SLASH", - 3: "REJECT", + 2: "REJECT", } -var ResponseVerifyVoteExtension_Result_value = map[string]int32{ +var ResponseVerifyVoteExtension_VerifyStatus_value = map[string]int32{ "UNKNOWN": 0, "ACCEPT": 1, - "SLASH": 2, - "REJECT": 3, + "REJECT": 2, } -func (x ResponseVerifyVoteExtension_Result) String() string { - return proto.EnumName(ResponseVerifyVoteExtension_Result_name, int32(x)) +func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { + return proto.EnumName(ResponseVerifyVoteExtension_VerifyStatus_name, int32(x)) } -func (ResponseVerifyVoteExtension_Result) EnumDescriptor() ([]byte, []int) { +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 ( + ResponseProcessProposal_UNKNOWN ResponseProcessProposal_ProposalStatus = 0 + ResponseProcessProposal_ACCEPT ResponseProcessProposal_ProposalStatus = 1 + ResponseProcessProposal_REJECT ResponseProcessProposal_ProposalStatus = 2 +) + +var ResponseProcessProposal_ProposalStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ACCEPT", + 2: "REJECT", +} + +var ResponseProcessProposal_ProposalStatus_value = map[string]int32{ + "UNKNOWN": 0, + "ACCEPT": 1, + "REJECT": 2, +} + +func (x ResponseProcessProposal_ProposalStatus) String() string { + return proto.EnumName(ResponseProcessProposal_ProposalStatus_name, int32(x)) +} + +func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{39, 0} +} + // TxAction contains App-provided information on what to do with a transaction that is part of a raw proposal type TxRecord_TxAction int32 @@ -2929,7 +2982,7 @@ func (m *ResponseExtendVote) GetVoteExtension() *types1.VoteExtension { } type ResponseVerifyVoteExtension struct { - Result ResponseVerifyVoteExtension_Result `protobuf:"varint,1,opt,name=result,proto3,enum=tendermint.abci.ResponseVerifyVoteExtension_Result" json:"result,omitempty"` + Status ResponseVerifyVoteExtension_VerifyStatus `protobuf:"varint,1,opt,name=status,proto3,enum=tendermint.abci.ResponseVerifyVoteExtension_VerifyStatus" json:"status,omitempty"` } func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteExtension{} } @@ -2965,20 +3018,20 @@ func (m *ResponseVerifyVoteExtension) XXX_DiscardUnknown() { var xxx_messageInfo_ResponseVerifyVoteExtension proto.InternalMessageInfo -func (m *ResponseVerifyVoteExtension) GetResult() ResponseVerifyVoteExtension_Result { +func (m *ResponseVerifyVoteExtension) GetStatus() ResponseVerifyVoteExtension_VerifyStatus { if m != nil { - return m.Result + return m.Status } return ResponseVerifyVoteExtension_UNKNOWN } type ResponsePrepareProposal struct { - ModifiedTx bool `protobuf:"varint,1,opt,name=modified_tx,json=modifiedTx,proto3" json:"modified_tx,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"` + 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"` } func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal{} } @@ -3014,11 +3067,11 @@ func (m *ResponsePrepareProposal) XXX_DiscardUnknown() { var xxx_messageInfo_ResponsePrepareProposal proto.InternalMessageInfo -func (m *ResponsePrepareProposal) GetModifiedTx() bool { +func (m *ResponsePrepareProposal) GetModifiedTxStatus() ResponsePrepareProposal_ModifiedTxStatus { if m != nil { - return m.ModifiedTx + return m.ModifiedTxStatus } - return false + return ResponsePrepareProposal_UNKNOWN } func (m *ResponsePrepareProposal) GetTxRecords() []*TxRecord { @@ -3057,11 +3110,11 @@ func (m *ResponsePrepareProposal) GetConsensusParamUpdates() *types1.ConsensusPa } type ResponseProcessProposal struct { - Accept bool `protobuf:"varint,1,opt,name=accept,proto3" json:"accept,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"` + Status ResponseProcessProposal_ProposalStatus `protobuf:"varint,1,opt,name=status,proto3,enum=tendermint.abci.ResponseProcessProposal_ProposalStatus" json:"status,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 *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal{} } @@ -3097,11 +3150,11 @@ func (m *ResponseProcessProposal) XXX_DiscardUnknown() { var xxx_messageInfo_ResponseProcessProposal proto.InternalMessageInfo -func (m *ResponseProcessProposal) GetAccept() bool { +func (m *ResponseProcessProposal) GetStatus() ResponseProcessProposal_ProposalStatus { if m != nil { - return m.Accept + return m.Status } - return false + return ResponseProcessProposal_UNKNOWN } func (m *ResponseProcessProposal) GetAppHash() []byte { @@ -4045,7 +4098,9 @@ 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_Result", ResponseVerifyVoteExtension_Result_name, ResponseVerifyVoteExtension_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.TxRecord_TxAction", TxRecord_TxAction_name, TxRecord_TxAction_value) proto.RegisterType((*Request)(nil), "tendermint.abci.Request") proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") @@ -4106,220 +4161,223 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3395 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x4b, 0x73, 0xdb, 0xd6, - 0xf5, 0xe7, 0xfb, 0x71, 0x28, 0x3e, 0x74, 0xa5, 0x38, 0x34, 0x63, 0x4b, 0x0e, 0x3c, 0x49, 0x1c, - 0x27, 0x91, 0xff, 0xb1, 0x27, 0xf9, 0x3b, 0x4d, 0xd2, 0x8c, 0x44, 0x51, 0xa1, 0x6c, 0x59, 0x52, - 0x20, 0xca, 0x99, 0xb4, 0xa9, 0x11, 0x10, 0xb8, 0x22, 0x11, 0x93, 0x00, 0x02, 0x80, 0x0a, 0x95, - 0x55, 0xa7, 0x33, 0xd9, 0x64, 0x3a, 0xd3, 0xec, 0xda, 0x99, 0x4e, 0xa6, 0x9b, 0x76, 0xa6, 0x1f, - 0xa0, 0x8b, 0xae, 0xba, 0x69, 0x17, 0x59, 0x74, 0x91, 0x5d, 0x3b, 0x5d, 0xa4, 0x9d, 0x64, 0xd7, - 0x2f, 0x90, 0x55, 0x1f, 0x73, 0x1f, 0x00, 0x01, 0x90, 0xe0, 0x23, 0xb6, 0xb3, 0xe9, 0x0e, 0xf7, - 0xf0, 0x9c, 0x83, 0x7b, 0x0f, 0xee, 0x3d, 0xe7, 0xfc, 0xce, 0xb9, 0x84, 0x27, 0x1c, 0xac, 0xab, - 0xd8, 0xea, 0x6b, 0xba, 0x73, 0x4d, 0x6e, 0x2b, 0xda, 0x35, 0xe7, 0xcc, 0xc4, 0xf6, 0x86, 0x69, - 0x19, 0x8e, 0x81, 0xca, 0xa3, 0x1f, 0x37, 0xc8, 0x8f, 0xb5, 0x8b, 0x3e, 0x6e, 0xc5, 0x3a, 0x33, - 0x1d, 0xe3, 0x9a, 0x69, 0x19, 0xc6, 0x09, 0xe3, 0xaf, 0x5d, 0xf0, 0xfd, 0x4c, 0xf5, 0xf8, 0xb5, - 0x05, 0x7e, 0xe5, 0xc2, 0xf7, 0xf1, 0x99, 0xfb, 0xeb, 0xc5, 0x31, 0x59, 0x53, 0xb6, 0xe4, 0xbe, - 0xfb, 0xf3, 0x7a, 0xc7, 0x30, 0x3a, 0x3d, 0x7c, 0x8d, 0x8e, 0xda, 0x83, 0x93, 0x6b, 0x8e, 0xd6, - 0xc7, 0xb6, 0x23, 0xf7, 0x4d, 0xce, 0xb0, 0xda, 0x31, 0x3a, 0x06, 0x7d, 0xbc, 0x46, 0x9e, 0x18, - 0x55, 0xf8, 0x0f, 0x40, 0x56, 0xc4, 0x1f, 0x0c, 0xb0, 0xed, 0xa0, 0xeb, 0x90, 0xc2, 0x4a, 0xd7, - 0xa8, 0xc6, 0x2f, 0xc5, 0xaf, 0x14, 0xae, 0x5f, 0xd8, 0x08, 0x2d, 0x6e, 0x83, 0xf3, 0x35, 0x94, - 0xae, 0xd1, 0x8c, 0x89, 0x94, 0x17, 0xbd, 0x04, 0xe9, 0x93, 0xde, 0xc0, 0xee, 0x56, 0x13, 0x54, - 0xe8, 0x62, 0x94, 0xd0, 0x0e, 0x61, 0x6a, 0xc6, 0x44, 0xc6, 0x4d, 0x5e, 0xa5, 0xe9, 0x27, 0x46, - 0x35, 0x39, 0xfd, 0x55, 0xbb, 0xfa, 0x09, 0x7d, 0x15, 0xe1, 0x45, 0x5b, 0x00, 0x9a, 0xae, 0x39, - 0x92, 0xd2, 0x95, 0x35, 0xbd, 0x9a, 0xa2, 0x92, 0x4f, 0x46, 0x4b, 0x6a, 0x4e, 0x9d, 0x30, 0x36, - 0x63, 0x62, 0x5e, 0x73, 0x07, 0x64, 0xba, 0x1f, 0x0c, 0xb0, 0x75, 0x56, 0x4d, 0x4f, 0x9f, 0xee, - 0x5b, 0x84, 0x89, 0x4c, 0x97, 0x72, 0xa3, 0x5d, 0x28, 0xb4, 0x71, 0x47, 0xd3, 0xa5, 0x76, 0xcf, - 0x50, 0xee, 0x57, 0x33, 0x54, 0x58, 0x88, 0x12, 0xde, 0x22, 0xac, 0x5b, 0x84, 0x73, 0x2b, 0x51, - 0x8d, 0x37, 0x63, 0x22, 0xb4, 0x3d, 0x0a, 0x7a, 0x0d, 0x72, 0x4a, 0x17, 0x2b, 0xf7, 0x25, 0x67, - 0x58, 0xcd, 0x52, 0x3d, 0xeb, 0x51, 0x7a, 0xea, 0x84, 0xaf, 0x35, 0x6c, 0xc6, 0xc4, 0xac, 0xc2, - 0x1e, 0xd1, 0x0e, 0x80, 0x8a, 0x7b, 0xda, 0x29, 0xb6, 0x88, 0x7c, 0x6e, 0xba, 0x0d, 0xb6, 0x19, - 0x67, 0x6b, 0xc8, 0xa7, 0x91, 0x57, 0x5d, 0x02, 0xaa, 0x43, 0x1e, 0xeb, 0x2a, 0x5f, 0x4e, 0x9e, - 0xaa, 0xb9, 0x14, 0xf9, 0xbd, 0x75, 0xd5, 0xbf, 0x98, 0x1c, 0xe6, 0x63, 0x74, 0x13, 0x32, 0x8a, - 0xd1, 0xef, 0x6b, 0x4e, 0x15, 0xa8, 0x86, 0xb5, 0xc8, 0x85, 0x50, 0xae, 0x66, 0x4c, 0xe4, 0xfc, - 0x68, 0x1f, 0x4a, 0x3d, 0xcd, 0x76, 0x24, 0x5b, 0x97, 0x4d, 0xbb, 0x6b, 0x38, 0x76, 0xb5, 0x40, - 0x35, 0x3c, 0x15, 0xa5, 0x61, 0x4f, 0xb3, 0x9d, 0x23, 0x97, 0xb9, 0x19, 0x13, 0x8b, 0x3d, 0x3f, - 0x81, 0xe8, 0x33, 0x4e, 0x4e, 0xb0, 0xe5, 0x29, 0xac, 0x2e, 0x4d, 0xd7, 0x77, 0x40, 0xb8, 0x5d, - 0x79, 0xa2, 0xcf, 0xf0, 0x13, 0xd0, 0x0f, 0x61, 0xa5, 0x67, 0xc8, 0xaa, 0xa7, 0x4e, 0x52, 0xba, - 0x03, 0xfd, 0x7e, 0xb5, 0x48, 0x95, 0x3e, 0x1b, 0x39, 0x49, 0x43, 0x56, 0x5d, 0x15, 0x75, 0x22, - 0xd0, 0x8c, 0x89, 0xcb, 0xbd, 0x30, 0x11, 0xdd, 0x83, 0x55, 0xd9, 0x34, 0x7b, 0x67, 0x61, 0xed, - 0x25, 0xaa, 0xfd, 0x6a, 0x94, 0xf6, 0x4d, 0x22, 0x13, 0x56, 0x8f, 0xe4, 0x31, 0x2a, 0x6a, 0x41, - 0xc5, 0xb4, 0xb0, 0x29, 0x5b, 0x58, 0x32, 0x2d, 0xc3, 0x34, 0x6c, 0xb9, 0x57, 0x2d, 0x53, 0xdd, - 0xcf, 0x44, 0xe9, 0x3e, 0x64, 0xfc, 0x87, 0x9c, 0xbd, 0x19, 0x13, 0xcb, 0x66, 0x90, 0xc4, 0xb4, - 0x1a, 0x0a, 0xb6, 0xed, 0x91, 0xd6, 0xca, 0x2c, 0xad, 0x94, 0x3f, 0xa8, 0x35, 0x40, 0x42, 0x0d, - 0x28, 0xe0, 0x21, 0x11, 0x97, 0x4e, 0x0d, 0x07, 0x57, 0x97, 0xa7, 0x1f, 0xac, 0x06, 0x65, 0xbd, - 0x6b, 0x38, 0x98, 0x1c, 0x2a, 0xec, 0x8d, 0x90, 0x0c, 0x8f, 0x9d, 0x62, 0x4b, 0x3b, 0x39, 0xa3, - 0x6a, 0x24, 0xfa, 0x8b, 0xad, 0x19, 0x7a, 0x15, 0x51, 0x85, 0xcf, 0x45, 0x29, 0xbc, 0x4b, 0x85, - 0x88, 0x8a, 0x86, 0x2b, 0xd2, 0x8c, 0x89, 0x2b, 0xa7, 0xe3, 0x64, 0xb2, 0xc5, 0x4e, 0x34, 0x5d, - 0xee, 0x69, 0x1f, 0x61, 0x7e, 0x6c, 0x56, 0xa6, 0x6f, 0xb1, 0x1d, 0xce, 0x4d, 0xcf, 0x0a, 0xd9, - 0x62, 0x27, 0x7e, 0xc2, 0x56, 0x16, 0xd2, 0xa7, 0x72, 0x6f, 0x80, 0x85, 0x67, 0xa0, 0xe0, 0x73, - 0xac, 0xa8, 0x0a, 0xd9, 0x3e, 0xb6, 0x6d, 0xb9, 0x83, 0xa9, 0x1f, 0xce, 0x8b, 0xee, 0x50, 0x28, - 0xc1, 0x92, 0xdf, 0x99, 0x0a, 0x9f, 0xc6, 0x3d, 0x49, 0xe2, 0x27, 0x89, 0xe4, 0x29, 0xb6, 0xe8, - 0xb2, 0xb9, 0x24, 0x1f, 0xa2, 0xcb, 0x50, 0xa4, 0x53, 0x96, 0xdc, 0xdf, 0x89, 0xb3, 0x4e, 0x89, - 0x4b, 0x94, 0x78, 0x97, 0x33, 0xad, 0x43, 0xc1, 0xbc, 0x6e, 0x7a, 0x2c, 0x49, 0xca, 0x02, 0xe6, - 0x75, 0xd3, 0x65, 0x78, 0x12, 0x96, 0xc8, 0xfa, 0x3c, 0x8e, 0x14, 0x7d, 0x49, 0x81, 0xd0, 0x38, - 0x8b, 0xf0, 0xe7, 0x04, 0x54, 0xc2, 0x0e, 0x18, 0xdd, 0x84, 0x14, 0x89, 0x45, 0x3c, 0xac, 0xd4, - 0x36, 0x58, 0xa0, 0xda, 0x70, 0x03, 0xd5, 0x46, 0xcb, 0x0d, 0x54, 0x5b, 0xb9, 0xcf, 0xbf, 0x5c, - 0x8f, 0x7d, 0xfa, 0xf7, 0xf5, 0xb8, 0x48, 0x25, 0xd0, 0x79, 0xe2, 0x2b, 0x65, 0x4d, 0x97, 0x34, - 0x95, 0x4e, 0x39, 0x4f, 0x1c, 0xa1, 0xac, 0xe9, 0xbb, 0x2a, 0xda, 0x83, 0x8a, 0x62, 0xe8, 0x36, - 0xd6, 0xed, 0x81, 0x2d, 0xb1, 0x40, 0xc8, 0x83, 0x49, 0xc0, 0x1d, 0xb2, 0xf0, 0x5a, 0x77, 0x39, - 0x0f, 0x29, 0xa3, 0x58, 0x56, 0x82, 0x04, 0xe2, 0x56, 0x4f, 0xe5, 0x9e, 0xa6, 0xca, 0x8e, 0x61, - 0xd9, 0xd5, 0xd4, 0xa5, 0xe4, 0x44, 0x7f, 0x78, 0xd7, 0x65, 0x39, 0x36, 0x55, 0xd9, 0xc1, 0x5b, - 0x29, 0x32, 0x5d, 0xd1, 0x27, 0x89, 0x9e, 0x86, 0xb2, 0x6c, 0x9a, 0x92, 0xed, 0xc8, 0x0e, 0x96, - 0xda, 0x67, 0x0e, 0xb6, 0x69, 0xa0, 0x59, 0x12, 0x8b, 0xb2, 0x69, 0x1e, 0x11, 0xea, 0x16, 0x21, - 0xa2, 0xa7, 0xa0, 0x44, 0x62, 0x92, 0x26, 0xf7, 0xa4, 0x2e, 0xd6, 0x3a, 0x5d, 0x87, 0x86, 0x94, - 0xa4, 0x58, 0xe4, 0xd4, 0x26, 0x25, 0x0a, 0xaa, 0xf7, 0xc5, 0x69, 0x3c, 0x42, 0x08, 0x52, 0xaa, - 0xec, 0xc8, 0xd4, 0x92, 0x4b, 0x22, 0x7d, 0x26, 0x34, 0x53, 0x76, 0xba, 0xdc, 0x3e, 0xf4, 0x19, - 0x9d, 0x83, 0x0c, 0x57, 0x9b, 0xa4, 0x6a, 0xf9, 0x08, 0xad, 0x42, 0xda, 0xb4, 0x8c, 0x53, 0x4c, - 0x3f, 0x5d, 0x4e, 0x64, 0x03, 0xe1, 0xc7, 0x09, 0x58, 0x1e, 0x8b, 0x5c, 0x44, 0x6f, 0x57, 0xb6, - 0xbb, 0xee, 0xbb, 0xc8, 0x33, 0x7a, 0x99, 0xe8, 0x95, 0x55, 0x6c, 0xf1, 0x68, 0x5f, 0x1d, 0x37, - 0x75, 0x93, 0xfe, 0xce, 0x4d, 0xc3, 0xb9, 0xd1, 0x6d, 0xa8, 0xf4, 0x64, 0xdb, 0x91, 0x98, 0xf7, - 0x97, 0x7c, 0x91, 0xff, 0x89, 0x31, 0x23, 0xb3, 0x58, 0x41, 0x36, 0x34, 0x57, 0x52, 0x22, 0xa2, - 0x23, 0x2a, 0x12, 0x61, 0xb5, 0x7d, 0xf6, 0x91, 0xac, 0x3b, 0x9a, 0x8e, 0xa5, 0xb1, 0xaf, 0x76, - 0x7e, 0x4c, 0x61, 0xe3, 0x54, 0x53, 0xb1, 0xae, 0xb8, 0x9f, 0x6b, 0xc5, 0x13, 0xf6, 0x3e, 0xa7, - 0x2d, 0x88, 0x50, 0x0a, 0xc6, 0x5c, 0x54, 0x82, 0x84, 0x33, 0xe4, 0x8b, 0x4f, 0x38, 0x43, 0xf4, - 0x7f, 0x90, 0x22, 0x0b, 0xa4, 0x0b, 0x2f, 0x4d, 0x48, 0x58, 0xb8, 0x5c, 0xeb, 0xcc, 0xc4, 0x22, - 0xe5, 0x14, 0x04, 0xef, 0x28, 0x78, 0x71, 0x38, 0xac, 0x55, 0x78, 0x16, 0xca, 0xa1, 0x20, 0xeb, - 0xfb, 0x76, 0x71, 0xff, 0xb7, 0x13, 0xca, 0x50, 0x0c, 0x44, 0x53, 0xe1, 0x1c, 0xac, 0x4e, 0x0a, - 0x8e, 0x42, 0xd7, 0xa3, 0x07, 0x82, 0x1c, 0x7a, 0x09, 0x72, 0x5e, 0x74, 0x64, 0x47, 0x71, 0xdc, - 0x56, 0x2e, 0xb3, 0xe8, 0xb1, 0x92, 0x33, 0x48, 0xb6, 0x34, 0xdd, 0x0b, 0x09, 0x3a, 0xf1, 0xac, - 0x6c, 0x9a, 0x4d, 0xd9, 0xee, 0x0a, 0xef, 0x41, 0x35, 0x2a, 0xf2, 0x85, 0x96, 0x91, 0xf2, 0xb6, - 0xe0, 0x39, 0xc8, 0x9c, 0x18, 0x56, 0x5f, 0x76, 0xa8, 0xb2, 0xa2, 0xc8, 0x47, 0x64, 0x6b, 0xb2, - 0x28, 0x98, 0xa4, 0x64, 0x36, 0x10, 0x24, 0x38, 0x1f, 0x19, 0xfd, 0x88, 0x88, 0xa6, 0xab, 0x98, - 0xd9, 0xb3, 0x28, 0xb2, 0xc1, 0x48, 0x11, 0x9b, 0x2c, 0x1b, 0x90, 0xd7, 0xda, 0x74, 0xad, 0x54, - 0x7f, 0x5e, 0xe4, 0x23, 0xe1, 0x0d, 0x6f, 0xeb, 0x8f, 0x62, 0x0b, 0xba, 0x0a, 0x29, 0x1a, 0x8d, - 0x98, 0x95, 0xce, 0x8d, 0x6f, 0x72, 0xc2, 0x25, 0x52, 0x1e, 0xa1, 0x09, 0xb5, 0xe8, 0x58, 0xb2, - 0x90, 0xa6, 0x3f, 0x26, 0xe0, 0xdc, 0xe4, 0x70, 0xfc, 0x50, 0xcf, 0x62, 0x05, 0x92, 0xce, 0x90, - 0xf8, 0xca, 0xe4, 0x95, 0x25, 0x91, 0x3c, 0xa2, 0x63, 0x58, 0xee, 0x19, 0x8a, 0xdc, 0x93, 0x7c, - 0x67, 0x94, 0xa7, 0xd7, 0x97, 0xc7, 0x4f, 0x13, 0x35, 0x13, 0x56, 0xc7, 0x8e, 0x69, 0x99, 0xea, - 0xd8, 0xf3, 0xce, 0x6a, 0xe4, 0x39, 0x4d, 0x7f, 0xfb, 0x73, 0x8a, 0x2e, 0xc1, 0x52, 0x5f, 0x1e, - 0x4a, 0xce, 0x90, 0x3b, 0x57, 0xe6, 0x35, 0xa1, 0x2f, 0x0f, 0x5b, 0x43, 0xea, 0x59, 0x85, 0x5f, - 0xf9, 0xad, 0x18, 0xcc, 0x35, 0x1e, 0xad, 0x15, 0x8f, 0x60, 0x95, 0xe5, 0x45, 0x58, 0x9d, 0x60, - 0xc8, 0x39, 0xfc, 0x1c, 0x72, 0xc5, 0x1f, 0xad, 0x0d, 0x85, 0x5f, 0x26, 0x3c, 0x07, 0x11, 0x48, - 0x51, 0x1e, 0xb1, 0x7d, 0xde, 0x82, 0x15, 0x15, 0x2b, 0x9a, 0xfa, 0x6d, 0xcd, 0xb3, 0xcc, 0xa5, - 0x1f, 0xb1, 0x75, 0xfe, 0x52, 0x80, 0x9c, 0x88, 0x6d, 0x93, 0x24, 0x08, 0x68, 0x0b, 0xf2, 0x78, - 0xa8, 0x60, 0xd3, 0x71, 0x73, 0xaa, 0xc9, 0xb9, 0x29, 0xe3, 0x6e, 0xb8, 0x9c, 0x04, 0x69, 0x79, - 0x62, 0xe8, 0x06, 0x07, 0xd5, 0xd1, 0xf8, 0x98, 0x8b, 0xfb, 0x51, 0xf5, 0xcb, 0x2e, 0xaa, 0x4e, - 0x46, 0x02, 0x2b, 0x26, 0x15, 0x82, 0xd5, 0x37, 0x38, 0xac, 0x4e, 0xcd, 0x78, 0x59, 0x00, 0x57, - 0xd7, 0x03, 0xb8, 0x3a, 0x3d, 0x63, 0x99, 0x11, 0xc0, 0xfa, 0x65, 0x17, 0x58, 0x67, 0x66, 0xcc, - 0x38, 0x84, 0xac, 0x6f, 0x05, 0x91, 0x75, 0x36, 0xc2, 0xed, 0xb8, 0xd2, 0x53, 0xa1, 0xf5, 0xeb, - 0x3e, 0x68, 0x9d, 0x8b, 0xc4, 0xb4, 0x4c, 0xd1, 0x04, 0x6c, 0xfd, 0x66, 0x00, 0x5b, 0xe7, 0x67, - 0xd8, 0x61, 0x0a, 0xb8, 0xde, 0xf6, 0x83, 0x6b, 0x88, 0xc4, 0xe8, 0xfc, 0xbb, 0x47, 0xa1, 0xeb, - 0x57, 0x3c, 0x74, 0x5d, 0x88, 0x2c, 0x13, 0xf0, 0xb5, 0x84, 0xe1, 0xf5, 0xc1, 0x18, 0xbc, 0x66, - 0x70, 0xf8, 0xe9, 0x48, 0x15, 0x33, 0xf0, 0xf5, 0xc1, 0x18, 0xbe, 0x2e, 0xce, 0x50, 0x38, 0x03, - 0x60, 0xbf, 0x3b, 0x19, 0x60, 0x47, 0x43, 0x60, 0x3e, 0xcd, 0xf9, 0x10, 0xb6, 0x14, 0x81, 0xb0, - 0xcb, 0x91, 0x68, 0x90, 0xa9, 0x9f, 0x1b, 0x62, 0x1f, 0x4f, 0x80, 0xd8, 0x0c, 0x0c, 0x5f, 0x89, - 0x54, 0x3e, 0x07, 0xc6, 0x3e, 0x9e, 0x80, 0xb1, 0x97, 0x67, 0xaa, 0x9d, 0x09, 0xb2, 0x77, 0x82, - 0x20, 0x1b, 0xcd, 0x38, 0x63, 0x91, 0x28, 0xbb, 0x1d, 0x85, 0xb2, 0x19, 0x12, 0x7e, 0x3e, 0x52, - 0xe3, 0x02, 0x30, 0xfb, 0x60, 0x0c, 0x66, 0xaf, 0xce, 0xd8, 0x69, 0xf3, 0xe2, 0xec, 0x67, 0x49, - 0xaa, 0x17, 0x72, 0xd5, 0x24, 0x5b, 0xc4, 0x96, 0x65, 0x58, 0x1c, 0x31, 0xb3, 0x81, 0x70, 0x85, - 0xe0, 0xae, 0x91, 0x5b, 0x9e, 0x82, 0xc9, 0x69, 0x56, 0xee, 0x73, 0xc5, 0xc2, 0xef, 0xe3, 0x23, - 0x59, 0x0a, 0x57, 0xfc, 0x98, 0x2d, 0xcf, 0x31, 0x9b, 0x0f, 0xa9, 0x27, 0x82, 0x48, 0x7d, 0x1d, - 0x0a, 0x24, 0xdb, 0x0e, 0x81, 0x70, 0xd9, 0xf4, 0x40, 0xf8, 0x55, 0x58, 0xa6, 0xe1, 0x93, 0xe1, - 0x79, 0x9e, 0x62, 0xa7, 0x68, 0x1a, 0x54, 0x26, 0x3f, 0x30, 0x2b, 0xb0, 0x5c, 0xfb, 0x05, 0x58, - 0xf1, 0xf1, 0x7a, 0x59, 0x3c, 0x43, 0xa4, 0x15, 0x8f, 0x7b, 0x93, 0xa7, 0xf3, 0x7f, 0x8a, 0x8f, - 0x2c, 0x34, 0x42, 0xef, 0x93, 0x80, 0x76, 0xfc, 0x21, 0x01, 0xed, 0xc4, 0xb7, 0x06, 0xda, 0x7e, - 0x54, 0x92, 0x0c, 0xa2, 0x92, 0x6f, 0xe2, 0xa3, 0x6f, 0xe2, 0xc1, 0x66, 0xc5, 0x50, 0x31, 0xc7, - 0x09, 0xf4, 0x99, 0x24, 0x28, 0x3d, 0xa3, 0xc3, 0xd1, 0x00, 0x79, 0x24, 0x5c, 0x5e, 0xec, 0xcc, - 0xf3, 0xd0, 0xe8, 0x41, 0x8c, 0x34, 0xb5, 0x30, 0x87, 0x18, 0x15, 0x48, 0xde, 0xc7, 0x2c, 0xd2, - 0x2d, 0x89, 0xe4, 0x91, 0xf0, 0xd1, 0x4d, 0x46, 0xe3, 0xd7, 0x92, 0xc8, 0x06, 0xe8, 0x26, 0xe4, - 0x69, 0xf1, 0x5f, 0x32, 0x4c, 0x9b, 0x07, 0xa4, 0x40, 0xa2, 0xc3, 0x6a, 0xfc, 0x1b, 0x87, 0x84, - 0xe7, 0xc0, 0xb4, 0xc5, 0x9c, 0xc9, 0x9f, 0x7c, 0xe8, 0x29, 0x1f, 0x00, 0xf0, 0x17, 0x20, 0x4f, - 0x66, 0x6f, 0x9b, 0xb2, 0x82, 0x69, 0x64, 0xc9, 0x8b, 0x23, 0x82, 0x70, 0x0f, 0xd0, 0x78, 0x9c, - 0x44, 0x4d, 0xc8, 0xe0, 0x53, 0xac, 0x3b, 0xe4, 0xb3, 0x25, 0xc3, 0x28, 0x84, 0xe7, 0x45, 0x58, - 0x77, 0xb6, 0xaa, 0xc4, 0xc8, 0xff, 0xfc, 0x72, 0xbd, 0xc2, 0xb8, 0x9f, 0x37, 0xfa, 0x9a, 0x83, - 0xfb, 0xa6, 0x73, 0x26, 0x72, 0x79, 0xe1, 0x6f, 0x09, 0x02, 0x57, 0x03, 0xf1, 0x73, 0xa2, 0x6d, - 0xdd, 0x2d, 0x9f, 0xf0, 0x95, 0x29, 0xe6, 0xb3, 0xf7, 0x45, 0x80, 0x8e, 0x6c, 0x4b, 0x1f, 0xca, - 0xba, 0x83, 0x55, 0x6e, 0xf4, 0x7c, 0x47, 0xb6, 0xdf, 0xa6, 0x04, 0xf2, 0xd5, 0xc9, 0xcf, 0x03, - 0x1b, 0xab, 0x3c, 0xf5, 0xcf, 0x76, 0x64, 0xfb, 0xd8, 0xc6, 0xaa, 0x6f, 0x95, 0xd9, 0x07, 0x5b, - 0x65, 0xd0, 0xc6, 0xb9, 0x90, 0x8d, 0x7d, 0x40, 0x32, 0xef, 0x07, 0x92, 0xa8, 0x06, 0x39, 0xd3, - 0xd2, 0x0c, 0x4b, 0x73, 0xce, 0xe8, 0x87, 0x49, 0x8a, 0xde, 0x18, 0x5d, 0x86, 0x62, 0x1f, 0xf7, - 0x4d, 0xc3, 0xe8, 0x49, 0xcc, 0xd9, 0x14, 0xa8, 0xe8, 0x12, 0x27, 0x36, 0xa8, 0xcf, 0xf9, 0x38, - 0x31, 0x3a, 0x7d, 0xa3, 0x82, 0xc1, 0xc3, 0x35, 0xef, 0xda, 0x04, 0xf3, 0xfa, 0x28, 0x64, 0x11, - 0x21, 0xfb, 0x7a, 0xe3, 0xef, 0xca, 0xc0, 0xc2, 0x4f, 0x69, 0x09, 0x31, 0x98, 0x1b, 0xa1, 0x23, - 0x58, 0xf6, 0x0e, 0xbf, 0x34, 0xa0, 0x4e, 0xc1, 0xdd, 0xce, 0xf3, 0x7a, 0x8f, 0xca, 0x69, 0x90, - 0x6c, 0xa3, 0x77, 0xe0, 0xf1, 0x90, 0x67, 0xf3, 0x54, 0x27, 0xe6, 0x75, 0x70, 0x8f, 0x05, 0x1d, - 0x9c, 0xab, 0x7a, 0x64, 0xac, 0xe4, 0x03, 0x9e, 0xb9, 0x5d, 0x28, 0x05, 0xd3, 0xbc, 0x89, 0x9f, - 0xff, 0x32, 0x14, 0x2d, 0xec, 0xc8, 0x9a, 0x2e, 0x05, 0xea, 0x7e, 0x4b, 0x8c, 0xc8, 0xab, 0x89, - 0x87, 0xf0, 0xd8, 0xc4, 0x74, 0x0f, 0xfd, 0x3f, 0xe4, 0x47, 0x99, 0x62, 0x3c, 0x02, 0x3c, 0x79, - 0xa5, 0xa1, 0x11, 0xaf, 0xf0, 0x87, 0xf8, 0x48, 0x65, 0xb0, 0xd8, 0xd4, 0x80, 0x8c, 0x85, 0xed, - 0x41, 0x8f, 0x95, 0x7f, 0x4a, 0xd7, 0x5f, 0x98, 0x2f, 0x51, 0x24, 0xd4, 0x41, 0xcf, 0x11, 0xb9, - 0xb0, 0x70, 0x0f, 0x32, 0x8c, 0x82, 0x0a, 0x90, 0x3d, 0xde, 0xbf, 0xbd, 0x7f, 0xf0, 0xf6, 0x7e, - 0x25, 0x86, 0x00, 0x32, 0x9b, 0xf5, 0x7a, 0xe3, 0xb0, 0x55, 0x89, 0xa3, 0x3c, 0xa4, 0x37, 0xb7, - 0x0e, 0xc4, 0x56, 0x25, 0x41, 0xc8, 0x62, 0xe3, 0x56, 0xa3, 0xde, 0xaa, 0x24, 0xd1, 0x32, 0x14, - 0xd9, 0xb3, 0xb4, 0x73, 0x20, 0xde, 0xd9, 0x6c, 0x55, 0x52, 0x3e, 0xd2, 0x51, 0x63, 0x7f, 0xbb, - 0x21, 0x56, 0xd2, 0xc2, 0x8b, 0x70, 0x3e, 0x32, 0xb5, 0x1c, 0x55, 0x92, 0xe2, 0xbe, 0x4a, 0x92, - 0xf0, 0x8b, 0x04, 0xd4, 0xa2, 0xf3, 0x45, 0x74, 0x2b, 0xb4, 0xf0, 0xeb, 0x0b, 0x24, 0x9b, 0xa1, - 0xd5, 0xa3, 0xa7, 0xa0, 0x64, 0xe1, 0x13, 0xec, 0x28, 0x5d, 0x96, 0xbf, 0xb2, 0x80, 0x59, 0x14, - 0x8b, 0x9c, 0x4a, 0x85, 0x6c, 0xc6, 0xf6, 0x3e, 0x56, 0x1c, 0x89, 0xf9, 0x22, 0xb6, 0xe9, 0xf2, - 0x84, 0x8d, 0x50, 0x8f, 0x18, 0x51, 0x78, 0x6f, 0x21, 0x5b, 0xe6, 0x21, 0x2d, 0x36, 0x5a, 0xe2, - 0x3b, 0x95, 0x24, 0x42, 0x50, 0xa2, 0x8f, 0xd2, 0xd1, 0xfe, 0xe6, 0xe1, 0x51, 0xf3, 0x80, 0xd8, - 0x72, 0x05, 0xca, 0xae, 0x2d, 0x5d, 0x62, 0x5a, 0x78, 0x77, 0x14, 0x7f, 0x7c, 0xd5, 0xb4, 0x1d, - 0x28, 0x85, 0xd2, 0xc5, 0xf8, 0x38, 0x9e, 0x19, 0x55, 0xc3, 0xbc, 0x54, 0x50, 0x2c, 0x9e, 0xfa, - 0x87, 0xc2, 0xaf, 0xe3, 0xf0, 0xc4, 0x94, 0x84, 0x12, 0xdd, 0x0e, 0x59, 0xfe, 0xc6, 0x22, 0xe9, - 0x68, 0x78, 0xe3, 0xdd, 0x9c, 0xcb, 0x58, 0x47, 0x7b, 0x9b, 0x47, 0xcd, 0xe0, 0xc6, 0x13, 0xbe, - 0x49, 0xc0, 0xe3, 0x11, 0x29, 0x3f, 0xc9, 0xee, 0xfa, 0x86, 0xaa, 0x9d, 0x68, 0x58, 0x95, 0x78, - 0x1d, 0x38, 0x27, 0x82, 0x4b, 0x6a, 0x0d, 0xd1, 0x4d, 0x00, 0x67, 0x28, 0x59, 0x58, 0x31, 0x2c, - 0xd5, 0x4d, 0x8f, 0xc6, 0x8f, 0x62, 0x6b, 0x28, 0x52, 0x0e, 0x31, 0xef, 0xf0, 0xa7, 0x69, 0x09, - 0x11, 0x7a, 0x8d, 0x2b, 0x25, 0xcb, 0x71, 0xcb, 0xe4, 0x17, 0x27, 0x14, 0xf6, 0xb0, 0x42, 0x14, - 0x53, 0x33, 0x50, 0xc5, 0x94, 0x1f, 0xdd, 0x99, 0xe4, 0x7a, 0xd3, 0xf3, 0xb9, 0xde, 0xc5, 0x9c, - 0x6e, 0xe6, 0xc1, 0x9c, 0xae, 0xf0, 0xbb, 0x80, 0xe5, 0x83, 0x10, 0xe8, 0x1c, 0x64, 0x64, 0x85, - 0x24, 0xfd, 0xdc, 0xe8, 0x7c, 0x34, 0xa5, 0xba, 0x1d, 0x32, 0x5b, 0xf2, 0x61, 0x98, 0x2d, 0xf5, - 0x28, 0xcc, 0x96, 0x7e, 0x40, 0xb3, 0xfd, 0x2c, 0x39, 0x72, 0xe2, 0xc1, 0x82, 0xe0, 0x43, 0xcb, - 0x1c, 0x43, 0xb6, 0x4c, 0x2c, 0x68, 0xcb, 0x89, 0xd1, 0x3f, 0xf9, 0xe8, 0xa2, 0x7f, 0xea, 0x01, - 0xa3, 0xbf, 0x7f, 0x53, 0xa5, 0x83, 0x9b, 0x6a, 0x2c, 0x50, 0x67, 0x26, 0x04, 0xea, 0x77, 0x00, - 0x7c, 0xfd, 0xae, 0x55, 0x48, 0x5b, 0xc6, 0x40, 0x57, 0xe9, 0xce, 0x4d, 0x8b, 0x6c, 0x80, 0x5e, - 0x82, 0x34, 0x71, 0x8f, 0xd1, 0x4e, 0x82, 0xb8, 0x37, 0x5f, 0xf9, 0x94, 0x71, 0x0b, 0x1a, 0xa0, - 0xf1, 0x0a, 0x7e, 0xc4, 0x2b, 0x5e, 0x0f, 0xbe, 0xe2, 0xc9, 0xc8, 0x5e, 0xc0, 0xe4, 0x57, 0x7d, - 0x04, 0x69, 0xba, 0x3d, 0x48, 0xc2, 0x42, 0x5b, 0x67, 0x1c, 0x01, 0x93, 0x67, 0xf4, 0x23, 0x00, - 0xd9, 0x71, 0x2c, 0xad, 0x3d, 0x18, 0xbd, 0x60, 0x7d, 0xf2, 0xf6, 0xda, 0x74, 0xf9, 0xb6, 0x2e, - 0xf0, 0x7d, 0xb6, 0x3a, 0x12, 0xf5, 0xed, 0x35, 0x9f, 0x42, 0x61, 0x1f, 0x4a, 0x41, 0x59, 0x17, - 0xb3, 0xb1, 0x39, 0x04, 0x31, 0x1b, 0x83, 0xe0, 0x1c, 0xb3, 0x79, 0x88, 0x2f, 0xc9, 0x5a, 0xa4, - 0x74, 0x20, 0xfc, 0x3b, 0x0e, 0x4b, 0xfe, 0xdd, 0xf9, 0xbf, 0x06, 0x7b, 0x84, 0x8f, 0xe3, 0x90, - 0xf3, 0x16, 0x1f, 0xd1, 0xa2, 0x1c, 0xd9, 0x2e, 0xe1, 0x6f, 0xc8, 0xb1, 0x9e, 0x67, 0xd2, 0xeb, - 0xa4, 0xbe, 0xea, 0xc5, 0xe9, 0xa8, 0x2a, 0xb5, 0xdf, 0xd2, 0x6e, 0x5f, 0x81, 0xc7, 0xe5, 0x9f, - 0xf3, 0x79, 0x90, 0xa0, 0x87, 0xbe, 0x47, 0x9c, 0xba, 0x57, 0x9b, 0x2f, 0x4d, 0x28, 0xd6, 0xba, - 0xac, 0x1b, 0xad, 0xe1, 0x26, 0xe5, 0x14, 0xb9, 0x04, 0x9f, 0x55, 0xc2, 0xeb, 0xc4, 0xbe, 0x41, - 0xf4, 0x32, 0x9e, 0x60, 0xc8, 0x2f, 0x01, 0x1c, 0xef, 0xdf, 0x39, 0xd8, 0xde, 0xdd, 0xd9, 0x6d, - 0x6c, 0xf3, 0x1c, 0x69, 0x7b, 0xbb, 0xb1, 0x5d, 0x49, 0x10, 0x3e, 0xb1, 0x71, 0xe7, 0xe0, 0x6e, - 0x63, 0xbb, 0x92, 0x14, 0x5e, 0x85, 0xbc, 0xe7, 0x7a, 0x50, 0x15, 0xb2, 0xb2, 0xaa, 0x5a, 0xd8, - 0xb6, 0x79, 0xf2, 0xe8, 0x0e, 0x69, 0x0b, 0xde, 0xf8, 0x90, 0xf7, 0x21, 0x93, 0x22, 0x1b, 0x08, - 0x2a, 0x94, 0x43, 0x7e, 0x0b, 0xbd, 0x0a, 0x59, 0x73, 0xd0, 0x96, 0xdc, 0x4d, 0x1b, 0xba, 0x24, - 0xe7, 0x96, 0x0e, 0x06, 0xed, 0x9e, 0xa6, 0xdc, 0xc6, 0x67, 0xae, 0x99, 0xcc, 0x41, 0xfb, 0x36, - 0xdb, 0xdb, 0xec, 0x2d, 0x09, 0xff, 0x5b, 0x7e, 0x12, 0x87, 0x9c, 0x7b, 0x56, 0xd1, 0xf7, 0x21, - 0xef, 0xf9, 0x44, 0xef, 0x6a, 0x46, 0xa4, 0x33, 0xe5, 0xfa, 0x47, 0x22, 0xe8, 0x2a, 0x2c, 0xdb, - 0x5a, 0x47, 0x77, 0xdb, 0x39, 0xac, 0x56, 0x97, 0xa0, 0x87, 0xa6, 0xcc, 0x7e, 0xd8, 0x73, 0x0b, - 0x4c, 0xb7, 0x52, 0xb9, 0x64, 0x25, 0x75, 0x2b, 0x95, 0x4b, 0x55, 0xd2, 0xc2, 0x6f, 0xe2, 0x50, - 0x09, 0x3b, 0x8e, 0xef, 0x72, 0x32, 0x24, 0x5d, 0x0e, 0xe5, 0xa3, 0x6c, 0x6f, 0x86, 0xd2, 0xcd, - 0x7f, 0xc5, 0x21, 0xe7, 0x36, 0x8c, 0xd0, 0x8b, 0x3e, 0x17, 0x56, 0x9a, 0xb4, 0x63, 0x39, 0xe3, - 0xa8, 0xfd, 0x1f, 0x5c, 0x52, 0x62, 0xf1, 0x25, 0x45, 0xdd, 0xe1, 0x70, 0x6f, 0xd3, 0xa4, 0x16, - 0xbe, 0x4d, 0xf3, 0x3c, 0x20, 0xc7, 0x70, 0xe4, 0x9e, 0x74, 0x6a, 0x38, 0x9a, 0xde, 0x91, 0xd8, - 0x0e, 0x61, 0xde, 0xa6, 0x42, 0x7f, 0xb9, 0x4b, 0x7f, 0x38, 0xf4, 0x36, 0x8b, 0x07, 0xe7, 0x16, - 0xed, 0xe6, 0x9f, 0x83, 0x0c, 0x47, 0x2c, 0xac, 0x9d, 0xcf, 0x47, 0x5e, 0x8b, 0x31, 0xe5, 0x6b, - 0x31, 0xd6, 0x20, 0xd7, 0xc7, 0x8e, 0x4c, 0x5d, 0x27, 0x8b, 0x96, 0xde, 0xf8, 0xea, 0x2b, 0x50, - 0xf0, 0x5d, 0xac, 0x20, 0xde, 0x74, 0xbf, 0xf1, 0x76, 0x25, 0x56, 0xcb, 0x7e, 0xf2, 0xd9, 0xa5, - 0xe4, 0x3e, 0xfe, 0x90, 0x1c, 0x34, 0xb1, 0x51, 0x6f, 0x36, 0xea, 0xb7, 0x2b, 0xf1, 0x5a, 0xe1, - 0x93, 0xcf, 0x2e, 0x65, 0x45, 0x4c, 0xfb, 0x39, 0x57, 0x9b, 0xb0, 0xe4, 0xff, 0x2a, 0xc1, 0x43, - 0x8d, 0xa0, 0xb4, 0x7d, 0x7c, 0xb8, 0xb7, 0x5b, 0xdf, 0x6c, 0x35, 0xa4, 0xbb, 0x07, 0xad, 0x46, - 0x25, 0x8e, 0x1e, 0x87, 0x95, 0xbd, 0xdd, 0x37, 0x9b, 0x2d, 0xa9, 0xbe, 0xb7, 0xdb, 0xd8, 0x6f, - 0x49, 0x9b, 0xad, 0xd6, 0x66, 0xfd, 0x76, 0x25, 0x71, 0xfd, 0xb7, 0x05, 0x28, 0x6f, 0x6e, 0xd5, - 0x77, 0x09, 0x60, 0xd3, 0x14, 0x99, 0xba, 0x88, 0x3a, 0xa4, 0x68, 0x65, 0x78, 0xea, 0x25, 0xd9, - 0xda, 0xf4, 0x6e, 0x1f, 0xda, 0x81, 0x34, 0x2d, 0x1a, 0xa3, 0xe9, 0xb7, 0x66, 0x6b, 0x33, 0xda, - 0x7f, 0x64, 0x32, 0xf4, 0x14, 0x4d, 0xbd, 0x46, 0x5b, 0x9b, 0xde, 0x0d, 0x44, 0x7b, 0x90, 0x75, - 0x6b, 0x7a, 0xb3, 0x2e, 0xa4, 0xd6, 0x66, 0xb6, 0xd5, 0xc8, 0xd2, 0x58, 0xed, 0x75, 0xfa, 0x0d, - 0xdb, 0xda, 0x8c, 0x3e, 0x21, 0xda, 0x85, 0x0c, 0x2f, 0x7b, 0xcc, 0xb8, 0x5c, 0x5a, 0x9b, 0xd5, - 0x1e, 0x43, 0x22, 0xe4, 0x47, 0x55, 0xed, 0xd9, 0xf7, 0x86, 0x6b, 0x73, 0xb4, 0x40, 0xd1, 0x3d, - 0x28, 0x06, 0x4b, 0x29, 0xf3, 0x5d, 0x60, 0xad, 0xcd, 0xd9, 0x88, 0x23, 0xfa, 0x83, 0x75, 0x95, - 0xf9, 0x2e, 0xb4, 0xd6, 0xe6, 0xec, 0xcb, 0xa1, 0xf7, 0x61, 0x79, 0xbc, 0xee, 0x31, 0xff, 0xfd, - 0xd6, 0xda, 0x02, 0x9d, 0x3a, 0xd4, 0x07, 0x34, 0xa1, 0x5e, 0xb2, 0xc0, 0x75, 0xd7, 0xda, 0x22, - 0x8d, 0x3b, 0xa4, 0x42, 0x39, 0x0c, 0xbf, 0xe7, 0xbd, 0xfe, 0x5a, 0x9b, 0xbb, 0x89, 0xc7, 0xde, - 0x12, 0x84, 0x9a, 0xf3, 0x5e, 0x87, 0xad, 0xcd, 0xdd, 0xd3, 0x43, 0xc7, 0x00, 0xbe, 0x82, 0xca, - 0x1c, 0xd7, 0x63, 0x6b, 0xf3, 0x74, 0xf7, 0x90, 0x09, 0x2b, 0x93, 0x0a, 0x29, 0x8b, 0xdc, 0x96, - 0xad, 0x2d, 0xd4, 0xf4, 0x23, 0xfb, 0x39, 0x08, 0x31, 0xe7, 0xbb, 0x3d, 0x5b, 0x9b, 0xb3, 0xfb, - 0xb7, 0xd5, 0xf8, 0xfc, 0xab, 0xb5, 0xf8, 0x17, 0x5f, 0xad, 0xc5, 0xff, 0xf1, 0xd5, 0x5a, 0xfc, - 0xd3, 0xaf, 0xd7, 0x62, 0x5f, 0x7c, 0xbd, 0x16, 0xfb, 0xeb, 0xd7, 0x6b, 0xb1, 0x1f, 0x3c, 0xd7, - 0xd1, 0x9c, 0xee, 0xa0, 0xbd, 0xa1, 0x18, 0xfd, 0x6b, 0xfe, 0x3f, 0x52, 0x4c, 0xfa, 0x73, 0x47, - 0x3b, 0x43, 0xa3, 0xe9, 0x8d, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xf9, 0x85, 0x76, 0xba, 0xfc, - 0x31, 0x00, 0x00, + // 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, } // Reference imports to suppress errors if they are not otherwise used. @@ -7487,8 +7545,8 @@ func (m *ResponseVerifyVoteExtension) MarshalToSizedBuffer(dAtA []byte) (int, er _ = i var l int _ = l - if m.Result != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Result)) + if m.Status != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Status)) i-- dAtA[i] = 0x8 } @@ -7576,13 +7634,8 @@ func (m *ResponsePrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) dAtA[i] = 0x12 } } - if m.ModifiedTx { - i-- - if m.ModifiedTx { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.ModifiedTxStatus != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.ModifiedTxStatus)) i-- dAtA[i] = 0x8 } @@ -7656,13 +7709,8 @@ func (m *ResponseProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x12 } - if m.Accept { - i-- - if m.Accept { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.Status != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Status)) i-- dAtA[i] = 0x8 } @@ -9586,8 +9634,8 @@ func (m *ResponseVerifyVoteExtension) Size() (n int) { } var l int _ = l - if m.Result != 0 { - n += 1 + sovTypes(uint64(m.Result)) + if m.Status != 0 { + n += 1 + sovTypes(uint64(m.Status)) } return n } @@ -9598,8 +9646,8 @@ func (m *ResponsePrepareProposal) Size() (n int) { } var l int _ = l - if m.ModifiedTx { - n += 2 + if m.ModifiedTxStatus != 0 { + n += 1 + sovTypes(uint64(m.ModifiedTxStatus)) } if len(m.TxRecords) > 0 { for _, e := range m.TxRecords { @@ -9636,8 +9684,8 @@ func (m *ResponseProcessProposal) Size() (n int) { } var l int _ = l - if m.Accept { - n += 2 + if m.Status != 0 { + n += 1 + sovTypes(uint64(m.Status)) } l = len(m.AppHash) if l > 0 { @@ -16209,9 +16257,9 @@ func (m *ResponseVerifyVoteExtension) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - m.Result = 0 + m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -16221,7 +16269,7 @@ func (m *ResponseVerifyVoteExtension) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Result |= ResponseVerifyVoteExtension_Result(b&0x7F) << shift + m.Status |= ResponseVerifyVoteExtension_VerifyStatus(b&0x7F) << shift if b < 0x80 { break } @@ -16278,9 +16326,9 @@ func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ModifiedTx", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ModifiedTxStatus", wireType) } - var v int + m.ModifiedTxStatus = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -16290,12 +16338,11 @@ func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + m.ModifiedTxStatus |= ResponsePrepareProposal_ModifiedTxStatus(b&0x7F) << shift if b < 0x80 { break } } - m.ModifiedTx = bool(v != 0) case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field TxRecords", wireType) @@ -16520,9 +16567,9 @@ func (m *ResponseProcessProposal) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Accept", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var v int + m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -16532,12 +16579,11 @@ func (m *ResponseProcessProposal) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + m.Status |= ResponseProcessProposal_ProposalStatus(b&0x7F) << shift if b < 0x80 { break } } - m.Accept = bool(v != 0) case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) diff --git a/internal/consensus/invalid_test.go b/internal/consensus/invalid_test.go index 033b096ba..f38598af9 100644 --- a/internal/consensus/invalid_test.go +++ b/internal/consensus/invalid_test.go @@ -26,13 +26,13 @@ func TestReactorInvalidPrecommit(t *testing.T) { config := configSetup(t) - n := 4 + const n = 2 states, cleanup := makeConsensusState(ctx, t, config, n, "consensus_reactor_test", newMockTickerFunc(true)) t.Cleanup(cleanup) - for i := 0; i < 4; i++ { + for i := 0; i < n; i++ { ticker := NewTimeoutTicker(states[i].logger) states[i].SetTimeoutTicker(ticker) } diff --git a/internal/consensus/mempool_test.go b/internal/consensus/mempool_test.go index 6d1d7e8e4..addf60556 100644 --- a/internal/consensus/mempool_test.go +++ b/internal/consensus/mempool_test.go @@ -310,10 +310,12 @@ func (app *CounterApplication) Commit() abci.ResponseCommit { func (app *CounterApplication) PrepareProposal( req abci.RequestPrepareProposal) abci.ResponsePrepareProposal { - return abci.ResponsePrepareProposal{} + return abci.ResponsePrepareProposal{ + ModifiedTxStatus: abci.ResponsePrepareProposal_UNMODIFIED, + } } func (app *CounterApplication) ProcessProposal( req abci.RequestProcessProposal) abci.ResponseProcessProposal { - return abci.ResponseProcessProposal{Accept: true} + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT} } diff --git a/internal/consensus/reactor_test.go b/internal/consensus/reactor_test.go index b8d638976..c284b4345 100644 --- a/internal/consensus/reactor_test.go +++ b/internal/consensus/reactor_test.go @@ -355,7 +355,7 @@ func TestReactorBasic(t *testing.T) { cfg := configSetup(t) - n := 4 + n := 2 states, cleanup := makeConsensusState(ctx, t, cfg, n, "consensus_reactor_test", newMockTickerFunc(true)) @@ -445,7 +445,7 @@ func TestReactorWithEvidence(t *testing.T) { cfg := configSetup(t) - n := 4 + n := 2 testName := "consensus_reactor_test" tickerFunc := newMockTickerFunc(true) @@ -551,7 +551,7 @@ func TestReactorCreatesBlockWhenEmptyBlocksFalse(t *testing.T) { cfg := configSetup(t) - n := 4 + n := 2 states, cleanup := makeConsensusState(ctx, t, cfg, @@ -574,7 +574,7 @@ func TestReactorCreatesBlockWhenEmptyBlocksFalse(t *testing.T) { // send a tx require.NoError( t, - assertMempool(t, states[3].txNotifier).CheckTx( + assertMempool(t, states[1].txNotifier).CheckTx( ctx, []byte{1, 2, 3}, nil, @@ -605,7 +605,7 @@ func TestReactorRecordsVotesAndBlockParts(t *testing.T) { cfg := configSetup(t) - n := 4 + n := 2 states, cleanup := makeConsensusState(ctx, t, cfg, n, "consensus_reactor_test", newMockTickerFunc(true)) @@ -670,7 +670,7 @@ func TestReactorVotingPowerChange(t *testing.T) { cfg := configSetup(t) - n := 4 + n := 2 states, cleanup := makeConsensusState(ctx, t, cfg, diff --git a/internal/consensus/state_test.go b/internal/consensus/state_test.go index f008e75d3..f03889c9e 100644 --- a/internal/consensus/state_test.go +++ b/internal/consensus/state_test.go @@ -3,7 +3,6 @@ package consensus import ( "bytes" "context" - "fmt" "testing" "time" @@ -12,7 +11,7 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/abci/example/kvstore" - abcitypes "github.com/tendermint/tendermint/abci/types" + abci "github.com/tendermint/tendermint/abci/types" abcimocks "github.com/tendermint/tendermint/abci/types/mocks" "github.com/tendermint/tendermint/crypto/tmhash" cstypes "github.com/tendermint/tendermint/internal/consensus/types" @@ -312,8 +311,6 @@ func TestStateOversizedBlock(t *testing.T) { // start the machine startTestRound(ctx, cs1, height, round) - t.Log("Block Sizes", "Limit", cs1.state.ConsensusParams.Block.MaxBytes, "Current", totalBytes) - // c1 should log an error with the block part message as it exceeds the consensus params. The // block is not added to cs.ProposalBlock so the node timeouts. ensureNewTimeout(t, timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) @@ -490,7 +487,6 @@ func TestStateLock_NoPOL(t *testing.T) { round++ // moving to the next round ensureNewRound(t, newRoundCh, height, round) - t.Log("#### ONTO ROUND 1") /* Round2 (cs1, B) // B B2 */ @@ -533,7 +529,6 @@ func TestStateLock_NoPOL(t *testing.T) { round++ // entering new round ensureNewRound(t, newRoundCh, height, round) - t.Log("#### ONTO ROUND 2") /* Round3 (vs2, _) // B, B2 */ @@ -590,7 +585,6 @@ func TestStateLock_NoPOL(t *testing.T) { round++ // entering new round ensureNewRound(t, newRoundCh, height, round) - t.Log("#### ONTO ROUND 3") /* Round4 (vs2, C) // B C // B C */ @@ -662,7 +656,6 @@ func TestStateLock_POLUpdateLock(t *testing.T) { This ensures that cs1 will lock on B in this round but not precommit it. */ - t.Log("### Starting Round 0") // start round and wait for propose and prevote startTestRound(ctx, cs1, height, round) @@ -700,7 +693,6 @@ func TestStateLock_POLUpdateLock(t *testing.T) { Check that cs1 is now locked on the new block, D and no longer on the old block. */ - t.Log("### Starting Round 1") incrementRound(vs2, vs3, vs4) round++ @@ -769,7 +761,6 @@ func TestStateLock_POLRelock(t *testing.T) { Send a precommit for nil from all of the validators to cs1. This ensures that cs1 will lock on B in this round but not precommit it. */ - t.Log("### Starting Round 0") startTestRound(ctx, cs1, height, round) @@ -808,7 +799,6 @@ func TestStateLock_POLRelock(t *testing.T) { Check that cs1 updates its 'locked round' value to the current round. */ - t.Log("### Starting Round 1") incrementRound(vs2, vs3, vs4) round++ propR1 := types.NewProposal(height, round, cs1.ValidRound, blockID, theBlock.Header.Time) @@ -868,7 +858,6 @@ func TestStateLock_PrevoteNilWhenLockedAndMissProposal(t *testing.T) { This ensures that cs1 will lock on B in this round but not precommit it. */ - t.Log("### Starting Round 0") startTestRound(ctx, cs1, height, round) @@ -905,7 +894,6 @@ func TestStateLock_PrevoteNilWhenLockedAndMissProposal(t *testing.T) { Check that cs1 prevotes nil instead of its locked block, but ensure that it maintains its locked block. */ - t.Log("### Starting Round 1") incrementRound(vs2, vs3, vs4) round++ @@ -957,7 +945,6 @@ func TestStateLock_PrevoteNilWhenLockedAndDifferentProposal(t *testing.T) { This ensures that cs1 will lock on B in this round but not precommit it. */ - t.Log("### Starting Round 0") startTestRound(ctx, cs1, height, round) ensureNewRound(t, newRoundCh, height, round) @@ -994,7 +981,6 @@ func TestStateLock_PrevoteNilWhenLockedAndDifferentProposal(t *testing.T) { Check that cs1 prevotes nil instead of its locked block, but ensure that it maintains its locked block. */ - t.Log("### Starting Round 1") incrementRound(vs2, vs3, vs4) round++ cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) @@ -1059,7 +1045,6 @@ func TestStateLock_POLDoesNotUnlock(t *testing.T) { This ensures that cs1 will lock on B in this round. */ - t.Log("#### ONTO ROUND 0") // start round and wait for propose and prevote startTestRound(ctx, cs1, height, round) @@ -1101,7 +1086,6 @@ func TestStateLock_POLDoesNotUnlock(t *testing.T) { Check that cs1 maintains its lock on B but precommits nil. Send a precommit for nil from >2/3 of the validators to `cs1`. */ - t.Log("#### ONTO ROUND 1") round++ incrementRound(vs2, vs3, vs4) cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) @@ -1136,7 +1120,6 @@ func TestStateLock_POLDoesNotUnlock(t *testing.T) { Send the validator >2/3 prevotes for nil and ensure that it did not unlock its block at the end of the previous round. */ - t.Log("#### ONTO ROUND 2") round++ incrementRound(vs2, vs3, vs4) cs3 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) @@ -1193,7 +1176,6 @@ func TestStateLock_MissingProposalWhenPOLSeenDoesNotUpdateLock(t *testing.T) { This ensures that cs1 will lock on B in this round but not precommit it. */ - t.Log("### Starting Round 0") startTestRound(ctx, cs1, height, round) ensureNewRound(t, newRoundCh, height, round) @@ -1225,7 +1207,6 @@ func TestStateLock_MissingProposalWhenPOLSeenDoesNotUpdateLock(t *testing.T) { Check that cs1 does not update its locked block to this missed block D. */ - t.Log("### Starting Round 1") incrementRound(vs2, vs3, vs4) round++ cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) @@ -1281,7 +1262,6 @@ func TestStateLock_DoesNotLockOnOldProposal(t *testing.T) { This ensures that cs1 will not lock on B. */ - t.Log("### Starting Round 0") startTestRound(ctx, cs1, height, round) ensureNewRound(t, newRoundCh, height, round) @@ -1315,7 +1295,6 @@ func TestStateLock_DoesNotLockOnOldProposal(t *testing.T) { cs1 saw a POL for the block it saw in round 0. We ensure that it does not lock on this block, since it did not see a proposal for it in this round. */ - t.Log("### Starting Round 1") round++ ensureNewRound(t, newRoundCh, height, round) @@ -1379,7 +1358,6 @@ func TestStateLock_POLSafety1(t *testing.T) { ensurePrecommit(t, voteCh, height, round) ensureNewTimeout(t, timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds()) - t.Log("### ONTO ROUND 1") incrementRound(vs2, vs3, vs4) round++ // moving to the next round cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) @@ -1407,8 +1385,6 @@ func TestStateLock_POLSafety1(t *testing.T) { require.Nil(t, rs.LockedBlock, "we should not be locked!") - t.Logf("new prop hash %v", fmt.Sprintf("%X", propBlock.Hash())) - // go to prevote, prevote for proposal block ensurePrevoteMatch(t, voteCh, height, round, r2BlockID.Hash) @@ -1428,7 +1404,6 @@ func TestStateLock_POLSafety1(t *testing.T) { ensureNewRound(t, newRoundCh, height, round) - t.Log("### ONTO ROUND 2") /*Round3 we see the polka from round 1 but we shouldn't unlock! */ @@ -1494,7 +1469,7 @@ func TestStateLock_POLSafety2(t *testing.T) { incrementRound(vs2, vs3, vs4) round++ // moving to the next round - t.Log("### ONTO Round 1") + // jump in at round 1 startTestRound(ctx, cs1, height, round) ensureNewRound(t, newRoundCh, height, round) @@ -1536,7 +1511,7 @@ func TestStateLock_POLSafety2(t *testing.T) { addVotes(cs1, prevotes...) ensureNewRound(t, newRoundCh, height, round) - t.Log("### ONTO Round 2") + /*Round2 // now we see the polka from round 1, but we shouldnt unlock */ @@ -1579,7 +1554,6 @@ func TestState_PrevotePOLFromPreviousRound(t *testing.T) { This ensures that cs1 will lock on B in this round but not precommit it. */ - t.Log("### Starting Round 0") startTestRound(ctx, cs1, height, round) @@ -1617,14 +1591,16 @@ func TestState_PrevotePOLFromPreviousRound(t *testing.T) { cs1 has now seen greater than 2/3 of the voting power prevote D in this round but cs1 did not see the proposal for D in this round so it will not prevote or precommit it. */ - t.Log("### Starting Round 1") + incrementRound(vs2, vs3, vs4) round++ // Generate a new proposal block. cs2 := newState(ctx, t, logger, cs1.state, vs2, kvstore.NewApplication()) cs2.ValidRound = 1 propR1, propBlockR1 := decideProposal(ctx, t, cs2, vs2, vs2.Height, round) - t.Log(propR1.POLRound) + + assert.EqualValues(t, 1, propR1.POLRound) + propBlockR1Parts, err := propBlockR1.MakePartSet(partSize) require.NoError(t, err) r1BlockID := types.BlockID{ @@ -1658,7 +1634,6 @@ func TestState_PrevotePOLFromPreviousRound(t *testing.T) { Send cs1 prevotes for nil and check that it still prevotes its locked block and not the block that it prevoted. */ - t.Log("### Starting Round 2") incrementRound(vs2, vs3, vs4) round++ propR2 := types.NewProposal(height, round, 1, r1BlockID, propBlockR1.Header.Time) @@ -1745,7 +1720,6 @@ func TestProposeValidBlock(t *testing.T) { round++ // moving to the next round ensureNewRound(t, newRoundCh, height, round) - t.Log("### ONTO ROUND 1") // timeout of propose ensureNewTimeout(t, timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) @@ -1768,7 +1742,6 @@ func TestProposeValidBlock(t *testing.T) { round += 2 // increment by multiple rounds ensureNewRound(t, newRoundCh, height, round) - t.Log("### ONTO ROUND 3") ensureNewTimeout(t, timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds()) @@ -1940,7 +1913,11 @@ func TestProcessProposalAccept(t *testing.T) { defer cancel() m := abcimocks.NewBaseMock() - m.On("ProcessProposal", mock.Anything).Return(abcitypes.ResponseProcessProposal{Accept: testCase.accept}) + status := abci.ResponseProcessProposal_REJECT + if testCase.accept { + status = abci.ResponseProcessProposal_ACCEPT + } + m.On("ProcessProposal", mock.Anything).Return(abci.ResponseProcessProposal{Status: status}) cs1, _ := makeState(ctx, t, makeStateArgs{config: config, application: m}) height, round := cs1.Height, cs1.Round @@ -1988,11 +1965,11 @@ func TestFinalizeBlockCalled(t *testing.T) { defer cancel() m := abcimocks.NewBaseMock() - m.On("ProcessProposal", mock.Anything).Return(abcitypes.ResponseProcessProposal{Accept: true}) - m.On("VerifyVoteExtension", mock.Anything).Return(abcitypes.ResponseVerifyVoteExtension{ - Result: abcitypes.ResponseVerifyVoteExtension_ACCEPT, + m.On("ProcessProposal", mock.Anything).Return(abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT}) + m.On("VerifyVoteExtension", mock.Anything).Return(abci.ResponseVerifyVoteExtension{ + Status: abci.ResponseVerifyVoteExtension_ACCEPT, }) - m.On("FinalizeBlock", mock.Anything).Return(abcitypes.ResponseFinalizeBlock{}).Maybe() + m.On("FinalizeBlock", mock.Anything).Return(abci.ResponseFinalizeBlock{}).Maybe() cs1, vss := makeState(ctx, t, makeStateArgs{config: config, application: m}) height, round := cs1.Height, cs1.Round @@ -2470,7 +2447,6 @@ func TestStateHalt1(t *testing.T) { ensureNewRound(t, newRoundCh, height, round) - t.Log("### ONTO ROUND 1") /*Round2 // we timeout and prevote // a polka happened but we didn't see it! diff --git a/internal/state/errors.go b/internal/state/errors.go index 6e0cdfa47..e8ad776f4 100644 --- a/internal/state/errors.go +++ b/internal/state/errors.go @@ -39,6 +39,7 @@ type ( ErrNoValSetForHeight struct { Height int64 + Err error } ErrNoConsensusParamsForHeight struct { @@ -89,9 +90,14 @@ func (e ErrStateMismatch) Error() string { } func (e ErrNoValSetForHeight) Error() string { - return fmt.Sprintf("could not find validator set for height #%d", e.Height) + if e.Err == nil { + return fmt.Sprintf("could not find validator set for height #%d", e.Height) + } + return fmt.Sprintf("could not find validator set for height #%d: %s", e.Height, e.Err.Error()) } +func (e ErrNoValSetForHeight) Unwrap() error { return e.Err } + func (e ErrNoConsensusParamsForHeight) Error() string { return fmt.Sprintf("could not find consensus params for height #%d", e.Height) } diff --git a/internal/state/execution.go b/internal/state/execution.go index e8c8c0f58..7010010da 100644 --- a/internal/state/execution.go +++ b/internal/state/execution.go @@ -140,8 +140,11 @@ func (blockExec *BlockExecutor) CreateProposalBlock( // purpose for now. panic(err) } + if rpp.IsTxStatusUnknown() { + panic(fmt.Sprintf("PrepareProposal responded with ModifiedTxStatus %s", rpp.ModifiedTxStatus.String())) + } - if !rpp.ModifiedTx { + if !rpp.IsTxStatusModified() { return block, nil } txrSet := types.NewTxRecordSet(rpp.TxRecords) @@ -181,8 +184,11 @@ func (blockExec *BlockExecutor) ProcessProposal( if err != nil { return false, ErrInvalidBlock(err) } + if resp.IsStatusUnknown() { + panic(fmt.Sprintf("ProcessProposal responded with status %s", resp.Status.String())) + } - return resp.Accept, nil + return resp.IsAccepted(), nil } // ValidateBlock validates the given block against the given state. diff --git a/internal/state/execution_test.go b/internal/state/execution_test.go index b5c4e0975..6f2c7e87c 100644 --- a/internal/state/execution_test.go +++ b/internal/state/execution_test.go @@ -338,7 +338,7 @@ func TestProcessProposal(t *testing.T) { }, } - app.On("ProcessProposal", mock.Anything).Return(abci.ResponseProcessProposal{Accept: true}) + app.On("ProcessProposal", mock.Anything).Return(abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT}) acceptBlock, err := blockExec.ProcessProposal(ctx, block1, state) require.NoError(t, err) require.True(t, acceptBlock) @@ -615,6 +615,9 @@ 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) cc := abciclient.NewLocalClient(logger, app) proxyApp := proxy.New(cc, logger, proxy.NopMetrics()) err := proxyApp.Start(ctx) @@ -674,7 +677,7 @@ func TestPrepareProposalPanicOnInvalid(t *testing.T) { // create an invalid ResponsePrepareProposal rpp := abci.ResponsePrepareProposal{ - ModifiedTx: true, + ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, TxRecords: []*abci.TxRecord{ { Action: abci.TxRecord_REMOVED, @@ -737,8 +740,8 @@ func TestPrepareProposalRemoveTxs(t *testing.T) { app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTx: true, - TxRecords: trs, + ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, + TxRecords: trs, }, nil) cc := abciclient.NewLocalClient(logger, app) @@ -798,8 +801,8 @@ func TestPrepareProposalAddedTxsIncluded(t *testing.T) { app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTx: true, - TxRecords: trs, + ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, + TxRecords: trs, }, nil) cc := abciclient.NewLocalClient(logger, app) @@ -856,8 +859,8 @@ func TestPrepareProposalReorderTxs(t *testing.T) { app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTx: true, - TxRecords: trs, + ModifiedTxStatus: abci.ResponsePrepareProposal_MODIFIED, + TxRecords: trs, }, nil) cc := abciclient.NewLocalClient(logger, app) @@ -886,10 +889,10 @@ func TestPrepareProposalReorderTxs(t *testing.T) { } -// TestPrepareProposalModifiedTxFalse tests that CreateBlock correctly ignores +// TestPrepareProposalModifiedTxStatusFalse tests that CreateBlock correctly ignores // the ResponsePrepareProposal TxRecords if ResponsePrepareProposal does not -// set ModifiedTx to true. -func TestPrepareProposalModifiedTxFalse(t *testing.T) { +// set ModifiedTxStatus to true. +func TestPrepareProposalModifiedTxStatusFalse(t *testing.T) { const height = 2 ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -919,8 +922,8 @@ func TestPrepareProposalModifiedTxFalse(t *testing.T) { app := abcimocks.NewBaseMock() app.On("PrepareProposal", mock.Anything).Return(abci.ResponsePrepareProposal{ - ModifiedTx: false, - TxRecords: trs, + ModifiedTxStatus: abci.ResponsePrepareProposal_UNMODIFIED, + TxRecords: trs, }, nil) cc := abciclient.NewLocalClient(logger, app) diff --git a/internal/state/helpers_test.go b/internal/state/helpers_test.go index dffb6f256..1e0187247 100644 --- a/internal/state/helpers_test.go +++ b/internal/state/helpers_test.go @@ -320,8 +320,8 @@ func (app *testApp) Query(reqQuery abci.RequestQuery) (resQuery abci.ResponseQue func (app *testApp) ProcessProposal(req abci.RequestProcessProposal) abci.ResponseProcessProposal { for _, tx := range req.Txs { if len(tx) == 0 { - return abci.ResponseProcessProposal{Accept: false} + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_REJECT} } } - return abci.ResponseProcessProposal{Accept: true} + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT} } diff --git a/internal/state/store.go b/internal/state/store.go index 93bd3eb2b..87f5e0c4f 100644 --- a/internal/state/store.go +++ b/internal/state/store.go @@ -488,7 +488,7 @@ func (store dbStore) LoadValidators(height int64) (*types.ValidatorSet, error) { valInfo, err := loadValidatorsInfo(store.db, height) if err != nil { - return nil, ErrNoValSetForHeight{height} + return nil, ErrNoValSetForHeight{Height: height, Err: err} } if valInfo.ValidatorSet == nil { lastStoredHeight := lastStoredHeightFor(height, valInfo.LastHeightChanged) diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index c65e13f3e..53742c41e 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -21,25 +21,25 @@ import "gogoproto/gogo.proto"; message Request { oneof value { - RequestEcho echo = 1; - RequestFlush flush = 2; - RequestInfo info = 3; - RequestInitChain init_chain = 4; - RequestQuery query = 5; - RequestBeginBlock begin_block = 6 [deprecated = true]; - RequestCheckTx check_tx = 7; - RequestDeliverTx deliver_tx = 8 [deprecated = true]; - RequestEndBlock end_block = 9 [deprecated = true]; - RequestCommit commit = 10; - RequestListSnapshots list_snapshots = 11; - RequestOfferSnapshot offer_snapshot = 12; - RequestLoadSnapshotChunk load_snapshot_chunk = 13; - RequestApplySnapshotChunk apply_snapshot_chunk = 14; - RequestPrepareProposal prepare_proposal = 15; - RequestProcessProposal process_proposal = 16; + RequestEcho echo = 1; + RequestFlush flush = 2; + RequestInfo info = 3; + RequestInitChain init_chain = 4; + RequestQuery query = 5; + RequestBeginBlock begin_block = 6 [deprecated = true]; + RequestCheckTx check_tx = 7; + RequestDeliverTx deliver_tx = 8 [deprecated = true]; + RequestEndBlock end_block = 9 [deprecated = true]; + RequestCommit commit = 10; + RequestListSnapshots list_snapshots = 11; + RequestOfferSnapshot offer_snapshot = 12; + RequestLoadSnapshotChunk load_snapshot_chunk = 13; + RequestApplySnapshotChunk apply_snapshot_chunk = 14; + RequestPrepareProposal prepare_proposal = 15; + RequestProcessProposal process_proposal = 16; RequestExtendVote extend_vote = 17; RequestVerifyVoteExtension verify_vote_extension = 18; - RequestFinalizeBlock finalize_block = 19; + RequestFinalizeBlock finalize_block = 19; } } @@ -169,26 +169,26 @@ message RequestFinalizeBlock { message Response { oneof value { - ResponseException exception = 1; - ResponseEcho echo = 2; - ResponseFlush flush = 3; - ResponseInfo info = 4; - ResponseInitChain init_chain = 5; - ResponseQuery query = 6; - ResponseBeginBlock begin_block = 7 [deprecated = true]; - ResponseCheckTx check_tx = 8; - ResponseDeliverTx deliver_tx = 9 [deprecated = true]; - ResponseEndBlock end_block = 10 [deprecated = true]; - ResponseCommit commit = 11; - ResponseListSnapshots list_snapshots = 12; - ResponseOfferSnapshot offer_snapshot = 13; - ResponseLoadSnapshotChunk load_snapshot_chunk = 14; - ResponseApplySnapshotChunk apply_snapshot_chunk = 15; - ResponsePrepareProposal prepare_proposal = 16; - ResponseProcessProposal process_proposal = 17; + ResponseException exception = 1; + ResponseEcho echo = 2; + ResponseFlush flush = 3; + ResponseInfo info = 4; + ResponseInitChain init_chain = 5; + ResponseQuery query = 6; + ResponseBeginBlock begin_block = 7 [deprecated = true]; + ResponseCheckTx check_tx = 8; + ResponseDeliverTx deliver_tx = 9 [deprecated = true]; + ResponseEndBlock end_block = 10 [deprecated = true]; + ResponseCommit commit = 11; + ResponseListSnapshots list_snapshots = 12; + ResponseOfferSnapshot offer_snapshot = 13; + ResponseLoadSnapshotChunk load_snapshot_chunk = 14; + ResponseApplySnapshotChunk apply_snapshot_chunk = 15; + ResponsePrepareProposal prepare_proposal = 16; + ResponseProcessProposal process_proposal = 17; ResponseExtendVote extend_vote = 18; ResponseVerifyVoteExtension verify_vote_extension = 19; - ResponseFinalizeBlock finalize_block = 20; + ResponseFinalizeBlock finalize_block = 20; } } @@ -316,20 +316,32 @@ message ResponseApplySnapshotChunk { } message ResponsePrepareProposal { - bool modified_tx = 1; + 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; + } } message ResponseProcessProposal { - bool accept = 1; + ProposalStatus status = 1; bytes app_hash = 2; repeated ExecTxResult tx_results = 3; repeated ValidatorUpdate validator_updates = 4; tendermint.types.ConsensusParams consensus_param_updates = 5; + + enum ProposalStatus { + UNKNOWN = 0; + ACCEPT = 1; + REJECT = 2; + } } message ResponseExtendVote { @@ -337,7 +349,13 @@ message ResponseExtendVote { } message ResponseVerifyVoteExtension { - bool accept = 1; + VerifyStatus status = 1; + + enum VerifyStatus { + UNKNOWN = 0; + ACCEPT = 1; + REJECT = 2; + } } message ResponseFinalizeBlock { @@ -388,7 +406,7 @@ message ExecTxResult { string info = 4; // nondeterministic int64 gas_wanted = 5; int64 gas_used = 6; - repeated Event events = 7 + repeated Event events = 7 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; // nondeterministic string codespace = 8; } @@ -404,8 +422,8 @@ message TxResult { } message TxRecord { - TxAction action = 1; - bytes tx = 2; + TxAction action = 1; + bytes tx = 2; // TxAction contains App-provided information on what to do with a transaction that is part of a raw proposal enum TxAction { diff --git a/proto/tendermint/abci/types.proto.intermediate b/proto/tendermint/abci/types.proto.intermediate index d710ed06f..cf77d25ea 100644 --- a/proto/tendermint/abci/types.proto.intermediate +++ b/proto/tendermint/abci/types.proto.intermediate @@ -123,16 +123,6 @@ message RequestApplySnapshotChunk { string sender = 3; } -// Extends a vote with application-side injection -message RequestExtendVote { - types.Vote vote = 1; -} - -// Verify the vote extension -message RequestVerifyVoteExtension { - types.Vote vote = 1; -} - message RequestPrepareProposal { bytes hash = 1; tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; @@ -153,6 +143,16 @@ message RequestProcessProposal { repeated Evidence byzantine_validators = 5 [(gogoproto.nullable) = false]; } +// Extends a vote with application-side injection +message RequestExtendVote { + types.Vote vote = 1; +} + +// Verify the vote extension +message RequestVerifyVoteExtension { + types.Vote vote = 1; +} + message RequestFinalizeBlock { bytes hash = 1; tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; @@ -312,36 +312,47 @@ message ResponseApplySnapshotChunk { } } -message ResponseExtendVote { - tendermint.types.VoteExtension vote_extension = 1; -} - -message ResponseVerifyVoteExtension { - Result result = 1; - - enum Result { - UNKNOWN = 0; // Unknown result, reject vote extension - ACCEPT = 1; // Vote extension verified, include the vote - SLASH = 2; // Vote extension verification aborted, continue but slash validator - REJECT = 3; // Vote extension invalidated - } -} - message ResponsePrepareProposal { - bool modified_tx = 1; + 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; + } } message ResponseProcessProposal { - bool accept = 1; + ProposalStatus status = 1; bytes app_hash = 2; repeated ExecTxResult tx_results = 3; repeated ValidatorUpdate validator_updates = 4; tendermint.types.ConsensusParams consensus_param_updates = 5; + + enum ProposalStatus { + UNKNOWN = 0; + ACCEPT = 1; + REJECT = 2; + } +} + +message ResponseExtendVote { + tendermint.types.VoteExtension vote_extension = 1; +} + +message ResponseVerifyVoteExtension { + VerifyStatus status = 1; + + enum VerifyStatus { + UNKNOWN = 0; + ACCEPT = 1; + REJECT = 2; + } } message ResponseFinalizeBlock { diff --git a/scripts/abci-gen.sh b/scripts/abci-gen.sh index fe3728ad4..f4666dee9 100755 --- a/scripts/abci-gen.sh +++ b/scripts/abci-gen.sh @@ -18,8 +18,6 @@ sh ./scripts/protopackage.sh ./proto/tendermint/abci/types.proto $MODNAME "abci/ make proto-gen -mv ./proto/tendermint/abci/types.pb.go ./abci/types - echo "proto files have been compiled" echo "checking out copied files" diff --git a/spec/abci++/abci++_methods_002_draft.md b/spec/abci++/abci++_methods_002_draft.md index 4114bb9b8..cd7fb5961 100644 --- a/spec/abci++/abci++_methods_002_draft.md +++ b/spec/abci++/abci++_methods_002_draft.md @@ -298,7 +298,7 @@ title: Methods | Name | Type | Description | Field Number | |-------------------------|--------------------------------------------------|---------------------------------------------------------------------------------------------|--------------| - | modified_tx | bool | The Application sets it to true to denote it made changes to transactions | 1 | + | 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,15 +311,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` to true. + * 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 "REMOVE". 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. + * 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 `REMOVE`. 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 modifies the set of transactions, the modified transactions MUST NOT exceed the configured maximum size `RequestPrepareProposal.max_tx_bytes`. - * If the Application does not modify the preliminary set of transactions `txs`, then it sets `ResponsePrepareProposal.modified_tx` to false. In this case, Tendermint will ignore the contents of `ResponsePrepareProposal.tx_records`. + * 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`. * 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. @@ -348,12 +348,10 @@ title: Methods * As a sanity check, Tendermint will check the returned parameters for validity if the Application modified them. In particular, `ResponsePrepareProposal.tx_records` will be deemed invalid if * There is a duplicate transaction in the list. - * A new or modified transaction is marked as "TXUNMODIFIED" or "TXREMOVED". - * An unmodified transaction is marked as "TXADDED". - * A transaction is marked as "TXUNKNOWN". - * If Tendermint's sanity checks on the parameters of `ResponsePrepareProposal` fails, then it will drop the proposal - and proceed to the next round (thus simulating a network loss/delay of the proposal). - * **TODO**: [From discussion with William] Another possibility here is to panic. What do folks think we should do here? + * A new or modified transaction is marked as `UNMODIFIED` or `REMOVED`. + * An unmodified transaction is marked as `ADDED`. + * A transaction is marked as `UNKNOWN`. + * If Tendermint fails to validate the `ResponsePrepareProposal`, Tendermint will assume the application is faulty and crash. * The implementation of `PrepareProposal` can be non-deterministic. #### When does Tendermint call it? @@ -411,7 +409,7 @@ Note that, if _p_ has a non-`nil` _validValue_, Tendermint will use it as propos | Name | Type | Description | Field Number | |-------------------------|--------------------------------------------------|-----------------------------------------------------------------------------------|--------------| - | accept | bool | If false, the received block failed verification. | 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 | @@ -432,25 +430,23 @@ Note that, if _p_ has a non-`nil` _validValue_, Tendermint will use it as propos and _ConsensusHash_ refer to the **same** block being passed in the `Request*` call to this method (data was provided by the call to `ResponsePrepareProposal` at the current height that resulted in the block being passed in the `Request*` call to this method) - * If `ResponseProcessProposal.accept` is _false_, Tendermint assumes the proposal received + * If `ResponseProcessProposal.status` is `REJECT`, Tendermint assumes the proposal received is not valid. * In same-block execution mode, the Application is required to fully execute the block and provide values for parameters `ResponseProcessProposal.app_hash`, `ResponseProcessProposal.tx_results`, `ResponseProcessProposal.validator_updates`, and `ResponseProcessProposal.consensus_param_updates`, so that Tendermint can then verify the hashes in the block's header are correct. - If the hashes mismatch, Tendermint will reject the block even if `ResponseProcessProposal.accept` - was set to _true_. + If the hashes mismatch, Tendermint will reject the block even if `ResponseProcessProposal.status` + was set to `ACCEPT`. * In next-block execution mode, the Application should *not* provide values for parameters `ResponseProcessProposal.app_hash`, `ResponseProcessProposal.tx_results`, `ResponseProcessProposal.validator_updates`, and `ResponseProcessProposal.consensus_param_updates`. * The implementation of `ProcessProposal` MUST be deterministic. Moreover, the value of - `ResponseProcessProposal.accept` MUST **exclusively** depend on the parameters passed in + `ResponseProcessProposal.status` MUST **exclusively** depend on the parameters passed in the call to `RequestProcessProposal`, and the last committed Application state (see [Requirements](abci++_app_requirements_002_draft.md) section). - * Moreover, application implementors SHOULD always set `ResponseProcessProposal.accept` to _true_, - unless they _really_ know what the potential liveness implications of returning _false_ are. - ->**TODO**: should `ResponseProcessProposal.accept` be of type `Result` rather than `bool`? (so we are able to extend the possible values in the future?) + * Moreover, application implementors SHOULD always set `ResponseProcessProposal.status` to `ACCEPT`, + unless they _really_ know what the potential liveness implications of returning `REJECT` are. #### When does Tendermint call it? @@ -537,20 +533,20 @@ a [CanonicalVoteExtension](#canonicalvoteextension) field in the `precommit nil` * **Response**: - | Name | Type | Description | Field Number | - |--------|------|-------------------------------------------------------|--------------| - | accept | bool | If false, Application is rejecting the vote extension | 1 | + | Name | Type | Description | Field Number | + |--------|-------------------------------|----------------------------------------------------------------|--------------| + | status | [VerifyStatus](#VerifyStatus) | `enum` signaling if the application accepts the vote extension | 1 | * **Usage**: - * If `ResponseVerifyVoteExtension.accept` is _false_, Tendermint will reject the whole received vote. + * If `ResponseVerifyVoteExtension.status` is `REJECT`, Tendermint will reject the whole received vote. See the [Requirements](abci++_app_requirements_002_draft.md) section to understand the potential liveness implications of this. * The implementation of `VerifyVoteExtension` MUST be deterministic. Moreover, the value of - `ResponseVerifyVoteExtension.accept` MUST **exclusively** depend on the parameters passed in + `ResponseVerifyVoteExtension.status` MUST **exclusively** depend on the parameters passed in the call to `RequestVerifyVoteExtension`, and the last committed Application state (see [Requirements](abci++_app_requirements_002_draft.md) section). - * Moreover, application implementors SHOULD always set `ResponseVerifyVoteExtension.accept` to _true_, - unless they _really_ know what the potential liveness implications of returning _false_ are. + * Moreover, application implementers SHOULD always set `ResponseVerifyVoteExtension.status` to `ACCEPT`, + unless they _really_ know what the potential liveness implications of returning `REJECT` are. #### When does Tendermint call it? @@ -558,7 +554,7 @@ When a validator _p_ is in Tendermint consensus round _r_, height _h_, state _pr from this condition, but not sure), and _p_ receives a Precommit message for round _r_, height _h_ from _q_: 1. _p_'s Tendermint calls `RequestVerifyVoteExtension`. -2. The Application returns _accept_ or _reject_ via `ResponseVerifyVoteExtension.accept`. +2. The Application returns _accept_ or _reject_ via `ResponseVerifyVoteExtension.status`. 3. If the Application returns * _accept_, _p_'s Tendermint will keep the received vote, together with its corresponding vote extension in its internal data structures. It will be used to populate the [ExtendedCommitInfo](#extendedcommitinfo) @@ -832,20 +828,20 @@ Most of the data structures used in ABCI are shared [common data structures](../ ### TxAction -```protobuf - enum TxAction { - TXUNKNOWN = 0; // Unknown action - TXUNMODIFIED = 1; // The Application did not modify this transaction. - TXADDED = 2; // The Application added this transaction. - TXREMOVED = 3; // The Application wants this transaction removed from the proposal and the mempool. - } +```proto +enum TxAction { + UNKNOWN = 0; // Unknown action + UNMODIFIED = 1; // The Application did not modify this transaction. + ADDED = 2; // The Application added this transaction. + REMOVED = 3; // The Application wants this transaction removed from the proposal and the mempool. +} ``` * **Usage**: - * If `Action` is TXUNKNOWN, a problem happened in the Application. Tendermint will ignore this transaction. **TODO** should we panic? - * If `Action` is TXUNMODIFIED, Tendermint includes the transaction in the proposal. Nothing to do on the mempool. - * If `Action` is TXADDED, Tendermint includes the transaction in the proposal. The transaction is also added to the mempool and gossipped. - * If `Action` is TXREMOVED, Tendermint excludes the transaction from the proposal. The transaction is also removed from the mempool if it exists, + * If `Action` is `UNKNOWN`, a problem happened in the Application. Tendermint will assume the application is faulty and crash. + * If `Action` is `UNMODIFIED`, Tendermint includes the transaction in the proposal. Nothing to do on the mempool. + * If `Action` is `ADDED`, Tendermint includes the transaction in the proposal. The transaction is also added to the mempool and gossipped. + * 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 @@ -856,6 +852,55 @@ Most of the data structures used in ABCI are shared [common data structures](../ | action | [TxAction](#txaction) | What should Tendermint do with this transaction? | 1 | | tx | bytes | Transaction contents | 2 | +### ProposalStatus + +```proto +enum ProposalStatus { + UNKNOWN = 0; // Unknown status. Returning this from the application is always an error. + ACCEPT = 1; // Status that signals that the application finds the proposal valid. + REJECT = 2; // Status that signals that the application finds the proposal invalid. +} +``` + +* **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. + +### VerifyStatus + +```proto +enum VerifyStatus { + UNKNOWN = 0; // Unknown status. Returning this from the application is always an error. + ACCEPT = 1; // Status that signals that the application finds the vote extension valid. + REJECT = 2; // Status that signals that the application finds the vote extension invalid. +} +``` + +* **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. + + ### CanonicalVoteExtension >**TODO**: This protobuf message definition is not part of the ABCI++ interface, but rather belongs to the diff --git a/test/e2e/app/app.go b/test/e2e/app/app.go index 5739f06e5..1ed1055ca 100644 --- a/test/e2e/app/app.go +++ b/test/e2e/app/app.go @@ -306,7 +306,7 @@ 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{ModifiedTx: false} + return abci.ResponsePrepareProposal{ModifiedTxStatus: abci.ResponsePrepareProposal_UNMODIFIED} } // ProcessProposal implements part of the Application interface. @@ -315,10 +315,10 @@ func (app *Application) ProcessProposal(req abci.RequestProcessProposal) abci.Re for _, tx := range req.Txs { _, _, err := parseTx(tx) if err != nil { - return abci.ResponseProcessProposal{Accept: false} + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_REJECT} } } - return abci.ResponseProcessProposal{Accept: true} + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT} } func (app *Application) Rollback() error {