diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index d1eb779fea..66631d2c7a 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -10,6 +10,7 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + _ "github.com/golang/protobuf/ptypes/duration" crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" types1 "github.com/tendermint/tendermint/proto/tendermint/types" grpc "google.golang.org/grpc" @@ -120,7 +121,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32, 0} + return fileDescriptor_252557cfdd89a31a, []int{33, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -157,7 +158,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34, 0} + return fileDescriptor_252557cfdd89a31a, []int{35, 0} } type ResponseProcessProposal_Result int32 @@ -185,7 +186,7 @@ func (x ResponseProcessProposal_Result) String() string { } func (ResponseProcessProposal_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36, 0} + return fileDescriptor_252557cfdd89a31a, []int{37, 0} } type Request struct { @@ -548,6 +549,58 @@ func (m *RequestFlush) XXX_DiscardUnknown() { var xxx_messageInfo_RequestFlush proto.InternalMessageInfo +type TimeoutsInfo struct { + TimeoutPropose time.Duration `protobuf:"bytes,1,opt,name=timeout_propose,json=timeoutPropose,proto3,stdduration" json:"timeout_propose"` + TimeoutCommit time.Duration `protobuf:"bytes,2,opt,name=timeout_commit,json=timeoutCommit,proto3,stdduration" json:"timeout_commit"` +} + +func (m *TimeoutsInfo) Reset() { *m = TimeoutsInfo{} } +func (m *TimeoutsInfo) String() string { return proto.CompactTextString(m) } +func (*TimeoutsInfo) ProtoMessage() {} +func (*TimeoutsInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{3} +} +func (m *TimeoutsInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TimeoutsInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TimeoutsInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TimeoutsInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TimeoutsInfo.Merge(m, src) +} +func (m *TimeoutsInfo) XXX_Size() int { + return m.Size() +} +func (m *TimeoutsInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TimeoutsInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_TimeoutsInfo proto.InternalMessageInfo + +func (m *TimeoutsInfo) GetTimeoutPropose() time.Duration { + if m != nil { + return m.TimeoutPropose + } + return 0 +} + +func (m *TimeoutsInfo) GetTimeoutCommit() time.Duration { + if m != nil { + return m.TimeoutCommit + } + return 0 +} + type RequestInfo struct { Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` BlockVersion uint64 `protobuf:"varint,2,opt,name=block_version,json=blockVersion,proto3" json:"block_version,omitempty"` @@ -558,7 +611,7 @@ func (m *RequestInfo) Reset() { *m = RequestInfo{} } func (m *RequestInfo) String() string { return proto.CompactTextString(m) } func (*RequestInfo) ProtoMessage() {} func (*RequestInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{3} + return fileDescriptor_252557cfdd89a31a, []int{4} } func (m *RequestInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -618,7 +671,7 @@ func (m *RequestSetOption) Reset() { *m = RequestSetOption{} } func (m *RequestSetOption) String() string { return proto.CompactTextString(m) } func (*RequestSetOption) ProtoMessage() {} func (*RequestSetOption) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{4} + return fileDescriptor_252557cfdd89a31a, []int{5} } func (m *RequestSetOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -674,7 +727,7 @@ func (m *RequestInitChain) Reset() { *m = RequestInitChain{} } func (m *RequestInitChain) String() string { return proto.CompactTextString(m) } func (*RequestInitChain) ProtoMessage() {} func (*RequestInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{5} + return fileDescriptor_252557cfdd89a31a, []int{6} } func (m *RequestInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -756,7 +809,7 @@ func (m *RequestQuery) Reset() { *m = RequestQuery{} } func (m *RequestQuery) String() string { return proto.CompactTextString(m) } func (*RequestQuery) ProtoMessage() {} func (*RequestQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{6} + return fileDescriptor_252557cfdd89a31a, []int{7} } func (m *RequestQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -824,7 +877,7 @@ func (m *RequestBeginBlock) Reset() { *m = RequestBeginBlock{} } func (m *RequestBeginBlock) String() string { return proto.CompactTextString(m) } func (*RequestBeginBlock) ProtoMessage() {} func (*RequestBeginBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{7} + return fileDescriptor_252557cfdd89a31a, []int{8} } func (m *RequestBeginBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -890,7 +943,7 @@ func (m *RequestCheckTx) Reset() { *m = RequestCheckTx{} } func (m *RequestCheckTx) String() string { return proto.CompactTextString(m) } func (*RequestCheckTx) ProtoMessage() {} func (*RequestCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{8} + return fileDescriptor_252557cfdd89a31a, []int{9} } func (m *RequestCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -941,7 +994,7 @@ func (m *RequestDeliverTx) Reset() { *m = RequestDeliverTx{} } func (m *RequestDeliverTx) String() string { return proto.CompactTextString(m) } func (*RequestDeliverTx) ProtoMessage() {} func (*RequestDeliverTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{9} + return fileDescriptor_252557cfdd89a31a, []int{10} } func (m *RequestDeliverTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -985,7 +1038,7 @@ func (m *RequestEndBlock) Reset() { *m = RequestEndBlock{} } func (m *RequestEndBlock) String() string { return proto.CompactTextString(m) } func (*RequestEndBlock) ProtoMessage() {} func (*RequestEndBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{10} + return fileDescriptor_252557cfdd89a31a, []int{11} } func (m *RequestEndBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1028,7 +1081,7 @@ func (m *RequestCommit) Reset() { *m = RequestCommit{} } func (m *RequestCommit) String() string { return proto.CompactTextString(m) } func (*RequestCommit) ProtoMessage() {} func (*RequestCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{11} + return fileDescriptor_252557cfdd89a31a, []int{12} } func (m *RequestCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1065,7 +1118,7 @@ func (m *RequestListSnapshots) Reset() { *m = RequestListSnapshots{} } func (m *RequestListSnapshots) String() string { return proto.CompactTextString(m) } func (*RequestListSnapshots) ProtoMessage() {} func (*RequestListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{12} + return fileDescriptor_252557cfdd89a31a, []int{13} } func (m *RequestListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1105,7 +1158,7 @@ func (m *RequestOfferSnapshot) Reset() { *m = RequestOfferSnapshot{} } func (m *RequestOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*RequestOfferSnapshot) ProtoMessage() {} func (*RequestOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{13} + return fileDescriptor_252557cfdd89a31a, []int{14} } func (m *RequestOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1166,7 +1219,7 @@ func (m *RequestLoadSnapshotChunk) Reset() { *m = RequestLoadSnapshotChu func (m *RequestLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*RequestLoadSnapshotChunk) ProtoMessage() {} func (*RequestLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{14} + return fileDescriptor_252557cfdd89a31a, []int{15} } func (m *RequestLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1227,7 +1280,7 @@ func (m *RequestApplySnapshotChunk) Reset() { *m = RequestApplySnapshotC func (m *RequestApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*RequestApplySnapshotChunk) ProtoMessage() {} func (*RequestApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{15} + return fileDescriptor_252557cfdd89a31a, []int{16} } func (m *RequestApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1298,7 +1351,7 @@ func (m *RequestPrepareProposal) Reset() { *m = RequestPrepareProposal{} func (m *RequestPrepareProposal) String() string { return proto.CompactTextString(m) } func (*RequestPrepareProposal) ProtoMessage() {} func (*RequestPrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{16} + return fileDescriptor_252557cfdd89a31a, []int{17} } func (m *RequestPrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1371,7 +1424,7 @@ func (m *RequestProcessProposal) Reset() { *m = RequestProcessProposal{} func (m *RequestProcessProposal) String() string { return proto.CompactTextString(m) } func (*RequestProcessProposal) ProtoMessage() {} func (*RequestProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{17} + return fileDescriptor_252557cfdd89a31a, []int{18} } func (m *RequestProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1442,7 +1495,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{18} + return fileDescriptor_252557cfdd89a31a, []int{19} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1717,7 +1770,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{19} + return fileDescriptor_252557cfdd89a31a, []int{20} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1761,7 +1814,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} + return fileDescriptor_252557cfdd89a31a, []int{21} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1804,7 +1857,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1834,18 +1887,19 @@ func (m *ResponseFlush) XXX_DiscardUnknown() { var xxx_messageInfo_ResponseFlush proto.InternalMessageInfo type ResponseInfo struct { - Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` - AppVersion uint64 `protobuf:"varint,3,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"` - LastBlockHeight int64 `protobuf:"varint,4,opt,name=last_block_height,json=lastBlockHeight,proto3" json:"last_block_height,omitempty"` - LastBlockAppHash []byte `protobuf:"bytes,5,opt,name=last_block_app_hash,json=lastBlockAppHash,proto3" json:"last_block_app_hash,omitempty"` + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + AppVersion uint64 `protobuf:"varint,3,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"` + LastBlockHeight int64 `protobuf:"varint,4,opt,name=last_block_height,json=lastBlockHeight,proto3" json:"last_block_height,omitempty"` + LastBlockAppHash []byte `protobuf:"bytes,5,opt,name=last_block_app_hash,json=lastBlockAppHash,proto3" json:"last_block_app_hash,omitempty"` + Timeouts TimeoutsInfo `protobuf:"bytes,6,opt,name=timeouts,proto3" json:"timeouts"` } func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1909,6 +1963,13 @@ func (m *ResponseInfo) GetLastBlockAppHash() []byte { return nil } +func (m *ResponseInfo) GetTimeouts() TimeoutsInfo { + if m != nil { + return m.Timeouts + } + return TimeoutsInfo{} +} + // nondeterministic type ResponseSetOption struct { Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` @@ -1921,7 +1982,7 @@ func (m *ResponseSetOption) Reset() { *m = ResponseSetOption{} } func (m *ResponseSetOption) String() string { return proto.CompactTextString(m) } func (*ResponseSetOption) ProtoMessage() {} func (*ResponseSetOption) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseSetOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1975,13 +2036,14 @@ type ResponseInitChain struct { ConsensusParams *ConsensusParams `protobuf:"bytes,1,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params,omitempty"` Validators []ValidatorUpdate `protobuf:"bytes,2,rep,name=validators,proto3" json:"validators"` AppHash []byte `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + Timeouts TimeoutsInfo `protobuf:"bytes,4,opt,name=timeouts,proto3" json:"timeouts"` } func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2031,6 +2093,13 @@ func (m *ResponseInitChain) GetAppHash() []byte { return nil } +func (m *ResponseInitChain) GetTimeouts() TimeoutsInfo { + if m != nil { + return m.Timeouts + } + return TimeoutsInfo{} +} + type ResponseQuery struct { Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // bytes data = 2; // use "value" instead. @@ -2048,7 +2117,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2148,7 +2217,7 @@ func (m *ResponseBeginBlock) Reset() { *m = ResponseBeginBlock{} } func (m *ResponseBeginBlock) String() string { return proto.CompactTextString(m) } func (*ResponseBeginBlock) ProtoMessage() {} func (*ResponseBeginBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseBeginBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2204,7 +2273,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2325,7 +2394,7 @@ func (m *ResponseDeliverTx) Reset() { *m = ResponseDeliverTx{} } func (m *ResponseDeliverTx) String() string { return proto.CompactTextString(m) } func (*ResponseDeliverTx) ProtoMessage() {} func (*ResponseDeliverTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseDeliverTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2414,13 +2483,14 @@ type ResponseEndBlock struct { ValidatorUpdates []ValidatorUpdate `protobuf:"bytes,1,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates"` ConsensusParamUpdates *ConsensusParams `protobuf:"bytes,2,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` Events []Event `protobuf:"bytes,3,rep,name=events,proto3" json:"events,omitempty"` + Timeouts TimeoutsInfo `protobuf:"bytes,4,opt,name=timeouts,proto3" json:"timeouts"` } func (m *ResponseEndBlock) Reset() { *m = ResponseEndBlock{} } func (m *ResponseEndBlock) String() string { return proto.CompactTextString(m) } func (*ResponseEndBlock) ProtoMessage() {} func (*ResponseEndBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseEndBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2470,6 +2540,13 @@ func (m *ResponseEndBlock) GetEvents() []Event { return nil } +func (m *ResponseEndBlock) GetTimeouts() TimeoutsInfo { + if m != nil { + return m.Timeouts + } + return TimeoutsInfo{} +} + type ResponseCommit struct { // reserve 1 Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` @@ -2480,7 +2557,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2531,7 +2608,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2575,7 +2652,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2619,7 +2696,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2665,7 +2742,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2723,7 +2800,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +2845,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2824,7 +2901,7 @@ func (m *ConsensusParams) Reset() { *m = ConsensusParams{} } func (m *ConsensusParams) String() string { return proto.CompactTextString(m) } func (*ConsensusParams) ProtoMessage() {} func (*ConsensusParams) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ConsensusParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2893,7 +2970,7 @@ func (m *BlockParams) Reset() { *m = BlockParams{} } func (m *BlockParams) String() string { return proto.CompactTextString(m) } func (*BlockParams) ProtoMessage() {} func (*BlockParams) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *BlockParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2945,7 +3022,7 @@ func (m *LastCommitInfo) Reset() { *m = LastCommitInfo{} } func (m *LastCommitInfo) String() string { return proto.CompactTextString(m) } func (*LastCommitInfo) ProtoMessage() {} func (*LastCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *LastCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3000,7 +3077,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3054,7 +3131,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3118,7 +3195,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3186,7 +3263,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3239,7 +3316,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3292,7 +3369,7 @@ func (m *VoteInfo) Reset() { *m = VoteInfo{} } func (m *VoteInfo) String() string { return proto.CompactTextString(m) } func (*VoteInfo) ProtoMessage() {} func (*VoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3353,7 +3430,7 @@ func (m *Evidence) Reset() { *m = Evidence{} } func (m *Evidence) String() string { return proto.CompactTextString(m) } func (*Evidence) ProtoMessage() {} func (*Evidence) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *Evidence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3429,7 +3506,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3502,6 +3579,7 @@ func init() { proto.RegisterType((*Request)(nil), "tendermint.abci.Request") proto.RegisterType((*RequestEcho)(nil), "tendermint.abci.RequestEcho") proto.RegisterType((*RequestFlush)(nil), "tendermint.abci.RequestFlush") + proto.RegisterType((*TimeoutsInfo)(nil), "tendermint.abci.TimeoutsInfo") proto.RegisterType((*RequestInfo)(nil), "tendermint.abci.RequestInfo") proto.RegisterType((*RequestSetOption)(nil), "tendermint.abci.RequestSetOption") proto.RegisterType((*RequestInitChain)(nil), "tendermint.abci.RequestInitChain") @@ -3552,196 +3630,201 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3017 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0xcd, 0x73, 0x23, 0xc5, - 0x15, 0xd7, 0xe8, 0x7b, 0x9e, 0xac, 0x0f, 0xf7, 0x2e, 0xbb, 0x62, 0x58, 0xec, 0x65, 0xb6, 0xf8, - 0x5a, 0xc0, 0x0e, 0xa6, 0x96, 0x40, 0x20, 0x01, 0x4b, 0xab, 0x45, 0x66, 0x8d, 0xed, 0x8c, 0xe5, - 0x25, 0x5f, 0xec, 0x30, 0x92, 0xda, 0xd2, 0xb0, 0xd2, 0xcc, 0x30, 0xd3, 0x32, 0xf6, 0x1e, 0x53, - 0x49, 0xa5, 0x42, 0x2e, 0x54, 0xe5, 0x92, 0x0b, 0x7f, 0x42, 0xee, 0xb9, 0x24, 0x97, 0x5c, 0xa8, - 0xca, 0x21, 0x1c, 0x73, 0x48, 0x91, 0x14, 0xe4, 0x94, 0x7f, 0x20, 0xa7, 0x54, 0x52, 0xfd, 0x31, - 0x5f, 0x92, 0xc6, 0x92, 0x21, 0xb7, 0xdc, 0xa6, 0xbb, 0xdf, 0x7b, 0x3d, 0xfd, 0xa6, 0xfb, 0xf7, - 0xde, 0xef, 0x4d, 0xc3, 0x63, 0x04, 0x5b, 0x7d, 0xec, 0x8e, 0x4d, 0x8b, 0x6c, 0x1a, 0xdd, 0x9e, - 0xb9, 0x49, 0xce, 0x1c, 0xec, 0x6d, 0x38, 0xae, 0x4d, 0x6c, 0x54, 0x0d, 0x07, 0x37, 0xe8, 0xa0, - 0xf2, 0x78, 0x44, 0xba, 0xe7, 0x9e, 0x39, 0xc4, 0xde, 0x74, 0x5c, 0xdb, 0x3e, 0xe6, 0xf2, 0xca, - 0xb5, 0xc8, 0x30, 0xb3, 0x13, 0xb5, 0x16, 0x1b, 0x15, 0xca, 0x0f, 0xf0, 0x99, 0x3f, 0xfa, 0xf8, - 0x8c, 0xae, 0x63, 0xb8, 0xc6, 0xd8, 0x1f, 0x5e, 0x1f, 0xd8, 0xf6, 0x60, 0x84, 0x37, 0x59, 0xab, - 0x3b, 0x39, 0xde, 0x24, 0xe6, 0x18, 0x7b, 0xc4, 0x18, 0x3b, 0x42, 0xe0, 0xf2, 0xc0, 0x1e, 0xd8, - 0xec, 0x71, 0x93, 0x3e, 0xf1, 0x5e, 0xf5, 0xf7, 0x32, 0x14, 0x34, 0xfc, 0xe1, 0x04, 0x7b, 0x04, - 0x6d, 0x41, 0x16, 0xf7, 0x86, 0x76, 0x5d, 0xba, 0x2e, 0x3d, 0x53, 0xda, 0xba, 0xb6, 0x31, 0xb5, - 0xb8, 0x0d, 0x21, 0xd7, 0xea, 0x0d, 0xed, 0x76, 0x4a, 0x63, 0xb2, 0xe8, 0x16, 0xe4, 0x8e, 0x47, - 0x13, 0x6f, 0x58, 0x4f, 0x33, 0xa5, 0xc7, 0x93, 0x94, 0xee, 0x50, 0xa1, 0x76, 0x4a, 0xe3, 0xd2, - 0x74, 0x2a, 0xd3, 0x3a, 0xb6, 0xeb, 0x99, 0xf3, 0xa7, 0xda, 0xb1, 0x8e, 0xd9, 0x54, 0x54, 0x16, - 0x35, 0x00, 0x3c, 0x4c, 0x74, 0xdb, 0x21, 0xa6, 0x6d, 0xd5, 0xb3, 0x4c, 0xf3, 0x89, 0x24, 0xcd, - 0x43, 0x4c, 0xf6, 0x99, 0x60, 0x3b, 0xa5, 0xc9, 0x9e, 0xdf, 0xa0, 0x36, 0x4c, 0xcb, 0x24, 0x7a, - 0x6f, 0x68, 0x98, 0x56, 0x3d, 0x77, 0xbe, 0x8d, 0x1d, 0xcb, 0x24, 0x4d, 0x2a, 0x48, 0x6d, 0x98, - 0x7e, 0x83, 0x2e, 0xf9, 0xc3, 0x09, 0x76, 0xcf, 0xea, 0xf9, 0xf3, 0x97, 0xfc, 0x7d, 0x2a, 0x44, - 0x97, 0xcc, 0xa4, 0x51, 0x0b, 0x4a, 0x5d, 0x3c, 0x30, 0x2d, 0xbd, 0x3b, 0xb2, 0x7b, 0x0f, 0xea, - 0x05, 0xa6, 0xac, 0x26, 0x29, 0x37, 0xa8, 0x68, 0x83, 0x4a, 0xb6, 0x53, 0x1a, 0x74, 0x83, 0x16, - 0x7a, 0x1d, 0x8a, 0xbd, 0x21, 0xee, 0x3d, 0xd0, 0xc9, 0x69, 0xbd, 0xc8, 0x6c, 0xac, 0x27, 0xd9, - 0x68, 0x52, 0xb9, 0xce, 0x69, 0x3b, 0xa5, 0x15, 0x7a, 0xfc, 0x91, 0xae, 0xbf, 0x8f, 0x47, 0xe6, - 0x09, 0x76, 0xa9, 0xbe, 0x7c, 0xfe, 0xfa, 0x6f, 0x73, 0x49, 0x66, 0x41, 0xee, 0xfb, 0x0d, 0xf4, - 0x06, 0xc8, 0xd8, 0xea, 0x8b, 0x65, 0x00, 0x33, 0x71, 0x3d, 0x71, 0xaf, 0x58, 0x7d, 0x7f, 0x11, - 0x45, 0x2c, 0x9e, 0xd1, 0x2b, 0x90, 0xef, 0xd9, 0xe3, 0xb1, 0x49, 0xea, 0x25, 0xa6, 0xbd, 0x96, - 0xb8, 0x00, 0x26, 0xd5, 0x4e, 0x69, 0x42, 0x1e, 0xed, 0x41, 0x65, 0x64, 0x7a, 0x44, 0xf7, 0x2c, - 0xc3, 0xf1, 0x86, 0x36, 0xf1, 0xea, 0x2b, 0xcc, 0xc2, 0x93, 0x49, 0x16, 0x76, 0x4d, 0x8f, 0x1c, - 0xfa, 0xc2, 0xed, 0x94, 0x56, 0x1e, 0x45, 0x3b, 0xa8, 0x3d, 0xfb, 0xf8, 0x18, 0xbb, 0x81, 0xc1, - 0x7a, 0xf9, 0x7c, 0x7b, 0xfb, 0x54, 0xda, 0xd7, 0xa7, 0xf6, 0xec, 0x68, 0x07, 0xfa, 0x31, 0x5c, - 0x1a, 0xd9, 0x46, 0x3f, 0x30, 0xa7, 0xf7, 0x86, 0x13, 0xeb, 0x41, 0xbd, 0xc2, 0x8c, 0x3e, 0x9b, - 0xf8, 0x92, 0xb6, 0xd1, 0xf7, 0x4d, 0x34, 0xa9, 0x42, 0x3b, 0xa5, 0xad, 0x8e, 0xa6, 0x3b, 0xd1, - 0x7d, 0xb8, 0x6c, 0x38, 0xce, 0xe8, 0x6c, 0xda, 0x7a, 0x95, 0x59, 0xbf, 0x99, 0x64, 0x7d, 0x9b, - 0xea, 0x4c, 0x9b, 0x47, 0xc6, 0x4c, 0x2f, 0xea, 0x40, 0xcd, 0x71, 0xb1, 0x63, 0xb8, 0x58, 0x77, - 0x5c, 0xdb, 0xb1, 0x3d, 0x63, 0x54, 0xaf, 0x31, 0xdb, 0x4f, 0x27, 0xd9, 0x3e, 0xe0, 0xf2, 0x07, - 0x42, 0xbc, 0x9d, 0xd2, 0xaa, 0x4e, 0xbc, 0x8b, 0x5b, 0xb5, 0x7b, 0xd8, 0xf3, 0x42, 0xab, 0xab, - 0x8b, 0xac, 0x32, 0xf9, 0xb8, 0xd5, 0x58, 0x57, 0xa3, 0x00, 0xb9, 0x13, 0x63, 0x34, 0xc1, 0xea, - 0xd3, 0x50, 0x8a, 0xc0, 0x12, 0xaa, 0x43, 0x61, 0x8c, 0x3d, 0xcf, 0x18, 0x60, 0x86, 0x62, 0xb2, - 0xe6, 0x37, 0xd5, 0x0a, 0xac, 0x44, 0xa1, 0x48, 0x1d, 0x07, 0x8a, 0x14, 0x64, 0xa8, 0xe2, 0x09, - 0x76, 0x3d, 0x8a, 0x2c, 0x42, 0x51, 0x34, 0xd1, 0x0d, 0x28, 0xb3, 0xad, 0xae, 0xfb, 0xe3, 0x14, - 0xe9, 0xb2, 0xda, 0x0a, 0xeb, 0xbc, 0x27, 0x84, 0xd6, 0xa1, 0xe4, 0x6c, 0x39, 0x81, 0x48, 0x86, - 0x89, 0x80, 0xb3, 0xe5, 0x08, 0x01, 0xf5, 0x3b, 0x50, 0x9b, 0x46, 0x26, 0x54, 0x83, 0xcc, 0x03, - 0x7c, 0x26, 0xe6, 0xa3, 0x8f, 0xe8, 0xb2, 0x58, 0x16, 0x9b, 0x43, 0xd6, 0xc4, 0x1a, 0xff, 0x94, - 0x0e, 0x94, 0x03, 0x48, 0x42, 0xaf, 0x40, 0x96, 0x22, 0xbc, 0x00, 0x6b, 0x65, 0x83, 0xc3, 0xff, - 0x86, 0x0f, 0xff, 0x1b, 0x1d, 0x1f, 0xfe, 0x1b, 0xc5, 0xcf, 0xbe, 0x58, 0x4f, 0x7d, 0xf2, 0xb7, - 0x75, 0x49, 0x63, 0x1a, 0xe8, 0x51, 0x8a, 0x20, 0x86, 0x69, 0xe9, 0x66, 0x5f, 0xcc, 0x53, 0x60, - 0xed, 0x9d, 0x3e, 0xba, 0x0b, 0xb5, 0x9e, 0x6d, 0x79, 0xd8, 0xf2, 0x26, 0x9e, 0xce, 0xc3, 0x8b, - 0x80, 0xe8, 0xd9, 0x13, 0xde, 0xf4, 0x05, 0x0f, 0x98, 0x9c, 0x56, 0xed, 0xc5, 0x3b, 0xd0, 0x1d, - 0x80, 0x13, 0x63, 0x64, 0xf6, 0x0d, 0x62, 0xbb, 0x5e, 0x3d, 0x7b, 0x3d, 0x33, 0xd7, 0xcc, 0x3d, - 0x5f, 0xe4, 0xc8, 0xe9, 0x1b, 0x04, 0x37, 0xb2, 0xf4, 0x6d, 0xb5, 0x88, 0x26, 0x7a, 0x0a, 0xaa, - 0x86, 0xe3, 0xe8, 0x1e, 0x31, 0x08, 0xd6, 0xbb, 0x67, 0x04, 0x7b, 0x0c, 0xb8, 0x57, 0xb4, 0xb2, - 0xe1, 0x38, 0x87, 0xb4, 0xb7, 0x41, 0x3b, 0xd1, 0x93, 0x50, 0xa1, 0x20, 0x6d, 0x1a, 0x23, 0x7d, - 0x88, 0xcd, 0xc1, 0x90, 0x30, 0x80, 0xce, 0x68, 0x65, 0xd1, 0xdb, 0x66, 0x9d, 0x6a, 0x3f, 0xd8, - 0x08, 0x0c, 0xa0, 0x11, 0x82, 0x6c, 0xdf, 0x20, 0x06, 0x73, 0xe4, 0x8a, 0xc6, 0x9e, 0x69, 0x9f, - 0x63, 0x90, 0xa1, 0x70, 0x0f, 0x7b, 0x46, 0x57, 0x20, 0x2f, 0xcc, 0x66, 0x98, 0x59, 0xd1, 0xa2, - 0xdf, 0xcc, 0x71, 0xed, 0x13, 0xcc, 0x22, 0x52, 0x51, 0xe3, 0x0d, 0xf5, 0x67, 0x69, 0x58, 0x9d, - 0x81, 0x72, 0x6a, 0x77, 0x68, 0x78, 0x43, 0x7f, 0x2e, 0xfa, 0x8c, 0x5e, 0xa6, 0x76, 0x8d, 0x3e, - 0x76, 0x45, 0x08, 0xad, 0x47, 0x5d, 0xc4, 0xd3, 0x83, 0x36, 0x1b, 0x17, 0xae, 0x11, 0xd2, 0x68, - 0x1f, 0x6a, 0x23, 0xc3, 0x23, 0x3a, 0x87, 0x46, 0x3d, 0x12, 0x4e, 0x67, 0x03, 0xc2, 0xae, 0xe1, - 0x83, 0x29, 0xdd, 0xec, 0xc2, 0x50, 0x65, 0x14, 0xeb, 0x45, 0x1a, 0x5c, 0xee, 0x9e, 0x3d, 0x34, - 0x2c, 0x62, 0x5a, 0x58, 0x9f, 0xf9, 0x72, 0x8f, 0xce, 0x18, 0x6d, 0x9d, 0x98, 0x7d, 0x6c, 0xf5, - 0xfc, 0x4f, 0x76, 0x29, 0x50, 0x0e, 0x3e, 0xa9, 0xa7, 0x6a, 0x50, 0x89, 0x07, 0x23, 0x54, 0x81, - 0x34, 0x39, 0x15, 0x0e, 0x48, 0x93, 0x53, 0xf4, 0x2d, 0xc8, 0xd2, 0x45, 0xb2, 0xc5, 0x57, 0xe6, - 0x64, 0x02, 0x42, 0xaf, 0x73, 0xe6, 0x60, 0x8d, 0x49, 0xaa, 0x6a, 0x70, 0x1a, 0x82, 0x00, 0x35, - 0x6d, 0x55, 0x7d, 0x16, 0xaa, 0x53, 0x11, 0x28, 0xf2, 0xfd, 0xa4, 0xe8, 0xf7, 0x53, 0xab, 0x50, - 0x8e, 0x85, 0x1b, 0xf5, 0x0a, 0x5c, 0x9e, 0x17, 0x3d, 0xd4, 0x5f, 0x4a, 0xc1, 0x40, 0x2c, 0x0c, - 0xa0, 0x5b, 0x50, 0x0c, 0xe2, 0x07, 0x3f, 0x8e, 0xb3, 0xce, 0xf2, 0x85, 0xb5, 0x40, 0x94, 0x9e, - 0x43, 0xba, 0xaf, 0xd9, 0x86, 0x48, 0xb3, 0x37, 0x2f, 0x18, 0x8e, 0xd3, 0xa6, 0x7b, 0x62, 0x1d, - 0x4a, 0x74, 0x68, 0x0a, 0x4e, 0x0c, 0x27, 0x80, 0x93, 0xf7, 0xa1, 0x9e, 0x14, 0x3c, 0xa6, 0x16, - 0x9a, 0x0d, 0x36, 0xea, 0x15, 0xc8, 0x1f, 0xdb, 0xee, 0xd8, 0x20, 0x6c, 0xb6, 0xb2, 0x26, 0x5a, - 0x74, 0x03, 0xf3, 0x40, 0x92, 0x61, 0xdd, 0xbc, 0xa1, 0xea, 0xf0, 0x68, 0x62, 0x00, 0xa1, 0x2a, - 0xa6, 0xd5, 0xc7, 0xdc, 0xe3, 0x65, 0x8d, 0x37, 0x42, 0x43, 0x7c, 0x35, 0xbc, 0x41, 0xa7, 0xf5, - 0x98, 0x33, 0x98, 0x7d, 0x59, 0x13, 0x2d, 0xf5, 0x1f, 0x12, 0x5c, 0x99, 0x1f, 0x46, 0xd0, 0x2d, - 0x00, 0x0e, 0xb9, 0xc1, 0xc1, 0x2c, 0x6d, 0x5d, 0x99, 0x3d, 0x16, 0xb7, 0x0d, 0x62, 0x68, 0x32, - 0x93, 0xa4, 0x8f, 0x14, 0x28, 0x42, 0x35, 0xdd, 0x33, 0x1f, 0xf2, 0x5d, 0x95, 0xd1, 0xca, 0x81, - 0xcc, 0xa1, 0xf9, 0x30, 0x0e, 0x80, 0x99, 0x38, 0x00, 0x86, 0xbe, 0xcb, 0xc6, 0x0e, 0xb9, 0x8f, - 0xb6, 0xb9, 0x8b, 0xa2, 0xad, 0xfa, 0x8b, 0xe8, 0x32, 0x63, 0x41, 0x2c, 0x72, 0xf2, 0xa5, 0x0b, - 0x9d, 0xfc, 0xb8, 0x7b, 0xd2, 0x4b, 0xba, 0x47, 0xfd, 0x35, 0x40, 0x51, 0xc3, 0x9e, 0x43, 0x61, - 0x1a, 0x35, 0x40, 0xc6, 0xa7, 0x3d, 0xcc, 0x73, 0x69, 0x29, 0x31, 0x17, 0xe5, 0xd2, 0x2d, 0x5f, - 0x92, 0x26, 0x82, 0x81, 0x1a, 0x7a, 0x49, 0xf0, 0x85, 0xe4, 0xd4, 0x5f, 0xa8, 0x47, 0x09, 0xc3, - 0xcb, 0x3e, 0x61, 0xc8, 0x24, 0xe6, 0x7e, 0x5c, 0x6b, 0x8a, 0x31, 0xbc, 0x24, 0x18, 0x43, 0x76, - 0xc1, 0x64, 0x31, 0xca, 0xd0, 0x8c, 0x51, 0x86, 0xdc, 0x82, 0x65, 0x26, 0x70, 0x86, 0x66, 0x8c, - 0x33, 0xe4, 0x17, 0x18, 0x49, 0x20, 0x0d, 0x2f, 0xfb, 0xa4, 0xa1, 0xb0, 0x60, 0xd9, 0x53, 0xac, - 0xe1, 0x4e, 0x9c, 0x35, 0xf0, 0x8c, 0xff, 0x46, 0xa2, 0x76, 0x22, 0x6d, 0xf8, 0x6e, 0x84, 0x36, - 0xc8, 0x89, 0x39, 0x3b, 0x37, 0x32, 0x87, 0x37, 0x34, 0x63, 0xbc, 0x01, 0x16, 0xf8, 0x20, 0x81, - 0x38, 0xbc, 0x19, 0x25, 0x0e, 0xa5, 0x44, 0xee, 0x21, 0x36, 0xcd, 0x3c, 0xe6, 0xf0, 0x6a, 0xc0, - 0x1c, 0x56, 0x12, 0xa9, 0x8f, 0x58, 0xc3, 0x34, 0x75, 0xd8, 0x9f, 0xa1, 0x0e, 0x3c, 0xd5, 0x7f, - 0x2a, 0xd1, 0xc4, 0x02, 0xee, 0xb0, 0x3f, 0xc3, 0x1d, 0x2a, 0x0b, 0x0c, 0x2e, 0x20, 0x0f, 0x3f, - 0x99, 0x4f, 0x1e, 0x92, 0xd3, 0x7b, 0xf1, 0x9a, 0xcb, 0xb1, 0x07, 0x3d, 0x81, 0x3d, 0xf0, 0x0c, - 0xff, 0xb9, 0x44, 0xf3, 0x4b, 0xd3, 0x87, 0xa3, 0x39, 0xf4, 0x81, 0x27, 0xfa, 0xcf, 0x24, 0x1a, - 0x5f, 0x82, 0x3f, 0x1c, 0xcd, 0xe1, 0x0f, 0x68, 0xa1, 0xd9, 0xe5, 0x09, 0xc4, 0xb3, 0x34, 0x4f, - 0x9b, 0x82, 0x39, 0x1a, 0xc9, 0xb0, 0xeb, 0xda, 0xae, 0xc8, 0xcd, 0x79, 0x43, 0x7d, 0x86, 0x66, - 0x8e, 0x21, 0xa4, 0x9d, 0x43, 0x36, 0x58, 0x4e, 0x11, 0x81, 0x31, 0xf5, 0x77, 0x52, 0xa8, 0xcb, - 0x92, 0xad, 0x68, 0xd6, 0x29, 0x8b, 0xac, 0x33, 0xc2, 0x41, 0xd2, 0x71, 0x0e, 0xb2, 0x28, 0x1f, - 0x40, 0x37, 0x61, 0x95, 0x25, 0x83, 0x3c, 0x2e, 0xc4, 0x42, 0x58, 0x95, 0x0e, 0xf0, 0xa3, 0xc4, - 0x63, 0xd9, 0x0b, 0x70, 0x29, 0x22, 0x1b, 0xa4, 0x20, 0x3c, 0xa7, 0xae, 0x05, 0xd2, 0xdb, 0x3c, - 0x17, 0x51, 0xdf, 0x09, 0x1d, 0x14, 0x52, 0x17, 0x04, 0xd9, 0x9e, 0xdd, 0xc7, 0x22, 0xfe, 0xb3, - 0x67, 0x4a, 0x67, 0x46, 0xf6, 0x40, 0x44, 0x54, 0xfa, 0x48, 0xa5, 0x02, 0xcc, 0x96, 0x39, 0x24, - 0xab, 0x7f, 0x94, 0x42, 0x7b, 0x21, 0x9b, 0x99, 0x47, 0x3c, 0xa4, 0xff, 0x0d, 0xf1, 0x48, 0x7f, - 0x6d, 0xe2, 0x11, 0x4d, 0xd0, 0x32, 0xb1, 0x04, 0x4d, 0xfd, 0x97, 0x14, 0x7e, 0xe1, 0x80, 0x46, - 0x7c, 0x3d, 0x8f, 0x84, 0xc9, 0x54, 0x8e, 0x7d, 0x2f, 0x91, 0x4c, 0x09, 0x72, 0x98, 0x67, 0xf3, - 0xc6, 0xc9, 0x61, 0x81, 0xa7, 0x57, 0xac, 0x81, 0x5e, 0x01, 0x99, 0x55, 0x18, 0x75, 0xdb, 0xf1, - 0x44, 0x78, 0x78, 0x2c, 0xba, 0x56, 0x5e, 0x48, 0xdc, 0x38, 0xa0, 0x32, 0xfb, 0x8e, 0xa7, 0x15, - 0x1d, 0xf1, 0x14, 0xc9, 0x75, 0xe4, 0x58, 0xae, 0x73, 0x0d, 0x64, 0xfa, 0xf6, 0x9e, 0x63, 0xf4, - 0x30, 0x83, 0x7a, 0x59, 0x0b, 0x3b, 0xd4, 0xfb, 0x80, 0x66, 0x83, 0x0d, 0x6a, 0x43, 0x1e, 0x9f, - 0x60, 0x8b, 0xd0, 0xaf, 0x96, 0x99, 0x4e, 0x47, 0x04, 0x5b, 0xc0, 0x16, 0x69, 0xd4, 0xa9, 0x93, - 0xff, 0xf9, 0xc5, 0x7a, 0x8d, 0x4b, 0x3f, 0x6f, 0x8f, 0x4d, 0x82, 0xc7, 0x0e, 0x39, 0xd3, 0x84, - 0xbe, 0xfa, 0xd7, 0x34, 0x4d, 0xdd, 0x63, 0x81, 0x68, 0xae, 0x6f, 0xfd, 0x03, 0x94, 0x8e, 0xd0, - 0xb6, 0xe5, 0xfc, 0xbd, 0x06, 0x30, 0x30, 0x3c, 0xfd, 0x23, 0xc3, 0x22, 0xb8, 0x2f, 0x9c, 0x1e, - 0xe9, 0x41, 0x0a, 0x14, 0x69, 0x6b, 0xe2, 0xe1, 0xbe, 0x60, 0x90, 0x41, 0x3b, 0xb2, 0xce, 0xc2, - 0x37, 0x5b, 0x67, 0xdc, 0xcb, 0xc5, 0x29, 0x2f, 0x47, 0x92, 0x66, 0x39, 0x9a, 0x34, 0xd3, 0x77, - 0x73, 0x5c, 0xd3, 0x76, 0x4d, 0x72, 0xc6, 0x3e, 0x4d, 0x46, 0x0b, 0xda, 0xe8, 0x06, 0x94, 0xc7, - 0x78, 0xec, 0xd8, 0xf6, 0x48, 0xe7, 0xe0, 0x55, 0x62, 0xaa, 0x2b, 0xa2, 0xb3, 0xc5, 0x30, 0xec, - 0xe7, 0xe9, 0xf0, 0xf8, 0x85, 0xf4, 0xe9, 0xff, 0xce, 0xc1, 0xea, 0xaf, 0x58, 0x4d, 0x25, 0x9e, - 0x6a, 0xa0, 0x43, 0x58, 0x0d, 0x8e, 0xbf, 0x3e, 0x61, 0xb0, 0xe0, 0x6f, 0xe8, 0x65, 0xf1, 0xa3, - 0x76, 0x12, 0xef, 0xf6, 0xd0, 0x0f, 0xe0, 0xea, 0x14, 0xb4, 0x05, 0xa6, 0xd3, 0x4b, 0x22, 0xdc, - 0x23, 0x71, 0x84, 0xf3, 0x2d, 0x87, 0xbe, 0xca, 0x7c, 0xc3, 0x43, 0xb7, 0x43, 0x69, 0x7a, 0x34, - 0x71, 0x9a, 0xfb, 0xf5, 0x6f, 0x40, 0xd9, 0xc5, 0x84, 0x12, 0xa7, 0x58, 0x21, 0x64, 0x85, 0x77, - 0x8a, 0xf2, 0xca, 0x01, 0x3c, 0x32, 0x37, 0x81, 0x42, 0xdf, 0x06, 0x39, 0xcc, 0xbd, 0xa4, 0x84, - 0x9a, 0x42, 0x40, 0x93, 0x43, 0x59, 0xf5, 0x0f, 0x52, 0x68, 0x32, 0x4e, 0xbc, 0x5b, 0x90, 0x77, - 0xb1, 0x37, 0x19, 0x71, 0xa6, 0x5b, 0xd9, 0x7a, 0x61, 0xb9, 0xd4, 0x8b, 0xf6, 0x4e, 0x46, 0x44, - 0x13, 0xca, 0xea, 0x7d, 0xc8, 0xf3, 0x1e, 0x54, 0x82, 0xc2, 0xd1, 0xde, 0xdd, 0xbd, 0xfd, 0x77, - 0xf7, 0x6a, 0x29, 0x04, 0x90, 0xdf, 0x6e, 0x36, 0x5b, 0x07, 0x9d, 0x9a, 0x84, 0x64, 0xc8, 0x6d, - 0x37, 0xf6, 0xb5, 0x4e, 0x2d, 0x4d, 0xbb, 0xb5, 0xd6, 0xdb, 0xad, 0x66, 0xa7, 0x96, 0x41, 0xab, - 0x50, 0xe6, 0xcf, 0xfa, 0x9d, 0x7d, 0xed, 0x9d, 0xed, 0x4e, 0x2d, 0x1b, 0xe9, 0x3a, 0x6c, 0xed, - 0xdd, 0x6e, 0x69, 0xb5, 0x9c, 0xfa, 0x22, 0xa5, 0xd2, 0x09, 0xc9, 0x5a, 0x48, 0x9a, 0xa5, 0x08, - 0x69, 0x56, 0x7f, 0x93, 0x06, 0x25, 0x39, 0x03, 0x43, 0x6f, 0x4f, 0x2d, 0x7c, 0xeb, 0x02, 0xe9, - 0xdb, 0xd4, 0xea, 0xd1, 0x93, 0x50, 0x71, 0xf1, 0x31, 0x26, 0xbd, 0x21, 0xcf, 0x08, 0x79, 0xc4, - 0x2c, 0x6b, 0x65, 0xd1, 0xcb, 0x94, 0x3c, 0x2e, 0xf6, 0x01, 0xee, 0x11, 0x9d, 0x43, 0x11, 0xdf, - 0x74, 0x32, 0x15, 0xa3, 0xbd, 0x87, 0xbc, 0x53, 0x7d, 0xff, 0x42, 0xbe, 0x94, 0x21, 0xa7, 0xb5, - 0x3a, 0xda, 0x0f, 0x6b, 0x19, 0x84, 0xa0, 0xc2, 0x1e, 0xf5, 0xc3, 0xbd, 0xed, 0x83, 0xc3, 0xf6, - 0x3e, 0xf5, 0xe5, 0x25, 0xa8, 0xfa, 0xbe, 0xf4, 0x3b, 0x73, 0xea, 0x01, 0x5c, 0x4d, 0x48, 0x1f, - 0xbf, 0x66, 0xdd, 0x40, 0xfd, 0xad, 0x14, 0x35, 0x19, 0xe7, 0xe8, 0x6f, 0x4d, 0x79, 0x7a, 0x73, - 0xd9, 0xa4, 0x73, 0xda, 0xcd, 0x0a, 0x14, 0xb1, 0x28, 0x98, 0x31, 0x07, 0xaf, 0x68, 0x41, 0x5b, - 0x7d, 0x61, 0xb1, 0xd3, 0xc2, 0x5d, 0x97, 0x56, 0xff, 0x23, 0x41, 0x75, 0x0a, 0x22, 0xd0, 0x16, - 0xe4, 0x38, 0xaf, 0x4a, 0xfa, 0x79, 0xc7, 0x10, 0x4e, 0xe0, 0x09, 0x17, 0x45, 0xaf, 0xc7, 0x5e, - 0x69, 0x06, 0x8a, 0xb8, 0xb3, 0xfc, 0x2a, 0x9f, 0x50, 0x0d, 0x34, 0xd0, 0x1b, 0x20, 0x07, 0x58, - 0x27, 0xc8, 0xfc, 0x13, 0xb3, 0xea, 0x01, 0x4a, 0x0a, 0xfd, 0x50, 0x07, 0xbd, 0x1a, 0xa6, 0xbb, - 0xd9, 0x59, 0x36, 0x27, 0xd4, 0xb9, 0x80, 0x50, 0xf6, 0xe5, 0xd5, 0x26, 0x94, 0x22, 0xeb, 0x41, - 0x8f, 0x81, 0x3c, 0x36, 0x4e, 0x45, 0x6d, 0x98, 0x57, 0xf7, 0x8a, 0x63, 0xe3, 0x94, 0x97, 0x85, - 0xaf, 0x42, 0x81, 0x0e, 0x0e, 0x0c, 0x4f, 0x54, 0x83, 0xf2, 0x63, 0xe3, 0xf4, 0x2d, 0xc3, 0x53, - 0xdf, 0x83, 0x4a, 0xbc, 0x2e, 0x4a, 0xcf, 0xa2, 0x6b, 0x4f, 0xac, 0x3e, 0xb3, 0x91, 0xd3, 0x78, - 0x03, 0xdd, 0x82, 0xdc, 0x89, 0xcd, 0xe1, 0x7a, 0x3e, 0x68, 0xdd, 0xb3, 0x09, 0x8e, 0xd4, 0x55, - 0xb9, 0xb4, 0xfa, 0x10, 0x72, 0x0c, 0x7e, 0x29, 0x94, 0xb2, 0x0a, 0xa7, 0x48, 0xf5, 0xe9, 0x33, - 0x7a, 0x0f, 0xc0, 0x20, 0xc4, 0x35, 0xbb, 0x93, 0xd0, 0xf0, 0xfa, 0x7c, 0xf8, 0xde, 0xf6, 0xe5, - 0x1a, 0xd7, 0x04, 0x8e, 0x5f, 0x0e, 0x55, 0x23, 0x58, 0x1e, 0x31, 0xa8, 0xee, 0x41, 0x25, 0xae, - 0x1b, 0xfd, 0xd7, 0xb0, 0x32, 0xe7, 0x5f, 0x43, 0x90, 0x4e, 0x06, 0xc9, 0x68, 0x86, 0x57, 0xb3, - 0x59, 0x43, 0xfd, 0x58, 0x82, 0x62, 0xe7, 0x54, 0xec, 0xd1, 0x84, 0x42, 0x6a, 0xa8, 0x9a, 0x8e, - 0x16, 0x05, 0x79, 0x65, 0x36, 0x13, 0xd4, 0x7b, 0xdf, 0x0c, 0x0e, 0x54, 0x76, 0xd9, 0x2a, 0x82, - 0x5f, 0xfe, 0x12, 0x70, 0xfd, 0x1a, 0xc8, 0xc1, 0xae, 0xa2, 0x9c, 0xc9, 0xe8, 0xf7, 0x5d, 0xec, - 0x79, 0x62, 0x6d, 0x7e, 0x93, 0xd5, 0xe5, 0xed, 0x8f, 0x44, 0xd9, 0x31, 0xa3, 0xf1, 0x86, 0xda, - 0x87, 0xea, 0x54, 0xe0, 0x46, 0xaf, 0x41, 0xc1, 0x99, 0x74, 0x75, 0xdf, 0x3d, 0x53, 0x87, 0xc7, - 0xcf, 0x9f, 0x27, 0xdd, 0x91, 0xd9, 0xbb, 0x8b, 0xcf, 0xfc, 0x97, 0x71, 0x26, 0xdd, 0xbb, 0xdc, - 0x8b, 0x7c, 0x96, 0x74, 0x74, 0x96, 0x13, 0x28, 0xfa, 0x9b, 0x02, 0x7d, 0x2f, 0x7a, 0x4e, 0xfc, - 0xbf, 0x35, 0x89, 0xc9, 0x84, 0x30, 0x1f, 0x39, 0x26, 0x37, 0x61, 0xd5, 0x33, 0x07, 0x16, 0xee, - 0xeb, 0x21, 0x6b, 0x63, 0xb3, 0x15, 0xb5, 0x2a, 0x1f, 0xd8, 0xf5, 0x29, 0x9b, 0xfa, 0x6f, 0x09, - 0x8a, 0xfe, 0x81, 0x45, 0x2f, 0x46, 0xf6, 0x5d, 0x65, 0x4e, 0xc5, 0xcc, 0x17, 0x0c, 0x4b, 0xeb, - 0xf1, 0x77, 0x4d, 0x5f, 0xfc, 0x5d, 0x93, 0xfe, 0x91, 0xf8, 0xe5, 0xd3, 0xec, 0x85, 0x7f, 0x56, - 0x3d, 0x0f, 0x88, 0xd8, 0xc4, 0x18, 0xe9, 0x27, 0x36, 0x31, 0xad, 0x81, 0xce, 0x9d, 0xcd, 0x73, - 0xca, 0x1a, 0x1b, 0xb9, 0xc7, 0x06, 0x0e, 0x98, 0xdf, 0x7f, 0x2a, 0x41, 0x31, 0xc8, 0x0e, 0x2e, - 0x5a, 0x07, 0xbf, 0x02, 0x79, 0x11, 0x00, 0x79, 0x21, 0x5c, 0xb4, 0x82, 0x9f, 0x36, 0xd9, 0xc8, - 0x4f, 0x1b, 0x05, 0x8a, 0x63, 0x4c, 0x0c, 0x16, 0x67, 0x38, 0x71, 0x0e, 0xda, 0x37, 0x5f, 0x85, - 0x52, 0xe4, 0xa7, 0x05, 0x3d, 0x79, 0x7b, 0xad, 0x77, 0x6b, 0x29, 0xa5, 0xf0, 0xf1, 0xa7, 0xd7, - 0x33, 0x7b, 0xf8, 0x23, 0xba, 0x67, 0xb5, 0x56, 0xb3, 0xdd, 0x6a, 0xde, 0xad, 0x49, 0x4a, 0xe9, - 0xe3, 0x4f, 0xaf, 0x17, 0x34, 0xcc, 0x0a, 0x6d, 0x37, 0xdb, 0xb0, 0x12, 0xfd, 0x2a, 0xf1, 0x70, - 0x80, 0xa0, 0x72, 0xfb, 0xe8, 0x60, 0x77, 0xa7, 0xb9, 0xdd, 0x69, 0xe9, 0xf7, 0xf6, 0x3b, 0xad, - 0x9a, 0x84, 0xae, 0xc2, 0xa5, 0xdd, 0x9d, 0xb7, 0xda, 0x1d, 0xbd, 0xb9, 0xbb, 0xd3, 0xda, 0xeb, - 0xe8, 0xdb, 0x9d, 0xce, 0x76, 0xf3, 0x6e, 0x2d, 0xbd, 0xf5, 0xe7, 0x12, 0x54, 0xb7, 0x1b, 0xcd, - 0x1d, 0x1a, 0xff, 0xcd, 0x9e, 0x21, 0x0a, 0x99, 0x59, 0x56, 0xb7, 0x38, 0xf7, 0x66, 0x87, 0x72, - 0x7e, 0x1d, 0x17, 0xdd, 0x81, 0x1c, 0x2b, 0x69, 0xa0, 0xf3, 0xaf, 0x7a, 0x28, 0x0b, 0x0a, 0xbb, - 0xf4, 0x65, 0xd8, 0xf1, 0x38, 0xf7, 0xee, 0x87, 0x72, 0x7e, 0x9d, 0x17, 0x69, 0x20, 0x87, 0x35, - 0x89, 0xc5, 0x77, 0x41, 0x94, 0x25, 0x6a, 0xbf, 0xd4, 0x66, 0x48, 0x8c, 0x16, 0xdf, 0x8d, 0x50, - 0x96, 0x00, 0x30, 0xb4, 0x0b, 0x05, 0x9f, 0xcb, 0x2e, 0xba, 0xad, 0xa1, 0x2c, 0xac, 0xcb, 0xd2, - 0x4f, 0xc0, 0x6b, 0x0e, 0xe7, 0x5f, 0x3d, 0x51, 0x16, 0x14, 0x99, 0xd1, 0x0e, 0xe4, 0x45, 0xb6, - 0xbf, 0xe0, 0x06, 0x86, 0xb2, 0xa8, 0xce, 0x4a, 0x9d, 0x16, 0x16, 0x73, 0x16, 0x5f, 0xa8, 0x51, - 0x96, 0xa8, 0x9f, 0xa3, 0x23, 0x80, 0x48, 0x85, 0x61, 0x89, 0x9b, 0x32, 0xca, 0x32, 0x75, 0x71, - 0xb4, 0x0f, 0xc5, 0x80, 0xf0, 0x2d, 0xbc, 0xb7, 0xa2, 0x2c, 0x2e, 0x50, 0xa3, 0xfb, 0x50, 0x8e, - 0x33, 0x9d, 0xe5, 0x6e, 0xa3, 0x28, 0x4b, 0x56, 0x9e, 0xa9, 0xfd, 0x38, 0xed, 0x59, 0xee, 0x76, - 0x8a, 0xb2, 0x64, 0x21, 0x1a, 0x7d, 0x00, 0xab, 0xb3, 0xb4, 0x64, 0xf9, 0xcb, 0x2a, 0xca, 0x05, - 0x4a, 0xd3, 0x68, 0x0c, 0x68, 0x0e, 0x9d, 0xb9, 0xc0, 0xdd, 0x15, 0xe5, 0x22, 0x95, 0x6a, 0xd4, - 0x87, 0xea, 0x34, 0x47, 0x58, 0xf6, 0x2e, 0x8b, 0xb2, 0x74, 0xd5, 0x9a, 0xcf, 0x12, 0xa7, 0x0d, - 0xcb, 0xde, 0x6d, 0x51, 0x96, 0x2e, 0x62, 0x37, 0x5a, 0x9f, 0x7d, 0xb9, 0x26, 0x7d, 0xfe, 0xe5, - 0x9a, 0xf4, 0xf7, 0x2f, 0xd7, 0xa4, 0x4f, 0xbe, 0x5a, 0x4b, 0x7d, 0xfe, 0xd5, 0x5a, 0xea, 0x2f, - 0x5f, 0xad, 0xa5, 0x7e, 0xf4, 0xdc, 0xc0, 0x24, 0xc3, 0x49, 0x77, 0xa3, 0x67, 0x8f, 0x37, 0xa3, - 0x97, 0x04, 0xe7, 0x5d, 0x5c, 0xec, 0xe6, 0x59, 0xd0, 0x7d, 0xe9, 0xbf, 0x01, 0x00, 0x00, 0xff, - 0xff, 0xd1, 0x6a, 0xc9, 0x8e, 0xd8, 0x28, 0x00, 0x00, + // 3101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0x4b, 0x73, 0xdc, 0xc6, + 0xf1, 0x5f, 0xec, 0x1b, 0xbd, 0xdc, 0x07, 0x47, 0xb2, 0xb4, 0x82, 0x65, 0x52, 0x86, 0xca, 0x2f, + 0xd9, 0x26, 0xff, 0xa6, 0x4b, 0xfe, 0xdb, 0xb1, 0x13, 0x9b, 0x5c, 0xad, 0xbc, 0xb4, 0x68, 0x92, + 0x01, 0x57, 0x72, 0x5e, 0x16, 0x0c, 0x2e, 0x86, 0xbb, 0xb0, 0x76, 0x01, 0x18, 0xc0, 0xd2, 0xa4, + 0x8e, 0xa9, 0xa4, 0x52, 0xf1, 0xc9, 0x55, 0xb9, 0xf8, 0xe2, 0x7b, 0x2e, 0xf9, 0x08, 0xc9, 0xd9, + 0x55, 0x49, 0x55, 0x7c, 0xcc, 0x21, 0xe5, 0xa4, 0xec, 0x9c, 0xf2, 0x05, 0x52, 0x39, 0xa4, 0x92, + 0x9a, 0x07, 0x9e, 0xbb, 0xe0, 0x82, 0x72, 0x6e, 0xb9, 0xcd, 0xf4, 0x74, 0xf7, 0xcc, 0x34, 0x66, + 0xba, 0xfb, 0xd7, 0x18, 0x78, 0xdc, 0xc3, 0xa6, 0x8e, 0x9d, 0x89, 0x61, 0x7a, 0xeb, 0xda, 0xe1, + 0xc0, 0x58, 0xf7, 0x4e, 0x6d, 0xec, 0xae, 0xd9, 0x8e, 0xe5, 0x59, 0xa8, 0x19, 0x0e, 0xae, 0x91, + 0x41, 0xe9, 0x89, 0x08, 0xf7, 0xc0, 0x39, 0xb5, 0x3d, 0x6b, 0xdd, 0x76, 0x2c, 0xeb, 0x88, 0xf1, + 0x4b, 0x57, 0x23, 0xc3, 0x54, 0x4f, 0x54, 0x5b, 0x6c, 0x94, 0x0b, 0x3f, 0xc0, 0xa7, 0xfe, 0xe8, + 0x13, 0x33, 0xb2, 0xb6, 0xe6, 0x68, 0x13, 0x7f, 0x78, 0x75, 0x68, 0x59, 0xc3, 0x31, 0x5e, 0xa7, + 0xbd, 0xc3, 0xe9, 0xd1, 0xba, 0x67, 0x4c, 0xb0, 0xeb, 0x69, 0x13, 0x9b, 0x33, 0x5c, 0x1c, 0x5a, + 0x43, 0x8b, 0x36, 0xd7, 0x49, 0x8b, 0x53, 0x57, 0x92, 0x62, 0xfa, 0xd4, 0xd1, 0x3c, 0xc3, 0x32, + 0xd9, 0xb8, 0xfc, 0x5b, 0x11, 0x2a, 0x0a, 0xfe, 0x68, 0x8a, 0x5d, 0x0f, 0x6d, 0x40, 0x11, 0x0f, + 0x46, 0x56, 0x5b, 0xb8, 0x26, 0x3c, 0x5b, 0xdb, 0xb8, 0xba, 0x96, 0xd8, 0xfc, 0x1a, 0xe7, 0xeb, + 0x0e, 0x46, 0x56, 0x2f, 0xa7, 0x50, 0x5e, 0x74, 0x13, 0x4a, 0x47, 0xe3, 0xa9, 0x3b, 0x6a, 0xe7, + 0xa9, 0xd0, 0x13, 0x69, 0x42, 0xb7, 0x09, 0x53, 0x2f, 0xa7, 0x30, 0x6e, 0x32, 0x95, 0x61, 0x1e, + 0x59, 0xed, 0xc2, 0xd9, 0x53, 0x6d, 0x9b, 0x47, 0x74, 0x2a, 0xc2, 0x8b, 0xb6, 0x00, 0x5c, 0xec, + 0xa9, 0x96, 0x4d, 0x96, 0xdf, 0x2e, 0x52, 0xc9, 0x27, 0xd3, 0x24, 0x0f, 0xb0, 0xb7, 0x47, 0x19, + 0x7b, 0x39, 0x45, 0x74, 0xfd, 0x0e, 0xd1, 0x61, 0x98, 0x86, 0xa7, 0x0e, 0x46, 0x9a, 0x61, 0xb6, + 0x4b, 0x67, 0xeb, 0xd8, 0x36, 0x0d, 0xaf, 0x43, 0x18, 0x89, 0x0e, 0xc3, 0xef, 0x90, 0x2d, 0x7f, + 0x34, 0xc5, 0xce, 0x69, 0xbb, 0x7c, 0xf6, 0x96, 0xbf, 0x4f, 0x98, 0xc8, 0x96, 0x29, 0x37, 0xea, + 0x42, 0xed, 0x10, 0x0f, 0x0d, 0x53, 0x3d, 0x1c, 0x5b, 0x83, 0x07, 0xed, 0x0a, 0x15, 0x96, 0xd3, + 0x84, 0xb7, 0x08, 0xeb, 0x16, 0xe1, 0xec, 0xe5, 0x14, 0x38, 0x0c, 0x7a, 0xe8, 0x0d, 0xa8, 0x0e, + 0x46, 0x78, 0xf0, 0x40, 0xf5, 0x4e, 0xda, 0x55, 0xaa, 0x63, 0x35, 0x4d, 0x47, 0x87, 0xf0, 0xf5, + 0x4f, 0x7a, 0x39, 0xa5, 0x32, 0x60, 0x4d, 0xb2, 0x7f, 0x1d, 0x8f, 0x8d, 0x63, 0xec, 0x10, 0x79, + 0xf1, 0xec, 0xfd, 0xdf, 0x62, 0x9c, 0x54, 0x83, 0xa8, 0xfb, 0x1d, 0xf4, 0x26, 0x88, 0xd8, 0xd4, + 0xf9, 0x36, 0x80, 0xaa, 0xb8, 0x96, 0x7a, 0x56, 0x4c, 0xdd, 0xdf, 0x44, 0x15, 0xf3, 0x36, 0x7a, + 0x15, 0xca, 0x03, 0x6b, 0x32, 0x31, 0xbc, 0x76, 0x8d, 0x4a, 0xaf, 0xa4, 0x6e, 0x80, 0x72, 0xf5, + 0x72, 0x0a, 0xe7, 0x47, 0xbb, 0xd0, 0x18, 0x1b, 0xae, 0xa7, 0xba, 0xa6, 0x66, 0xbb, 0x23, 0xcb, + 0x73, 0xdb, 0x4b, 0x54, 0xc3, 0x53, 0x69, 0x1a, 0x76, 0x0c, 0xd7, 0x3b, 0xf0, 0x99, 0x7b, 0x39, + 0xa5, 0x3e, 0x8e, 0x12, 0x88, 0x3e, 0xeb, 0xe8, 0x08, 0x3b, 0x81, 0xc2, 0x76, 0xfd, 0x6c, 0x7d, + 0x7b, 0x84, 0xdb, 0x97, 0x27, 0xfa, 0xac, 0x28, 0x01, 0xfd, 0x18, 0x2e, 0x8c, 0x2d, 0x4d, 0x0f, + 0xd4, 0xa9, 0x83, 0xd1, 0xd4, 0x7c, 0xd0, 0x6e, 0x50, 0xa5, 0xcf, 0xa5, 0x2e, 0xd2, 0xd2, 0x74, + 0x5f, 0x45, 0x87, 0x08, 0xf4, 0x72, 0xca, 0xf2, 0x38, 0x49, 0x44, 0xf7, 0xe1, 0xa2, 0x66, 0xdb, + 0xe3, 0xd3, 0xa4, 0xf6, 0x26, 0xd5, 0x7e, 0x23, 0x4d, 0xfb, 0x26, 0x91, 0x49, 0xaa, 0x47, 0xda, + 0x0c, 0x15, 0xf5, 0xa1, 0x65, 0x3b, 0xd8, 0xd6, 0x1c, 0xac, 0xda, 0x8e, 0x65, 0x5b, 0xae, 0x36, + 0x6e, 0xb7, 0xa8, 0xee, 0x67, 0xd2, 0x74, 0xef, 0x33, 0xfe, 0x7d, 0xce, 0xde, 0xcb, 0x29, 0x4d, + 0x3b, 0x4e, 0x62, 0x5a, 0xad, 0x01, 0x76, 0xdd, 0x50, 0xeb, 0xf2, 0x22, 0xad, 0x94, 0x3f, 0xae, + 0x35, 0x46, 0xda, 0xaa, 0x40, 0xe9, 0x58, 0x1b, 0x4f, 0xb1, 0xfc, 0x0c, 0xd4, 0x22, 0x6e, 0x09, + 0xb5, 0xa1, 0x32, 0xc1, 0xae, 0xab, 0x0d, 0x31, 0xf5, 0x62, 0xa2, 0xe2, 0x77, 0xe5, 0x06, 0x2c, + 0x45, 0x5d, 0x91, 0xfc, 0x6b, 0x01, 0x96, 0xfa, 0xc6, 0x04, 0x5b, 0x53, 0xcf, 0x25, 0x6e, 0x06, + 0xed, 0x40, 0xd3, 0x63, 0x7d, 0xbe, 0x50, 0xcc, 0x1d, 0xe1, 0x95, 0x35, 0xe6, 0x43, 0xd7, 0x7c, + 0x1f, 0xba, 0x76, 0x8b, 0xfb, 0xd0, 0xad, 0xea, 0x17, 0x5f, 0xad, 0xe6, 0x3e, 0xfb, 0xcb, 0xaa, + 0xa0, 0x34, 0xb8, 0x2c, 0x5b, 0x21, 0x46, 0xef, 0x80, 0x4f, 0x51, 0xf9, 0x59, 0xcf, 0x67, 0x57, + 0x56, 0xe7, 0xa2, 0xec, 0xfc, 0xcb, 0x93, 0x60, 0x8f, 0x74, 0xa1, 0x6d, 0xa8, 0x1c, 0x63, 0xc7, + 0x25, 0x4e, 0x90, 0xef, 0x91, 0x77, 0xd1, 0x75, 0xa8, 0xd3, 0x5b, 0xa9, 0xfa, 0xe3, 0x64, 0xce, + 0xa2, 0xb2, 0x44, 0x89, 0xf7, 0x38, 0xd3, 0x2a, 0xd4, 0xec, 0x0d, 0x3b, 0x60, 0x29, 0x50, 0x16, + 0xb0, 0x37, 0x6c, 0xce, 0x20, 0x7f, 0x07, 0x5a, 0x49, 0x27, 0x8a, 0x5a, 0x50, 0x78, 0x80, 0x4f, + 0xf9, 0x7c, 0xa4, 0x89, 0x2e, 0xf2, 0x2f, 0x40, 0xe7, 0x10, 0x15, 0xfe, 0x39, 0x7e, 0x9f, 0x0f, + 0x84, 0x03, 0xef, 0x89, 0x5e, 0x85, 0x22, 0xd9, 0x10, 0x37, 0xa7, 0x34, 0x63, 0x81, 0xbe, 0x1f, + 0xc9, 0x98, 0x09, 0x3e, 0x25, 0x26, 0xa0, 0x12, 0xe8, 0x0a, 0x71, 0x76, 0x9a, 0x61, 0xaa, 0x86, + 0xce, 0xe7, 0xa9, 0xd0, 0xfe, 0xb6, 0x8e, 0xee, 0x40, 0x6b, 0x60, 0x99, 0x2e, 0x36, 0xdd, 0xa9, + 0xab, 0xb2, 0x48, 0xc9, 0xa3, 0xc9, 0xac, 0x33, 0xea, 0xf8, 0x8c, 0xfb, 0x94, 0x4f, 0x69, 0x0e, + 0xe2, 0x04, 0x74, 0x1b, 0xe0, 0x58, 0x1b, 0x1b, 0xba, 0xe6, 0x59, 0x8e, 0xdb, 0x2e, 0x5e, 0x2b, + 0xcc, 0x55, 0x73, 0xcf, 0x67, 0xb9, 0x6b, 0xeb, 0x9a, 0x87, 0xb7, 0x8a, 0x64, 0xb5, 0x4a, 0x44, + 0x12, 0x3d, 0x0d, 0x4d, 0xcd, 0xb6, 0x55, 0xd7, 0xd3, 0x3c, 0xac, 0x1e, 0x9e, 0x7a, 0xd8, 0xa5, + 0x31, 0x66, 0x49, 0xa9, 0x6b, 0xb6, 0x7d, 0x40, 0xa8, 0x5b, 0x84, 0x88, 0x9e, 0x82, 0x06, 0x89, + 0x27, 0x86, 0x36, 0x56, 0x47, 0xd8, 0x18, 0x8e, 0x3c, 0x1a, 0x4b, 0x0a, 0x4a, 0x9d, 0x53, 0x7b, + 0x94, 0x28, 0xeb, 0xc1, 0x99, 0xa5, 0xb1, 0x04, 0x21, 0x28, 0xea, 0x9a, 0xa7, 0x51, 0x43, 0x2e, + 0x29, 0xb4, 0x4d, 0x68, 0xb6, 0xe6, 0x8d, 0xb8, 0x79, 0x68, 0x1b, 0x5d, 0x82, 0x32, 0x57, 0x5b, + 0xa0, 0x6a, 0x79, 0x8f, 0x7c, 0x33, 0xdb, 0xb1, 0x8e, 0x31, 0x0d, 0x9e, 0x55, 0x85, 0x75, 0xe4, + 0x9f, 0xe5, 0x61, 0x79, 0x26, 0xea, 0x10, 0xbd, 0x23, 0xcd, 0x1d, 0xf9, 0x73, 0x91, 0x36, 0x7a, + 0x85, 0xe8, 0xd5, 0x74, 0xec, 0xf0, 0xc3, 0xdc, 0x8e, 0x9a, 0x88, 0x65, 0x3a, 0x3d, 0x3a, 0xce, + 0x4d, 0xc3, 0xb9, 0xd1, 0x1e, 0xb4, 0xc6, 0x9a, 0xeb, 0xdf, 0x04, 0x35, 0x12, 0xf9, 0x67, 0x63, + 0xd7, 0x8e, 0xe6, 0xfb, 0x7d, 0x72, 0xd8, 0xb9, 0xa2, 0xc6, 0x38, 0x46, 0x45, 0x0a, 0x5c, 0x3c, + 0x3c, 0x7d, 0xa8, 0x99, 0x9e, 0x61, 0x62, 0x75, 0xe6, 0xcb, 0x5d, 0x99, 0x51, 0xda, 0x3d, 0x36, + 0x74, 0x6c, 0x0e, 0xfc, 0x4f, 0x76, 0x21, 0x10, 0x0e, 0x3e, 0xa9, 0x2b, 0x2b, 0xd0, 0x88, 0xc7, + 0x4d, 0xd4, 0x80, 0xbc, 0x77, 0xc2, 0x0d, 0x90, 0xf7, 0x4e, 0xd0, 0xff, 0x41, 0x91, 0x6c, 0x92, + 0x6e, 0xbe, 0x31, 0x27, 0x69, 0xe1, 0x72, 0xfd, 0x53, 0x1b, 0x2b, 0x94, 0x53, 0x96, 0x83, 0xdb, + 0x10, 0xc4, 0xd2, 0xa4, 0x56, 0xf9, 0x39, 0x68, 0x26, 0x82, 0x65, 0xe4, 0xfb, 0x09, 0xd1, 0xef, + 0x27, 0x37, 0xa1, 0x1e, 0x8b, 0x8c, 0xf2, 0x25, 0xb8, 0x38, 0x2f, 0xd0, 0xc9, 0xbf, 0x14, 0x82, + 0x81, 0x58, 0xc4, 0x42, 0x37, 0xa1, 0x1a, 0x84, 0x3a, 0xdf, 0xbb, 0x25, 0xb7, 0xe1, 0x33, 0x2b, + 0x01, 0x2b, 0xb9, 0x87, 0xe4, 0x5c, 0xd3, 0x03, 0x91, 0xa7, 0x2b, 0xaf, 0x68, 0xb6, 0xdd, 0x23, + 0x67, 0x62, 0x15, 0x6a, 0x64, 0x28, 0xe1, 0x4e, 0x34, 0x3b, 0x70, 0x27, 0x1f, 0x40, 0x3b, 0x2d, + 0xce, 0x25, 0x36, 0x5a, 0x0c, 0x0e, 0xea, 0x25, 0x28, 0x1f, 0x59, 0xce, 0x44, 0x63, 0x5e, 0xb3, + 0xae, 0xf0, 0x1e, 0x39, 0xc0, 0x2c, 0xe6, 0x15, 0x28, 0x99, 0x75, 0x64, 0x15, 0xae, 0xa4, 0xc6, + 0x3a, 0x22, 0x62, 0x98, 0x3a, 0x66, 0x16, 0xaf, 0x2b, 0xac, 0x13, 0x2a, 0x62, 0xbb, 0x61, 0x1d, + 0x32, 0xad, 0x4b, 0x8d, 0x41, 0xf5, 0x8b, 0x0a, 0xef, 0xc9, 0x7f, 0x13, 0xe0, 0xd2, 0xfc, 0x88, + 0x87, 0x6e, 0x02, 0x30, 0x97, 0x1b, 0x5c, 0xcc, 0xda, 0xc6, 0xa5, 0xd9, 0x6b, 0x71, 0x4b, 0xf3, + 0x34, 0x45, 0xa4, 0x9c, 0xa4, 0x49, 0x1c, 0x45, 0x28, 0xa6, 0xba, 0xc6, 0x43, 0x76, 0xaa, 0x0a, + 0x4a, 0x3d, 0xe0, 0x39, 0x30, 0x1e, 0xc6, 0x1d, 0x60, 0x21, 0xee, 0x00, 0x43, 0xdb, 0x15, 0x63, + 0x97, 0xdc, 0xf7, 0xb6, 0xa5, 0xf3, 0x7a, 0x5b, 0xf9, 0x17, 0xd1, 0x6d, 0xc6, 0xe2, 0x6d, 0xe4, + 0xe6, 0x0b, 0xe7, 0xba, 0xf9, 0x71, 0xf3, 0xe4, 0x33, 0x9a, 0x47, 0xfe, 0x15, 0x40, 0x55, 0xc1, + 0xae, 0x4d, 0xdc, 0x34, 0xda, 0x02, 0x11, 0x9f, 0x0c, 0x30, 0x4b, 0xfb, 0x85, 0xd4, 0xb4, 0x99, + 0x71, 0x77, 0x7d, 0x4e, 0x92, 0xb3, 0x06, 0x62, 0xe8, 0x65, 0x0e, 0x6d, 0xd2, 0x51, 0x0a, 0x17, + 0x8f, 0x62, 0x9b, 0x57, 0x7c, 0x6c, 0x53, 0x48, 0x4d, 0x53, 0x99, 0x54, 0x02, 0xdc, 0xbc, 0xcc, + 0xc1, 0x4d, 0x71, 0xc1, 0x64, 0x31, 0x74, 0xd3, 0x89, 0xa1, 0x9b, 0xd2, 0x82, 0x6d, 0xa6, 0xc0, + 0x9b, 0x4e, 0x0c, 0xde, 0x94, 0x17, 0x28, 0x49, 0xc1, 0x37, 0xaf, 0xf8, 0xf8, 0xa6, 0xb2, 0x60, + 0xdb, 0x09, 0x80, 0x73, 0x3b, 0x0e, 0x70, 0x18, 0x38, 0xb9, 0x9e, 0x2a, 0x9d, 0x8a, 0x70, 0xbe, + 0x1b, 0x41, 0x38, 0x62, 0x2a, 0xbc, 0x60, 0x4a, 0xe6, 0x40, 0x9c, 0x4e, 0x0c, 0xe2, 0xc0, 0x02, + 0x1b, 0xa4, 0x60, 0x9c, 0xb7, 0xa2, 0x18, 0xa7, 0x96, 0x0a, 0x93, 0xf8, 0xa1, 0x99, 0x07, 0x72, + 0x5e, 0x0b, 0x40, 0xce, 0x52, 0x2a, 0x4a, 0xe3, 0x7b, 0x48, 0xa2, 0x9c, 0xbd, 0x19, 0x94, 0xc3, + 0x50, 0xc9, 0xd3, 0xa9, 0x2a, 0x16, 0xc0, 0x9c, 0xbd, 0x19, 0x98, 0xd3, 0x58, 0xa0, 0x70, 0x01, + 0xce, 0xf9, 0xc9, 0x7c, 0x9c, 0x93, 0x8e, 0x44, 0xf8, 0x32, 0xb3, 0x01, 0x1d, 0x35, 0x05, 0xe8, + 0x30, 0x30, 0xf2, 0x7c, 0xaa, 0xfa, 0xcc, 0x48, 0xe7, 0xee, 0x1c, 0xa4, 0xc3, 0x30, 0xc9, 0xb3, + 0xa9, 0xca, 0x33, 0x40, 0x9d, 0xbb, 0x73, 0xa0, 0x0e, 0x5a, 0xa8, 0x36, 0x3b, 0xd6, 0x79, 0x8e, + 0xe4, 0x69, 0x09, 0x37, 0x47, 0x22, 0x19, 0x76, 0x1c, 0xcb, 0xe1, 0xb9, 0x39, 0xeb, 0xc8, 0xcf, + 0x92, 0xcc, 0x31, 0x74, 0x69, 0x67, 0xe0, 0x22, 0x9a, 0x53, 0x44, 0xdc, 0x98, 0xfc, 0x4f, 0x21, + 0x94, 0xa5, 0xc9, 0x56, 0x34, 0xeb, 0x14, 0x79, 0xd6, 0x19, 0xc1, 0x20, 0xf9, 0x38, 0x06, 0x59, + 0x94, 0x0f, 0xa0, 0x1b, 0xb0, 0x4c, 0x93, 0x41, 0x16, 0x17, 0x62, 0x21, 0xac, 0x49, 0x06, 0xd8, + 0x55, 0x62, 0xb1, 0xec, 0x45, 0xb8, 0x10, 0xe1, 0x0d, 0x52, 0x10, 0x96, 0x53, 0xb7, 0x02, 0xee, + 0x4d, 0x9e, 0x8b, 0xbc, 0x09, 0x55, 0x8e, 0x9c, 0xdc, 0xd4, 0xe2, 0x4c, 0x14, 0xf3, 0xf1, 0x60, + 0x15, 0x08, 0xc9, 0xef, 0x86, 0x16, 0x0e, 0xb1, 0x0f, 0x82, 0xe2, 0xc0, 0xd2, 0x31, 0x4f, 0x20, + 0x68, 0x9b, 0xe0, 0xa1, 0xb1, 0x35, 0xe4, 0x21, 0x99, 0x34, 0x09, 0x57, 0xe0, 0xf4, 0x45, 0xe6, + 0xd3, 0x79, 0x66, 0x9d, 0x70, 0xb6, 0x73, 0x91, 0x8b, 0xf0, 0xdf, 0x41, 0x2e, 0xf9, 0x47, 0x46, + 0x2e, 0xd1, 0x0c, 0xaf, 0x10, 0xcf, 0xf0, 0xa2, 0x56, 0x2d, 0x3e, 0x8a, 0x55, 0xff, 0x21, 0x84, + 0x67, 0x2c, 0x00, 0x32, 0x8f, 0x66, 0xd2, 0x30, 0x9d, 0x2b, 0xd1, 0x13, 0xc3, 0xd3, 0x39, 0x0e, + 0x4f, 0xcb, 0x74, 0xe1, 0x71, 0x78, 0x5a, 0x61, 0x09, 0x1e, 0xed, 0xa0, 0x57, 0x41, 0xa4, 0xe5, + 0x5a, 0xd5, 0xb2, 0x5d, 0x1e, 0xa0, 0x1e, 0x8f, 0xee, 0x85, 0x55, 0x65, 0xd7, 0xf6, 0x09, 0xcf, + 0x9e, 0xed, 0x2a, 0x55, 0x9b, 0xb7, 0x22, 0xd9, 0x96, 0x18, 0xcb, 0xb6, 0xae, 0x82, 0x48, 0x56, + 0xef, 0xda, 0xda, 0x00, 0xd3, 0x60, 0x23, 0x2a, 0x21, 0x41, 0xbe, 0x0f, 0x68, 0x36, 0xdc, 0xa1, + 0x1e, 0x94, 0xf1, 0x31, 0x36, 0x3d, 0xf2, 0xd9, 0x0b, 0xc9, 0x84, 0x88, 0xe3, 0x15, 0x6c, 0x7a, + 0x5b, 0x6d, 0x62, 0xc7, 0xbf, 0x7f, 0xb5, 0xda, 0x62, 0xdc, 0x2f, 0x58, 0x13, 0xc3, 0xc3, 0x13, + 0xdb, 0x3b, 0x55, 0xb8, 0xbc, 0xfc, 0xe7, 0x3c, 0x01, 0x0f, 0xb1, 0x50, 0x38, 0xd7, 0xb6, 0xfe, + 0x15, 0xce, 0x47, 0x80, 0x63, 0x36, 0x7b, 0xaf, 0x00, 0x0c, 0x35, 0x57, 0xfd, 0x58, 0x33, 0x3d, + 0xac, 0x73, 0xa3, 0x47, 0x28, 0x48, 0x82, 0x2a, 0xe9, 0x4d, 0x5d, 0xac, 0x73, 0x0c, 0x1b, 0xf4, + 0x23, 0xfb, 0xac, 0x7c, 0xbb, 0x7d, 0xc6, 0xad, 0x5c, 0x4d, 0x58, 0x39, 0x92, 0xb6, 0x8b, 0xd1, + 0xb4, 0x9d, 0xac, 0xcd, 0x76, 0x0c, 0xcb, 0x31, 0xbc, 0x53, 0xfa, 0x69, 0x0a, 0x4a, 0xd0, 0x47, + 0xd7, 0xa1, 0x3e, 0xc1, 0x13, 0xdb, 0xb2, 0xc6, 0x2a, 0x73, 0x9f, 0x35, 0x2a, 0xba, 0xc4, 0x89, + 0x5d, 0xea, 0x45, 0x7f, 0x1e, 0xb9, 0xbf, 0x21, 0x80, 0xfb, 0x9f, 0x33, 0xb0, 0xfc, 0x07, 0x5a, + 0xd5, 0x89, 0x27, 0x3b, 0xe8, 0x00, 0x96, 0x03, 0xff, 0xa1, 0x4e, 0xa9, 0x5f, 0xf1, 0x0f, 0x74, + 0x56, 0x07, 0xd4, 0x3a, 0x8e, 0x93, 0x5d, 0xf4, 0x03, 0xb8, 0x9c, 0xf0, 0x8d, 0x81, 0xea, 0x7c, + 0x46, 0x17, 0xf9, 0x58, 0xdc, 0x45, 0xfa, 0x9a, 0x43, 0x5b, 0x15, 0xbe, 0xa5, 0xad, 0xbe, 0xb5, + 0x3f, 0xdc, 0x86, 0x46, 0x3c, 0xf7, 0x9b, 0x7b, 0x7c, 0xae, 0x43, 0xdd, 0xc1, 0x1e, 0xc1, 0x7e, + 0xb1, 0x5a, 0xce, 0x12, 0x23, 0xf2, 0x0a, 0xd1, 0x3e, 0x3c, 0x36, 0x37, 0x07, 0x44, 0xff, 0x0f, + 0x62, 0x98, 0x3e, 0x0a, 0x29, 0x65, 0x91, 0x00, 0xe9, 0x87, 0xbc, 0xf2, 0xef, 0x84, 0x50, 0x65, + 0xbc, 0x76, 0xd0, 0x85, 0xb2, 0x83, 0xdd, 0xe9, 0x98, 0x81, 0xf5, 0xc6, 0xc6, 0x8b, 0xd9, 0xb2, + 0x47, 0x42, 0x9d, 0x8e, 0x3d, 0x85, 0x0b, 0xcb, 0xf7, 0xa1, 0xcc, 0x28, 0xa8, 0x06, 0x95, 0xbb, + 0xbb, 0x77, 0x76, 0xf7, 0xde, 0xdb, 0x6d, 0xe5, 0x10, 0x40, 0x79, 0xb3, 0xd3, 0xe9, 0xee, 0xf7, + 0x5b, 0x02, 0x12, 0xa1, 0xb4, 0xb9, 0xb5, 0xa7, 0xf4, 0x5b, 0x79, 0x42, 0x56, 0xba, 0xef, 0x74, + 0x3b, 0xfd, 0x56, 0x01, 0x2d, 0x43, 0x9d, 0xb5, 0xd5, 0xdb, 0x7b, 0xca, 0xbb, 0x9b, 0xfd, 0x56, + 0x31, 0x42, 0x3a, 0xe8, 0xee, 0xde, 0xea, 0x2a, 0xad, 0x92, 0xfc, 0x12, 0x5c, 0x49, 0xcd, 0x37, + 0x43, 0xdc, 0x2f, 0x44, 0x70, 0xbf, 0xfc, 0x59, 0x1e, 0xa4, 0xf4, 0x24, 0x12, 0xbd, 0x93, 0xd8, + 0xf8, 0xc6, 0x39, 0x32, 0xd0, 0xc4, 0xee, 0xd1, 0x53, 0xd0, 0x70, 0xf0, 0x11, 0xf6, 0x06, 0x23, + 0x96, 0xd4, 0xb2, 0x98, 0x5d, 0x57, 0xea, 0x9c, 0x4a, 0x85, 0x5c, 0xc6, 0xf6, 0x21, 0x1e, 0x78, + 0x2a, 0xf3, 0x65, 0xec, 0xd4, 0x8a, 0x84, 0x8d, 0x50, 0x0f, 0x18, 0x51, 0xfe, 0xe0, 0x5c, 0xb6, + 0x14, 0xa1, 0xa4, 0x74, 0xfb, 0xca, 0x0f, 0x5b, 0x05, 0x84, 0xa0, 0x41, 0x9b, 0xea, 0xc1, 0xee, + 0xe6, 0xfe, 0x41, 0x6f, 0x8f, 0xd8, 0xf2, 0x02, 0x34, 0x7d, 0x5b, 0xfa, 0xc4, 0x92, 0xbc, 0x0f, + 0x97, 0x53, 0x32, 0xe0, 0x47, 0x2c, 0x7d, 0xc8, 0xbf, 0x11, 0xa2, 0x2a, 0xe3, 0x65, 0x86, 0xb7, + 0x13, 0x96, 0x5e, 0xcf, 0x9a, 0x37, 0x27, 0xcd, 0x2c, 0x41, 0x15, 0xf3, 0x9a, 0x1f, 0x35, 0xf0, + 0x92, 0x12, 0xf4, 0xe5, 0x17, 0x17, 0x1b, 0x2d, 0x3c, 0x75, 0x79, 0xf9, 0xdf, 0x02, 0x34, 0x13, + 0x3e, 0x06, 0x6d, 0x40, 0x89, 0x41, 0xc3, 0xb4, 0x5f, 0xa5, 0xd4, 0x45, 0x72, 0x87, 0xc4, 0x58, + 0xd1, 0x1b, 0xb1, 0x25, 0xcd, 0xf8, 0x32, 0x66, 0x2c, 0xbf, 0x50, 0xc9, 0x45, 0x03, 0x09, 0xf4, + 0x26, 0x88, 0x81, 0xb3, 0xe4, 0xf5, 0x88, 0x27, 0x67, 0xc5, 0x03, 0x37, 0xcb, 0xe5, 0x43, 0x19, + 0xf4, 0x5a, 0x98, 0xb1, 0x17, 0x67, 0x01, 0x29, 0x17, 0x67, 0x0c, 0x5c, 0xd8, 0xe7, 0x97, 0x3b, + 0x50, 0x8b, 0xec, 0x07, 0x3d, 0x0e, 0xe2, 0x44, 0x3b, 0xe1, 0xe5, 0x6d, 0x56, 0xa0, 0xac, 0x4e, + 0xb4, 0x13, 0x56, 0xd9, 0xbe, 0x0c, 0x15, 0x32, 0x38, 0xd4, 0x5c, 0x5e, 0xd0, 0x2a, 0x4f, 0xb4, + 0x93, 0xb7, 0x35, 0x57, 0x7e, 0x1f, 0x1a, 0xf1, 0xd2, 0x2e, 0xb9, 0x8b, 0x8e, 0x35, 0x35, 0x75, + 0xaa, 0xa3, 0xa4, 0xb0, 0x0e, 0xba, 0x09, 0xa5, 0x63, 0x8b, 0xf9, 0xfb, 0xf9, 0x4e, 0xeb, 0x9e, + 0xe5, 0xe1, 0x88, 0x5b, 0x65, 0xdc, 0xf2, 0x43, 0x28, 0x51, 0xff, 0x4d, 0x5c, 0x29, 0x2d, 0xd2, + 0x72, 0xb4, 0x42, 0xda, 0xe8, 0x7d, 0x00, 0xcd, 0xf3, 0x1c, 0xe3, 0x70, 0x1a, 0x2a, 0x5e, 0x9d, + 0xef, 0xff, 0x37, 0x7d, 0xbe, 0xad, 0xab, 0x3c, 0x10, 0x5c, 0x0c, 0x45, 0x23, 0xc1, 0x20, 0xa2, + 0x50, 0xde, 0x85, 0x46, 0x5c, 0x36, 0xfa, 0xbb, 0x64, 0x69, 0xce, 0xef, 0x92, 0x20, 0x1f, 0x0d, + 0xb2, 0xd9, 0x02, 0x2b, 0xc8, 0xd3, 0x8e, 0xfc, 0x89, 0x00, 0xd5, 0xfe, 0x09, 0x3f, 0xa3, 0x29, + 0xb5, 0xe0, 0x50, 0x34, 0x1f, 0xad, 0x6b, 0xb2, 0xe2, 0x72, 0x21, 0x28, 0x59, 0xbf, 0x15, 0x5c, + 0xa8, 0x62, 0xd6, 0x42, 0x88, 0x5f, 0xc1, 0xe3, 0xee, 0xfa, 0x75, 0x10, 0x83, 0x53, 0x45, 0x60, + 0x9f, 0xa6, 0xeb, 0x0e, 0x76, 0x5d, 0xbe, 0x37, 0xbf, 0x4b, 0x7f, 0x2d, 0x58, 0x1f, 0xf3, 0xca, + 0x69, 0x41, 0x61, 0x1d, 0x59, 0x87, 0x66, 0x22, 0xf2, 0xa3, 0xd7, 0xa1, 0x62, 0x4f, 0x0f, 0x55, + 0xdf, 0x3c, 0x89, 0xcb, 0xe3, 0x27, 0xe0, 0xd3, 0xc3, 0xb1, 0x31, 0xb8, 0x83, 0x4f, 0xfd, 0xc5, + 0xd8, 0xd3, 0xc3, 0x3b, 0xcc, 0x8a, 0x6c, 0x96, 0x7c, 0x74, 0x96, 0x63, 0xa8, 0xfa, 0x87, 0x02, + 0x7d, 0x2f, 0x7a, 0x4f, 0xfc, 0x1f, 0x4e, 0xa9, 0xd9, 0x08, 0x57, 0x1f, 0xb9, 0x26, 0x37, 0x60, + 0xd9, 0x35, 0x86, 0x26, 0xd6, 0xd5, 0x10, 0x78, 0xd2, 0xd9, 0xaa, 0x4a, 0x93, 0x0d, 0xec, 0xf8, + 0xa8, 0x53, 0xfe, 0x97, 0x00, 0x55, 0xff, 0xc2, 0xa2, 0x97, 0x22, 0xe7, 0xae, 0x31, 0x27, 0x23, + 0xf0, 0x19, 0xc3, 0xbf, 0x03, 0xf1, 0xb5, 0xe6, 0xcf, 0xbf, 0xd6, 0xb4, 0xdf, 0x3c, 0x7e, 0x05, + 0xb8, 0x78, 0xee, 0xff, 0x6d, 0x2f, 0x00, 0xf2, 0x2c, 0x4f, 0x1b, 0xab, 0xc7, 0x96, 0x67, 0x98, + 0x43, 0x95, 0x19, 0x9b, 0x25, 0xa5, 0x2d, 0x3a, 0x72, 0x8f, 0x0e, 0xec, 0x53, 0xbb, 0xff, 0x54, + 0x80, 0x6a, 0x90, 0x1d, 0x9c, 0xb7, 0x94, 0x7f, 0x09, 0xca, 0x3c, 0x00, 0xb2, 0x5a, 0x3e, 0xef, + 0x05, 0xff, 0x9d, 0x8a, 0x91, 0xff, 0x4e, 0x12, 0x54, 0x27, 0xd8, 0xd3, 0x68, 0x9c, 0x61, 0xd8, + 0x3f, 0xe8, 0xdf, 0x78, 0x0d, 0x6a, 0x91, 0xff, 0x2e, 0xe4, 0xe6, 0xed, 0x76, 0xdf, 0x6b, 0xe5, + 0xa4, 0xca, 0x27, 0x9f, 0x5f, 0x2b, 0xec, 0xe2, 0x8f, 0xc9, 0x99, 0x55, 0xba, 0x9d, 0x5e, 0xb7, + 0x73, 0xa7, 0x25, 0x48, 0xb5, 0x4f, 0x3e, 0xbf, 0x56, 0x51, 0x30, 0xad, 0x15, 0xde, 0xe8, 0xc1, + 0x52, 0xf4, 0xab, 0xc4, 0xc3, 0x01, 0x82, 0xc6, 0xad, 0xbb, 0xfb, 0x3b, 0xdb, 0x9d, 0xcd, 0x7e, + 0x57, 0xbd, 0xb7, 0xd7, 0xef, 0xb6, 0x04, 0x74, 0x19, 0x2e, 0xec, 0x6c, 0xbf, 0xdd, 0xeb, 0xab, + 0x9d, 0x9d, 0xed, 0xee, 0x6e, 0x5f, 0xdd, 0xec, 0xf7, 0x37, 0x3b, 0x77, 0x5a, 0xf9, 0x8d, 0x3f, + 0xd6, 0xa0, 0xb9, 0xb9, 0xd5, 0xd9, 0x26, 0xf1, 0xdf, 0x18, 0x68, 0xbc, 0x16, 0x5b, 0xa4, 0xa5, + 0x97, 0x33, 0xdf, 0xd1, 0x48, 0x67, 0x97, 0xa2, 0xd1, 0x6d, 0x28, 0xd1, 0xaa, 0x0c, 0x3a, 0xfb, + 0x61, 0x8d, 0xb4, 0xa0, 0x36, 0x4d, 0x16, 0x43, 0xaf, 0xc7, 0x99, 0x2f, 0x6d, 0xa4, 0xb3, 0x4b, + 0xd5, 0x48, 0x01, 0x31, 0xac, 0x8a, 0x2c, 0x7e, 0x79, 0x23, 0x65, 0x28, 0x5f, 0x13, 0x9d, 0x21, + 0xb2, 0x5a, 0xfc, 0x12, 0x45, 0xca, 0xe0, 0xc0, 0xd0, 0x0e, 0x54, 0x7c, 0x30, 0xbc, 0xe8, 0x6d, + 0x8c, 0xb4, 0xb0, 0xb4, 0x4c, 0x3e, 0x01, 0x2b, 0x5a, 0x9c, 0xfd, 0xd0, 0x47, 0x5a, 0x50, 0x27, + 0x47, 0xdb, 0x50, 0xe6, 0xd9, 0xfe, 0x82, 0xf7, 0x2e, 0xd2, 0xa2, 0x52, 0x31, 0x31, 0x5a, 0x58, + 0x4e, 0x5a, 0xfc, 0x7c, 0x49, 0xca, 0xf0, 0x0b, 0x00, 0xdd, 0x05, 0x88, 0x94, 0x28, 0x32, 0xbc, + 0x4b, 0x92, 0xb2, 0x94, 0xf6, 0xd1, 0x1e, 0x54, 0x03, 0xc4, 0xb8, 0xf0, 0x95, 0x90, 0xb4, 0xb8, + 0xc6, 0x8e, 0xee, 0x43, 0x3d, 0x8e, 0x74, 0xb2, 0xbd, 0xfd, 0x91, 0x32, 0x16, 0xcf, 0x89, 0xfe, + 0x38, 0xec, 0xc9, 0xf6, 0x16, 0x48, 0xca, 0x58, 0x4b, 0x47, 0x1f, 0xc2, 0xf2, 0x2c, 0x2c, 0xc9, + 0xfe, 0x34, 0x48, 0x3a, 0x47, 0x75, 0x1d, 0x4d, 0x00, 0xcd, 0x81, 0x33, 0xe7, 0x78, 0x29, 0x24, + 0x9d, 0xa7, 0xd8, 0x8e, 0x74, 0x68, 0x26, 0x31, 0x42, 0xd6, 0x97, 0x43, 0x52, 0xe6, 0xc2, 0x3b, + 0x9b, 0x25, 0x0e, 0x1b, 0xb2, 0xbe, 0x24, 0x92, 0x32, 0xd7, 0xe1, 0xb7, 0xba, 0x5f, 0x7c, 0xbd, + 0x22, 0x7c, 0xf9, 0xf5, 0x8a, 0xf0, 0xd7, 0xaf, 0x57, 0x84, 0x4f, 0xbf, 0x59, 0xc9, 0x7d, 0xf9, + 0xcd, 0x4a, 0xee, 0x4f, 0xdf, 0xac, 0xe4, 0x7e, 0xf4, 0xfc, 0xd0, 0xf0, 0x46, 0xd3, 0xc3, 0xb5, + 0x81, 0x35, 0x59, 0x8f, 0x3e, 0xd9, 0x9c, 0xf7, 0x8c, 0xf4, 0xb0, 0x4c, 0x83, 0xee, 0xcb, 0xff, + 0x09, 0x00, 0x00, 0xff, 0xff, 0x01, 0xd0, 0x52, 0xd6, 0x66, 0x2a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4846,6 +4929,45 @@ func (m *RequestFlush) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TimeoutsInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimeoutsInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TimeoutsInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n18, err18 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.TimeoutCommit, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.TimeoutCommit):]) + if err18 != nil { + return 0, err18 + } + i -= n18 + i = encodeVarintTypes(dAtA, i, uint64(n18)) + i-- + dAtA[i] = 0x12 + n19, err19 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.TimeoutPropose, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.TimeoutPropose):]) + if err19 != nil { + return 0, err19 + } + i -= n19 + i = encodeVarintTypes(dAtA, i, uint64(n19)) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *RequestInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4988,12 +5110,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n19, err19 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err19 != nil { - return 0, err19 + n21, err21 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err21 != nil { + return 0, err21 } - i -= n19 - i = encodeVarintTypes(dAtA, i, uint64(n19)) + i -= n21 + i = encodeVarintTypes(dAtA, i, uint64(n21)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5401,12 +5523,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l - n23, err23 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err23 != nil { - return 0, err23 + n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err25 != nil { + return 0, err25 } - i -= n23 - i = encodeVarintTypes(dAtA, i, uint64(n23)) + i -= n25 + i = encodeVarintTypes(dAtA, i, uint64(n25)) i-- dAtA[i] = 0x2a if m.Height != 0 { @@ -6005,6 +6127,16 @@ func (m *ResponseInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.Timeouts.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 if len(m.LastBlockAppHash) > 0 { i -= len(m.LastBlockAppHash) copy(dAtA[i:], m.LastBlockAppHash) @@ -6101,6 +6233,16 @@ func (m *ResponseInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.Timeouts.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 if len(m.AppHash) > 0 { i -= len(m.AppHash) copy(dAtA[i:], m.AppHash) @@ -6458,6 +6600,16 @@ func (m *ResponseEndBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.Timeouts.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 if len(m.Events) > 0 { for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { { @@ -6661,20 +6813,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA49 := make([]byte, len(m.RefetchChunks)*10) - var j48 int + dAtA54 := make([]byte, len(m.RefetchChunks)*10) + var j53 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA49[j48] = uint8(uint64(num)&0x7f | 0x80) + dAtA54[j53] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j48++ + j53++ } - dAtA49[j48] = uint8(num) - j48++ + dAtA54[j53] = uint8(num) + j53++ } - i -= j48 - copy(dAtA[i:], dAtA49[:j48]) - i = encodeVarintTypes(dAtA, i, uint64(j48)) + i -= j53 + copy(dAtA[i:], dAtA54[:j53]) + i = encodeVarintTypes(dAtA, i, uint64(j53)) i-- dAtA[i] = 0x12 } @@ -7186,12 +7338,12 @@ func (m *Evidence) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n58, err58 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err58 != nil { - return 0, err58 + n63, err63 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err63 != nil { + return 0, err63 } - i -= n58 - i = encodeVarintTypes(dAtA, i, uint64(n58)) + i -= n63 + i = encodeVarintTypes(dAtA, i, uint64(n63)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -7518,6 +7670,19 @@ func (m *RequestFlush) Size() (n int) { return n } +func (m *TimeoutsInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.TimeoutPropose) + n += 1 + l + sovTypes(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.TimeoutCommit) + n += 1 + l + sovTypes(uint64(l)) + return n +} + func (m *RequestInfo) Size() (n int) { if m == nil { return 0 @@ -8076,6 +8241,8 @@ func (m *ResponseInfo) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = m.Timeouts.Size() + n += 1 + l + sovTypes(uint64(l)) return n } @@ -8119,6 +8286,8 @@ func (m *ResponseInitChain) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = m.Timeouts.Size() + n += 1 + l + sovTypes(uint64(l)) return n } @@ -8292,6 +8461,8 @@ func (m *ResponseEndBlock) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) } } + l = m.Timeouts.Size() + n += 1 + l + sovTypes(uint64(l)) return n } @@ -9400,6 +9571,122 @@ func (m *RequestFlush) Unmarshal(dAtA []byte) error { } return nil } +func (m *TimeoutsInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimeoutsInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimeoutsInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutPropose", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.TimeoutPropose, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutCommit", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.TimeoutCommit, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RequestInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -12315,6 +12602,39 @@ func (m *ResponseInfo) Unmarshal(dAtA []byte) error { m.LastBlockAppHash = []byte{} } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeouts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Timeouts.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -12602,6 +12922,39 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { m.AppHash = []byte{} } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeouts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Timeouts.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -13772,6 +14125,39 @@ func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeouts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Timeouts.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/blockchain/v0/reactor.go b/blockchain/v0/reactor.go index 090cd6f760..b7bef90957 100644 --- a/blockchain/v0/reactor.go +++ b/blockchain/v0/reactor.go @@ -410,8 +410,7 @@ FOR_LOOP: // TODO: batch saves so we dont persist to disk every block bcR.store.SaveBlock(first, firstParts, second.LastCommit) - // TODO: same thing for app - but we would need a way to - // get the hash without persisting the state + // TODO: same thing for app - but we would need a way to get the hash without persisting the state state, _, err = bcR.blockExec.ApplyBlock(state, firstID, first, second.LastCommit) if err != nil { // TODO This is bad, are we zombie? diff --git a/config/config.go b/config/config.go index e7e727e870..872b2df89a 100644 --- a/config/config.go +++ b/config/config.go @@ -167,14 +167,14 @@ type BaseConfig struct { //nolint: maligned chainID string // The root directory for all data. - // This should be set in viper so it can unmarshal into this struct + // This should be set in viper so that it can unmarshal into this struct RootDir string `mapstructure:"home"` // TCP or UNIX socket address of the ABCI application, // or the name of an ABCI application compiled in with the CometBFT binary ProxyApp string `mapstructure:"proxy_app"` - // A custom human readable name for this node + // A custom human-readable name for this node Moniker string `mapstructure:"moniker"` // If this node is many blocks behind the tip of the chain, FastSync @@ -212,7 +212,7 @@ type BaseConfig struct { //nolint: maligned // Output format: 'plain' (colored text) or 'json' LogFormat string `mapstructure:"log_format"` - // Path to the JSON file containing the initial validator set and other meta data + // Path to the JSON file containing the initial validator set and other metadata Genesis string `mapstructure:"genesis_file"` // Path to the JSON file containing the private key to use as a validator in the consensus protocol @@ -279,7 +279,7 @@ func (cfg BaseConfig) PrivValidatorKeyFile() string { return rootify(cfg.PrivValidatorKey, cfg.RootDir) } -// PrivValidatorFile returns the full path to the priv_validator_state.json file +// PrivValidatorStateFile returns the full path to the priv_validator_state.json file func (cfg BaseConfig) PrivValidatorStateFile() string { return rootify(cfg.PrivValidatorState, cfg.RootDir) } @@ -871,7 +871,7 @@ func DefaultStateSyncConfig() *StateSyncConfig { } } -// TestFastSyncConfig returns a default configuration for the state sync service +// TestStateSyncConfig returns a default configuration for the state sync service func TestStateSyncConfig() *StateSyncConfig { return DefaultStateSyncConfig() } @@ -1055,6 +1055,20 @@ func (cfg *ConsensusConfig) Propose(round int32) time.Duration { ) * time.Nanosecond } +// ProposeWithCustomTimeout is identical to Propose. However, +// it calculates the amount of time to wait for a proposal using the supplied +// customTimeout. +// If customTimeout is 0, the TimeoutPropose from cfg is used. +func (cfg *ConsensusConfig) ProposeWithCustomTimeout(round int32, customTimeout time.Duration) time.Duration { + // this is to capture any unforeseen cases where the customTimeout is 0 + var timeoutPropose = customTimeout + if timeoutPropose == 0 { + // falling back to default timeout + timeoutPropose = cfg.TimeoutPropose + } + return time.Duration(timeoutPropose.Nanoseconds()+cfg.TimeoutProposeDelta.Nanoseconds()*int64(round)) * time.Nanosecond +} + // Prevote returns the amount of time to wait for straggler votes after receiving any +2/3 prevotes func (cfg *ConsensusConfig) Prevote(round int32) time.Duration { return time.Duration( @@ -1070,11 +1084,23 @@ func (cfg *ConsensusConfig) Precommit(round int32) time.Duration { } // Commit returns the amount of time to wait for straggler votes after receiving +2/3 precommits -// for a single block (ie. a commit). +// for a single block (i.e., a commit). func (cfg *ConsensusConfig) Commit(t time.Time) time.Time { return t.Add(cfg.TimeoutCommit) } +// CommitWithCustomTimeout is identical to Commit. However, it calculates the time for commit using the supplied customTimeout. +// If customTimeout is 0, the TimeoutCommit from cfg is used. +func (cfg *ConsensusConfig) CommitWithCustomTimeout(t time.Time, customTimeout time.Duration) time.Time { + // this is to capture any unforeseen cases where the customTimeout is 0 + var timeoutCommit = customTimeout + if timeoutCommit == 0 { + // falling back to default timeout + timeoutCommit = cfg.TimeoutCommit + } + return t.Add(timeoutCommit) +} + // WalFile returns the full path to the write-ahead log file func (cfg *ConsensusConfig) WalFile() string { if cfg.walFile != "" { @@ -1091,6 +1117,8 @@ func (cfg *ConsensusConfig) SetWalFile(walFile string) { // ValidateBasic performs basic validation (checking param bounds, etc.) and // returns an error if any check fails. func (cfg *ConsensusConfig) ValidateBasic() error { + // TODO we may want to remove this check if TimeoutPropose is removed from + // the config if cfg.TimeoutPropose < 0 { return errors.New("timeout_propose can't be negative") } @@ -1109,6 +1137,8 @@ func (cfg *ConsensusConfig) ValidateBasic() error { if cfg.TimeoutPrecommitDelta < 0 { return errors.New("timeout_precommit_delta can't be negative") } + // TODO we may want to remove this check if TimeoutCommit is removed from + // the config if cfg.TimeoutCommit < 0 { return errors.New("timeout_commit can't be negative") } diff --git a/config/config_test.go b/config/config_test.go index 43f0a46c49..1508172e5f 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -190,3 +190,31 @@ func TestInstrumentationConfigValidateBasic(t *testing.T) { cfg.MaxOpenConnections = -1 assert.Error(t, cfg.ValidateBasic()) } + +func TestProposeWithCustomTimeout(t *testing.T) { + cfg := DefaultConsensusConfig() + + // customTimeout is 0, should fallback to default timeout + round := int32(1) + expectedTimeout := time.Duration(cfg.TimeoutPropose.Nanoseconds()+cfg.TimeoutProposeDelta.Nanoseconds()*int64(round)) * time.Nanosecond + assert.Equal(t, expectedTimeout, cfg.ProposeWithCustomTimeout(round, time.Duration(0))) + + // customTimeout is not 0 + customTimeout := 2 * time.Second + expectedTimeout = time.Duration(customTimeout.Nanoseconds()+cfg.TimeoutProposeDelta.Nanoseconds()*int64(round)) * time.Nanosecond + assert.Equal(t, expectedTimeout, cfg.ProposeWithCustomTimeout(round, customTimeout)) +} + +func TestCommitWithCustomTimeout(t *testing.T) { + cfg := DefaultConsensusConfig() + + // customTimeout is 0, should fallback to default timeout + inputTime := time.Now() + expectedTime := inputTime.Add(cfg.TimeoutCommit) + assert.Equal(t, expectedTime, cfg.CommitWithCustomTimeout(inputTime, time.Duration(0))) + + // customTimeout is not 0 + customTimeout := 2 * time.Second + expectedTime = inputTime.Add(customTimeout) + assert.Equal(t, expectedTime, cfg.CommitWithCustomTimeout(inputTime, customTimeout)) +} diff --git a/consensus/mempool_test.go b/consensus/mempool_test.go index beb91d154d..d6c4e09e51 100644 --- a/consensus/mempool_test.go +++ b/consensus/mempool_test.go @@ -75,7 +75,7 @@ func TestMempoolProgressInHigherRound(t *testing.T) { timeoutCh := subscribe(cs.eventBus, types.EventQueryTimeoutPropose) cs.setProposal = func(proposal *types.Proposal) error { if cs.Height == 2 && cs.Round == 0 { - // dont set the proposal in round 0 so we timeout and + // don't set the proposal in round 0 so we timeout and // go to next round cs.Logger.Info("Ignoring set proposal at height 2, round 0") return nil @@ -91,7 +91,11 @@ func TestMempoolProgressInHigherRound(t *testing.T) { round = 0 ensureNewRound(newRoundCh, height, round) // first round at next height - deliverTxsRange(cs, 0, 1) // we deliver txs, but dont set a proposal so we get the next round + deliverTxsRange(cs, 0, 1) // we deliver txs, but don't set a proposal so we get the next round + // The use of cs.config.TimeoutPropose.Nanoseconds() as the timeout propose is acceptable in this test case, the following line. + // Even though timeouts are version-dependent, cs is created with an empty previous state in this scenario. + // As there's no timeout propose in the previous state, we default to the timeout propose in the config. + // This makes the test case valid. ensureNewTimeout(timeoutCh, height, round, cs.config.TimeoutPropose.Nanoseconds()) round++ // moving to the next round diff --git a/consensus/replay.go b/consensus/replay.go index 9c88c620ab..bb261c3b09 100644 --- a/consensus/replay.go +++ b/consensus/replay.go @@ -156,8 +156,8 @@ LOOP: } // NOTE: since the priv key is set when the msgs are received - // it will attempt to eg double sign but we can just ignore it - // since the votes will be replayed and we'll get to the next step + // it will attempt to e.g., double sign, but we can just ignore it + // since the votes will be replayed, and we'll get to the next step if err := cs.readReplayMessage(msg, nil); err != nil { return err } @@ -362,6 +362,11 @@ func (h *Handshaker) ReplayBlocksWithContext( state.ConsensusParams = types.UpdateConsensusParams(state.ConsensusParams, res.ConsensusParams) state.Version.Consensus.App = state.ConsensusParams.Version.AppVersion } + + // update timeouts based on the InitChainSync response + state.TimeoutCommit = res.Timeouts.TimeoutCommit + state.TimeoutPropose = res.Timeouts.TimeoutPropose + // We update the last results hash with the empty hash, to conform with RFC-6962. state.LastResultsHash = merkle.HashFromByteSlices(nil) if err := h.stateStore.Save(state); err != nil { diff --git a/consensus/replay_file.go b/consensus/replay_file.go index ae85d557fd..44cee21879 100644 --- a/consensus/replay_file.go +++ b/consensus/replay_file.go @@ -29,7 +29,7 @@ const ( //-------------------------------------------------------- // replay messages interactively or all at once -// replay the wal file +// RunReplayFile replays the wal file func RunReplayFile(config cfg.BaseConfig, csConfig *cfg.ConsensusConfig, console bool) { consensusState := newConsensusStateForReplay(config, csConfig) @@ -38,7 +38,7 @@ func RunReplayFile(config cfg.BaseConfig, csConfig *cfg.ConsensusConfig, console } } -// Replay msgs in file or start the console +// ReplayFile replays msgs in file or start the console func (cs *State) ReplayFile(file string, console bool) error { if cs.IsRunning() { diff --git a/consensus/state.go b/consensus/state.go index 503267dfe7..18cf1b4be7 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -674,9 +674,21 @@ func (cs *State) updateToState(state sm.State) { // to be gathered for the first block. // And alternative solution that relies on clocks: // cs.StartTime = state.LastBlockTime.Add(timeoutCommit) - cs.StartTime = cs.config.Commit(cmttime.Now()) + + if state.LastBlockHeight == 0 { + // Don't use cs.state.TimeoutCommit because that is zero + cs.StartTime = cs.config.CommitWithCustomTimeout(cmttime.Now(), state.TimeoutCommit) + } else { + cs.StartTime = cs.config.CommitWithCustomTimeout(cmttime.Now(), cs.state.TimeoutCommit) + } + } else { - cs.StartTime = cs.config.Commit(cs.CommitTime) + if state.LastBlockHeight == 0 { + cs.StartTime = cs.config.CommitWithCustomTimeout(cs.CommitTime, state.TimeoutCommit) + } else { + cs.StartTime = cs.config.CommitWithCustomTimeout(cs.CommitTime, cs.state.TimeoutCommit) + } + } cs.Validators = validators @@ -1113,7 +1125,7 @@ func (cs *State) enterPropose(height int64, round int32) { }() // If we don't get the proposal and all block parts quick enough, enterPrevote - cs.scheduleTimeout(cs.config.Propose(round), height, round, cstypes.RoundStepPropose) + cs.scheduleTimeout(cs.config.ProposeWithCustomTimeout(round, cs.state.TimeoutPropose), height, round, cstypes.RoundStepPropose) // Nothing more to do if we're not a validator if cs.privValidator == nil { @@ -1682,7 +1694,7 @@ func (cs *State) finalizeCommit(height int64) { // exists. // // Either way, the State should not be resumed until we - // successfully call ApplyBlock (ie. later here, or in Handshake after + // successfully call ApplyBlock (i.e., later here, or in Handshake after // restart). endMsg := EndHeightMessage{height} if err := cs.wal.WriteSync(endMsg); err != nil { // NOTE: fsync @@ -1698,7 +1710,7 @@ func (cs *State) finalizeCommit(height int64) { stateCopy := cs.state.Copy() // Execute and commit the block, update and save the state, and update the mempool. - // NOTE The block.AppHash wont reflect these txs until the next block. + // NOTE The block.AppHash won't reflect these txs until the next block. var ( err error retainHeight int64 @@ -1741,7 +1753,7 @@ func (cs *State) finalizeCommit(height int64) { fail.Fail() // XXX - // Private validator might have changed it's key pair => refetch pubkey. + // Private validator might have changed its key pair => refetch pubkey. if err := cs.updatePrivValidatorPubKey(); err != nil { logger.Error("failed to get private validator pubkey", "err", err) } diff --git a/consensus/state_test.go b/consensus/state_test.go index 5b6f5c6545..4671018525 100644 --- a/consensus/state_test.go +++ b/consensus/state_test.go @@ -144,6 +144,10 @@ func TestStateEnterProposeNoPrivValidator(t *testing.T) { startTestRound(cs, height, round) // if we're not a validator, EnterPropose should timeout + // The use of cs.config.TimeoutPropose.Nanoseconds() as the timeout propose is acceptable in this test case. + // Even though timeouts are version-dependent, cs is created with an empty previous state in this scenario. + // As there's no timeout propose in the previous state, we default to the timeout propose in the config. + // This makes the test case valid. ensureNewTimeout(timeoutCh, height, round, cs.config.TimeoutPropose.Nanoseconds()) if cs.GetRoundState().Proposal != nil { @@ -179,6 +183,10 @@ func TestStateEnterProposeYesPrivValidator(t *testing.T) { } // if we're a validator, enterPropose should not timeout + // The use of cs.config.TimeoutPropose.Nanoseconds() as the timeout propose is acceptable in this test case. + // Even though timeouts are version-dependent, cs is created with an empty previous state in this scenario. + // As there's no timeout propose in the previous state, we default to the timeout propose in the config. + // This makes the test case valid. ensureNoNewTimeout(timeoutCh, cs.config.TimeoutPropose.Nanoseconds()) } @@ -310,7 +318,7 @@ func TestStateOversizedBlock(t *testing.T) { lockedRound = -1 // if the block is oversized cs1 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(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) // and then should send nil prevote and precommit regardless of whether other validators prevote and // precommit on it } @@ -497,7 +505,7 @@ func TestStateLockNoPOL(t *testing.T) { incrementRound(vs2) // now we're on a new round and not the proposer, so wait for timeout - ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) rs := cs1.GetRoundState() @@ -1029,7 +1037,7 @@ func TestStateLockPOLSafety1(t *testing.T) { */ // timeout of propose - ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) // finish prevote ensurePrevote(voteCh, height, round) @@ -1199,7 +1207,7 @@ func TestProposeValidBlock(t *testing.T) { t.Log("### ONTO ROUND 2") // timeout of propose - ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) ensurePrevote(voteCh, height, round) validatePrevote(t, cs1, round, vss[0], propBlockHash) @@ -1326,7 +1334,7 @@ func TestSetValidBlockOnDelayedProposal(t *testing.T) { startTestRound(cs1, cs1.Height, round) ensureNewRound(newRoundCh, height, round) - ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) ensurePrevote(voteCh, height, round) validatePrevote(t, cs1, round, vss[0], nil) @@ -1407,7 +1415,7 @@ func TestWaitingTimeoutProposeOnNewRound(t *testing.T) { rs := cs1.GetRoundState() assert.True(t, rs.Step == cstypes.RoundStepPropose) // P0 does not prevote before timeoutPropose expires - ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) ensurePrevote(voteCh, height, round) validatePrevote(t, cs1, round, vss[0], nil) @@ -1471,7 +1479,7 @@ func TestWaitTimeoutProposeOnNilPolkaForTheCurrentRound(t *testing.T) { incrementRound(vss[1:]...) signAddVotes(cs1, cmtproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4) - ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) ensurePrevote(voteCh, height, round) validatePrevote(t, cs1, round, vss[0], nil) @@ -1619,7 +1627,7 @@ func TestStartNextHeightCorrectlyAfterTimeout(t *testing.T) { cs1.txNotifier.(*fakeTxNotifier).Notify() - ensureNewTimeout(timeoutProposeCh, height+1, round, cs1.config.Propose(round).Nanoseconds()) + ensureNewTimeout(timeoutProposeCh, height+1, round, cs1.config.ProposeWithCustomTimeout(round, cs1.state.TimeoutPropose).Nanoseconds()) rs = cs1.GetRoundState() assert.False( t, diff --git a/node/node.go b/node/node.go index d98a9c34ee..810d3264d4 100644 --- a/node/node.go +++ b/node/node.go @@ -854,13 +854,18 @@ func NewNodeWithContext(ctx context.Context, } // Reload the state. It will have the Version.Consensus.App set by the - // Handshake, and may have other modifications as well (ie. depending on + // Handshake, and may have other modifications as well (i.e., depending on // what happened during block replay). state, err = stateStore.Load() + logger.Info("Loaded state after doHandshake", "height", + state.LastBlockHeight, "app_version", + state.Version.Consensus.App, "timeout_commit", state.TimeoutCommit, "timeout_propose", state.TimeoutPropose) if err != nil { + logger.Info("Error loading state after doHandshake", "err", err) return nil, fmt.Errorf("cannot load state: %w", err) } } else { + logger.Info("Skipping handshake, Starting state sync") resp, err := proxyApp.Query().InfoSync(proxy.RequestInfo) if err != nil { return nil, fmt.Errorf("error during info call: %w", err) @@ -869,7 +874,7 @@ func NewNodeWithContext(ctx context.Context, } // Determine whether we should do fast sync. This must happen after the handshake, since the - // app may modify the validator set, specifying ourself as the only validator. + // app may modify the validator set, specifying ourselves as the only validator. fastSync := config.FastSyncMode && !onlyValidatorIsUs(state, pubKey) logNodeStartupInfo(state, pubKey, logger, consensusLogger) @@ -925,6 +930,7 @@ func NewNodeWithContext(ctx context.Context, privValidator, csMetrics, stateSync || fastSync, eventBus, consensusLogger, tracer, ) + logger.Info("Consensus reactor created", "timeout_propose", consensusState.GetState().TimeoutPropose, "timeout_commit", consensusState.GetState().TimeoutCommit) // Set up state sync reactor, and schedule a sync if requested. // FIXME The way we do phased startups (e.g. replay -> fast sync -> consensus) is very messy, // we should clean this whole thing up. See: @@ -1044,7 +1050,7 @@ func (n *Node) OnStart() error { n.addrBook.AddPrivateIDs(splitAndTrimEmpty(n.config.P2P.PrivatePeerIDs, ",", " ")) // Start the RPC server before the P2P server - // so we can eg. receive txs for the first block + // so we can e.g., receive txs for the first block if n.config.RPC.ListenAddress != "" { listeners, err := n.startRPC() if err != nil { @@ -1536,7 +1542,7 @@ func LoadStateFromDBOrGenesisDocProvider( return sm.State{}, nil, err } // save genesis doc to prevent a certain class of user errors (e.g. when it - // was changed, accidentally or not). Also good for audit trail. + // was changed, accidentally or not). Also, good for audit trail. if err := saveGenesisDoc(stateDB, genDoc); err != nil { return sm.State{}, nil, err } diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 758ab344e6..2adc2ba797 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -11,6 +11,7 @@ import "tendermint/crypto/keys.proto"; import "tendermint/types/params.proto"; import "google/protobuf/timestamp.proto"; import "gogoproto/gogo.proto"; +import "google/protobuf/duration.proto"; // This file is copied from http://github.com/tendermint/abci // NOTE: When using custom types, mind the warnings. @@ -47,6 +48,11 @@ message RequestEcho { message RequestFlush {} +message TimeoutsInfo { + google.protobuf.Duration timeout_propose = 1 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + google.protobuf.Duration timeout_commit = 2 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; +} + message RequestInfo { string version = 1; uint64 block_version = 2; @@ -108,9 +114,9 @@ message RequestListSnapshots {} // offers a snapshot to the application message RequestOfferSnapshot { - Snapshot snapshot = 1; // snapshot offered by peers - bytes app_hash = 2; // light client-verified app hash for snapshot height - uint64 app_version = 3; // The application version at which the snapshot was taken + Snapshot snapshot = 1; // snapshot offered by peers + bytes app_hash = 2; // light client-verified app hash for snapshot height + uint64 app_version = 3; // The application version at which the snapshot was taken } // loads a snapshot chunk @@ -194,6 +200,8 @@ message ResponseInfo { int64 last_block_height = 4; bytes last_block_app_hash = 5; + + TimeoutsInfo timeouts = 6 [(gogoproto.nullable) = false]; } // nondeterministic @@ -208,6 +216,7 @@ message ResponseInitChain { ConsensusParams consensus_params = 1; repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; bytes app_hash = 3; + TimeoutsInfo timeouts = 4 [(gogoproto.nullable) = false]; } message ResponseQuery { @@ -265,6 +274,7 @@ message ResponseEndBlock { ConsensusParams consensus_param_updates = 2; repeated Event events = 3 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; + TimeoutsInfo timeouts = 4 [(gogoproto.nullable) = false]; } message ResponseCommit { diff --git a/proto/tendermint/state/types.pb.go b/proto/tendermint/state/types.pb.go index 6b57ca1ae8..122cda8ebb 100644 --- a/proto/tendermint/state/types.pb.go +++ b/proto/tendermint/state/types.pb.go @@ -330,6 +330,8 @@ type State struct { LastResultsHash []byte `protobuf:"bytes,12,opt,name=last_results_hash,json=lastResultsHash,proto3" json:"last_results_hash,omitempty"` // the latest AppHash we've received from calling abci.Commit() AppHash []byte `protobuf:"bytes,13,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + // timeouts to be used for the next block height + Timeouts types.TimeoutsInfo `protobuf:"bytes,15,opt,name=timeouts,proto3" json:"timeouts"` } func (m *State) Reset() { *m = State{} } @@ -463,6 +465,13 @@ func (m *State) GetAppHash() []byte { return nil } +func (m *State) GetTimeouts() types.TimeoutsInfo { + if m != nil { + return m.Timeouts + } + return types.TimeoutsInfo{} +} + func init() { proto.RegisterType((*ABCIResponses)(nil), "tendermint.state.ABCIResponses") proto.RegisterType((*ValidatorsInfo)(nil), "tendermint.state.ValidatorsInfo") @@ -475,58 +484,59 @@ func init() { func init() { proto.RegisterFile("tendermint/state/types.proto", fileDescriptor_ccfacf933f22bf93) } var fileDescriptor_ccfacf933f22bf93 = []byte{ - // 805 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x8e, 0xe3, 0x44, - 0x10, 0x8e, 0xc9, 0x6e, 0x7e, 0xca, 0x93, 0x64, 0xb7, 0x07, 0x21, 0x6f, 0x96, 0x75, 0xb2, 0xe1, - 0x47, 0x23, 0x0e, 0x8e, 0xb4, 0x1c, 0x10, 0x97, 0x95, 0xd6, 0x09, 0xb0, 0x91, 0x56, 0x08, 0x3c, - 0xa3, 0x39, 0x70, 0xb1, 0x3a, 0x71, 0x8f, 0x6d, 0x91, 0xd8, 0x96, 0xbb, 0x13, 0x86, 0x07, 0xe0, - 0x3e, 0x57, 0xde, 0x68, 0x8e, 0x73, 0x44, 0x1c, 0x06, 0xc8, 0xbc, 0x08, 0xea, 0x1f, 0xdb, 0x9d, - 0x84, 0x91, 0x06, 0xed, 0xad, 0x5d, 0xf5, 0xd5, 0x57, 0x5f, 0x55, 0x57, 0xb5, 0xe1, 0x63, 0x46, - 0x92, 0x80, 0xe4, 0xab, 0x38, 0x61, 0x63, 0xca, 0x30, 0x23, 0x63, 0xf6, 0x6b, 0x46, 0xa8, 0x93, - 0xe5, 0x29, 0x4b, 0xd1, 0x93, 0xca, 0xeb, 0x08, 0x6f, 0xff, 0xc3, 0x30, 0x0d, 0x53, 0xe1, 0x1c, - 0xf3, 0x93, 0xc4, 0xf5, 0x9f, 0x6b, 0x2c, 0x78, 0xbe, 0x88, 0x75, 0x92, 0xbe, 0x9e, 0x42, 0xd8, - 0x77, 0xbc, 0xc3, 0x03, 0xef, 0x06, 0x2f, 0xe3, 0x00, 0xb3, 0x34, 0x57, 0x88, 0x17, 0x07, 0x88, - 0x0c, 0xe7, 0x78, 0x55, 0x10, 0xd8, 0x9a, 0x7b, 0x43, 0x72, 0x1a, 0xa7, 0xc9, 0x4e, 0x82, 0x41, - 0x98, 0xa6, 0xe1, 0x92, 0x8c, 0xc5, 0xd7, 0x7c, 0x7d, 0x31, 0x66, 0xf1, 0x8a, 0x50, 0x86, 0x57, - 0x99, 0x04, 0x8c, 0xfe, 0x34, 0xa0, 0xf3, 0xc6, 0x9d, 0xcc, 0x3c, 0x42, 0xb3, 0x34, 0xa1, 0x84, - 0xa2, 0x09, 0x98, 0x01, 0x59, 0xc6, 0x1b, 0x92, 0xfb, 0xec, 0x92, 0x5a, 0xc6, 0xb0, 0x7e, 0x62, - 0xbe, 0x1a, 0x39, 0x5a, 0x33, 0x78, 0x91, 0x4e, 0x11, 0x30, 0x95, 0xd8, 0xb3, 0x4b, 0x0f, 0x82, - 0xe2, 0x48, 0xd1, 0x6b, 0x68, 0x93, 0x24, 0xf0, 0xe7, 0xcb, 0x74, 0xf1, 0xb3, 0xf5, 0xc1, 0xd0, - 0x38, 0x31, 0x5f, 0xbd, 0xbc, 0x97, 0xe2, 0x9b, 0x24, 0x70, 0x39, 0xd0, 0x6b, 0x11, 0x75, 0x42, - 0x53, 0x30, 0xe7, 0x24, 0x8c, 0x13, 0xc5, 0x50, 0x17, 0x0c, 0x9f, 0xdc, 0xcb, 0xe0, 0x72, 0xac, - 0xe4, 0x80, 0x79, 0x79, 0x1e, 0xfd, 0x66, 0x40, 0xf7, 0xbc, 0x68, 0x28, 0x9d, 0x25, 0x17, 0x29, - 0x9a, 0x40, 0xa7, 0x6c, 0xb1, 0x4f, 0x09, 0xb3, 0x0c, 0x41, 0x6d, 0xeb, 0xd4, 0xb2, 0x81, 0x65, - 0xe0, 0x29, 0x61, 0xde, 0xd1, 0x46, 0xfb, 0x42, 0x0e, 0x1c, 0x2f, 0x31, 0x65, 0x7e, 0x44, 0xe2, - 0x30, 0x62, 0xfe, 0x22, 0xc2, 0x49, 0x48, 0x02, 0x51, 0x67, 0xdd, 0x7b, 0xca, 0x5d, 0x6f, 0x85, - 0x67, 0x22, 0x1d, 0xa3, 0xdf, 0x0d, 0x38, 0x9e, 0x70, 0x9d, 0x09, 0x5d, 0xd3, 0x1f, 0xc4, 0xfd, - 0x09, 0x31, 0x1e, 0x3c, 0x59, 0x14, 0x66, 0x5f, 0xde, 0xab, 0xd2, 0xf3, 0xf2, 0x50, 0xcf, 0x1e, - 0x81, 0xfb, 0xe8, 0xfa, 0x76, 0x50, 0xf3, 0x7a, 0x8b, 0x5d, 0xf3, 0xff, 0xd6, 0x46, 0xe1, 0xe9, - 0xce, 0xfd, 0x0b, 0x61, 0xdf, 0x42, 0x97, 0xf7, 0xd7, 0xcf, 0x0b, 0xab, 0x92, 0x35, 0x70, 0xf6, - 0x77, 0xc2, 0xd9, 0x09, 0xf6, 0x3a, 0x3c, 0xac, 0x9a, 0xa5, 0x8f, 0xa0, 0x21, 0x75, 0xa8, 0xfc, - 0xea, 0x6b, 0x14, 0x41, 0xf3, 0x5c, 0x4e, 0x2b, 0x7a, 0x03, 0xed, 0xb2, 0x04, 0x95, 0xe5, 0x85, - 0x9e, 0x45, 0x4d, 0x75, 0x55, 0xbe, 0x2a, 0xbc, 0x8a, 0x42, 0x7d, 0x68, 0xd1, 0xf4, 0x82, 0xfd, - 0x82, 0x73, 0x22, 0xf2, 0xb4, 0xbd, 0xf2, 0x7b, 0xf4, 0x4f, 0x03, 0x1e, 0x9f, 0x72, 0xa1, 0xe8, - 0x6b, 0x68, 0x2a, 0x2e, 0x95, 0xe6, 0xd9, 0x61, 0x31, 0x4a, 0x94, 0x4a, 0x51, 0xe0, 0xd1, 0xe7, - 0xd0, 0x5a, 0x44, 0x38, 0x4e, 0xfc, 0x58, 0x36, 0xb2, 0xed, 0x9a, 0xdb, 0xdb, 0x41, 0x73, 0xc2, - 0x6d, 0xb3, 0xa9, 0xd7, 0x14, 0xce, 0x59, 0x80, 0x3e, 0x83, 0x6e, 0x9c, 0xc4, 0x2c, 0xc6, 0x4b, - 0xd5, 0x7e, 0xab, 0x2b, 0xca, 0xee, 0x28, 0xab, 0xec, 0x3c, 0xfa, 0x02, 0xc4, 0x3d, 0xc8, 0xd9, - 0x2e, 0x90, 0x75, 0x81, 0xec, 0x71, 0x87, 0x18, 0x5e, 0x85, 0xf5, 0xa0, 0xa3, 0x61, 0xe3, 0xc0, - 0x7a, 0x74, 0xa8, 0x5d, 0xce, 0x87, 0x88, 0x9a, 0x4d, 0xdd, 0x63, 0xae, 0x7d, 0x7b, 0x3b, 0x30, - 0xdf, 0x15, 0x54, 0xb3, 0xa9, 0x67, 0x96, 0xbc, 0xb3, 0x00, 0xbd, 0x83, 0x9e, 0xc6, 0xc9, 0x5f, - 0x04, 0xeb, 0xb1, 0x60, 0xed, 0x3b, 0xf2, 0xb9, 0x70, 0x8a, 0xe7, 0xc2, 0x39, 0x2b, 0x9e, 0x0b, - 0xb7, 0xc5, 0x69, 0xaf, 0xfe, 0x1a, 0x18, 0x5e, 0xa7, 0xe4, 0xe2, 0x5e, 0xf4, 0x1d, 0xf4, 0x12, - 0x72, 0xc9, 0xfc, 0x72, 0x43, 0xa8, 0xd5, 0x78, 0xd0, 0x4e, 0x75, 0x79, 0x58, 0xb5, 0x9e, 0xe8, - 0x35, 0x80, 0xc6, 0xd1, 0x7c, 0x10, 0x87, 0x16, 0xc1, 0x85, 0x88, 0xb2, 0x34, 0x92, 0xd6, 0xc3, - 0x84, 0xf0, 0x30, 0x4d, 0xc8, 0x04, 0x6c, 0x7d, 0x85, 0x2a, 0xbe, 0x72, 0x9b, 0xda, 0xe2, 0xb2, - 0x9e, 0x57, 0xdb, 0x54, 0x45, 0xab, 0xbd, 0xfa, 0xcf, 0xdd, 0x86, 0xf7, 0xdc, 0xed, 0xef, 0xe1, - 0xd3, 0x9d, 0xdd, 0xde, 0xe3, 0x2f, 0xe5, 0x99, 0x42, 0xde, 0x50, 0x5b, 0xf6, 0x5d, 0xa2, 0x42, - 0x63, 0x31, 0x88, 0x39, 0xa1, 0xeb, 0x25, 0xa3, 0x7e, 0x84, 0x69, 0x64, 0x1d, 0x0d, 0x8d, 0x93, - 0x23, 0x39, 0x88, 0x9e, 0xb4, 0xbf, 0xc5, 0x34, 0x42, 0xcf, 0xa0, 0x85, 0xb3, 0x4c, 0x42, 0x3a, - 0x02, 0xd2, 0xc4, 0x59, 0xc6, 0x5d, 0xee, 0x8f, 0xd7, 0x5b, 0xdb, 0xb8, 0xd9, 0xda, 0xc6, 0xdf, - 0x5b, 0xdb, 0xb8, 0xba, 0xb3, 0x6b, 0x37, 0x77, 0x76, 0xed, 0x8f, 0x3b, 0xbb, 0xf6, 0xd3, 0x57, - 0x61, 0xcc, 0xa2, 0xf5, 0xdc, 0x59, 0xa4, 0xab, 0xb1, 0xfe, 0x23, 0xab, 0x8e, 0xf2, 0x6f, 0xba, - 0xff, 0x1f, 0x9e, 0x37, 0x84, 0xfd, 0xcb, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x1a, 0xb9, - 0x2e, 0xa2, 0x07, 0x00, 0x00, + // 829 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0x8f, 0xc9, 0x6e, 0x93, 0x3c, 0x37, 0xc9, 0xee, 0x14, 0x21, 0x6f, 0x96, 0x75, 0xb2, 0xe1, + 0x8f, 0x2a, 0x0e, 0x8e, 0xb4, 0x1c, 0x10, 0x97, 0x45, 0xeb, 0x04, 0x68, 0xa4, 0x0a, 0x81, 0x5b, + 0xf5, 0xc0, 0xc5, 0x9a, 0xc4, 0x53, 0xdb, 0x22, 0xb1, 0x2d, 0xcf, 0x24, 0x94, 0x0f, 0xc0, 0xbd, + 0x57, 0xae, 0x7c, 0x9a, 0x1e, 0x7b, 0x44, 0x1c, 0x0a, 0x4a, 0xbf, 0x08, 0x9a, 0x3f, 0xb6, 0x27, + 0x09, 0x95, 0x8a, 0xb8, 0x8d, 0xdf, 0xfb, 0xbd, 0xdf, 0xfb, 0xbd, 0x37, 0xef, 0x8d, 0xe1, 0x43, + 0x46, 0x92, 0x80, 0xe4, 0xcb, 0x38, 0x61, 0x23, 0xca, 0x30, 0x23, 0x23, 0xf6, 0x4b, 0x46, 0xa8, + 0x93, 0xe5, 0x29, 0x4b, 0xd1, 0xb3, 0xca, 0xeb, 0x08, 0x6f, 0xef, 0xfd, 0x30, 0x0d, 0x53, 0xe1, + 0x1c, 0xf1, 0x93, 0xc4, 0xf5, 0x5e, 0x6a, 0x2c, 0x78, 0x36, 0x8f, 0x75, 0x92, 0x9e, 0x9e, 0x42, + 0xd8, 0xb7, 0xbc, 0x83, 0x3d, 0xef, 0x1a, 0x2f, 0xe2, 0x00, 0xb3, 0x34, 0x57, 0x88, 0x57, 0x7b, + 0x88, 0x0c, 0xe7, 0x78, 0x59, 0x10, 0xd8, 0x9a, 0x7b, 0x4d, 0x72, 0x1a, 0xa7, 0xc9, 0x56, 0x82, + 0x7e, 0x98, 0xa6, 0xe1, 0x82, 0x8c, 0xc4, 0xd7, 0x6c, 0x75, 0x39, 0x62, 0xf1, 0x92, 0x50, 0x86, + 0x97, 0x99, 0x04, 0x0c, 0xff, 0x34, 0xa0, 0xfd, 0xce, 0x1d, 0x4f, 0x3d, 0x42, 0xb3, 0x34, 0xa1, + 0x84, 0xa2, 0x31, 0x98, 0x01, 0x59, 0xc4, 0x6b, 0x92, 0xfb, 0xec, 0x8a, 0x5a, 0xc6, 0xa0, 0x7e, + 0x6c, 0xbe, 0x19, 0x3a, 0x5a, 0x33, 0x78, 0x91, 0x4e, 0x11, 0x30, 0x91, 0xd8, 0xf3, 0x2b, 0x0f, + 0x82, 0xe2, 0x48, 0xd1, 0x5b, 0x68, 0x91, 0x24, 0xf0, 0x67, 0x8b, 0x74, 0xfe, 0x93, 0xf5, 0xde, + 0xc0, 0x38, 0x36, 0xdf, 0xbc, 0x7e, 0x90, 0xe2, 0xeb, 0x24, 0x70, 0x39, 0xd0, 0x6b, 0x12, 0x75, + 0x42, 0x13, 0x30, 0x67, 0x24, 0x8c, 0x13, 0xc5, 0x50, 0x17, 0x0c, 0x1f, 0x3d, 0xc8, 0xe0, 0x72, + 0xac, 0xe4, 0x80, 0x59, 0x79, 0x1e, 0xfe, 0x6a, 0x40, 0xe7, 0xa2, 0x68, 0x28, 0x9d, 0x26, 0x97, + 0x29, 0x1a, 0x43, 0xbb, 0x6c, 0xb1, 0x4f, 0x09, 0xb3, 0x0c, 0x41, 0x6d, 0xeb, 0xd4, 0xb2, 0x81, + 0x65, 0xe0, 0x19, 0x61, 0xde, 0xe1, 0x5a, 0xfb, 0x42, 0x0e, 0x1c, 0x2d, 0x30, 0x65, 0x7e, 0x44, + 0xe2, 0x30, 0x62, 0xfe, 0x3c, 0xc2, 0x49, 0x48, 0x02, 0x51, 0x67, 0xdd, 0x7b, 0xce, 0x5d, 0x27, + 0xc2, 0x33, 0x96, 0x8e, 0xe1, 0x6f, 0x06, 0x1c, 0x8d, 0xb9, 0xce, 0x84, 0xae, 0xe8, 0xf7, 0xe2, + 0xfe, 0x84, 0x18, 0x0f, 0x9e, 0xcd, 0x0b, 0xb3, 0x2f, 0xef, 0x55, 0xe9, 0x79, 0xbd, 0xaf, 0x67, + 0x87, 0xc0, 0x7d, 0x72, 0x73, 0xd7, 0xaf, 0x79, 0xdd, 0xf9, 0xb6, 0xf9, 0x3f, 0x6b, 0xa3, 0xf0, + 0x7c, 0xeb, 0xfe, 0x85, 0xb0, 0x6f, 0xa0, 0xc3, 0xfb, 0xeb, 0xe7, 0x85, 0x55, 0xc9, 0xea, 0x3b, + 0xbb, 0x3b, 0xe1, 0x6c, 0x05, 0x7b, 0x6d, 0x1e, 0x56, 0xcd, 0xd2, 0x07, 0x70, 0x20, 0x75, 0xa8, + 0xfc, 0xea, 0x6b, 0x18, 0x41, 0xe3, 0x42, 0x4e, 0x2b, 0x7a, 0x07, 0xad, 0xb2, 0x04, 0x95, 0xe5, + 0x95, 0x9e, 0x45, 0x4d, 0x75, 0x55, 0xbe, 0x2a, 0xbc, 0x8a, 0x42, 0x3d, 0x68, 0xd2, 0xf4, 0x92, + 0xfd, 0x8c, 0x73, 0x22, 0xf2, 0xb4, 0xbc, 0xf2, 0x7b, 0xf8, 0x7b, 0x03, 0x9e, 0x9e, 0x71, 0xa1, + 0xe8, 0x4b, 0x68, 0x28, 0x2e, 0x95, 0xe6, 0xc5, 0x7e, 0x31, 0x4a, 0x94, 0x4a, 0x51, 0xe0, 0xd1, + 0xa7, 0xd0, 0x9c, 0x47, 0x38, 0x4e, 0xfc, 0x58, 0x36, 0xb2, 0xe5, 0x9a, 0x9b, 0xbb, 0x7e, 0x63, + 0xcc, 0x6d, 0xd3, 0x89, 0xd7, 0x10, 0xce, 0x69, 0x80, 0x3e, 0x81, 0x4e, 0x9c, 0xc4, 0x2c, 0xc6, + 0x0b, 0xd5, 0x7e, 0xab, 0x23, 0xca, 0x6e, 0x2b, 0xab, 0xec, 0x3c, 0xfa, 0x0c, 0xc4, 0x3d, 0xc8, + 0xd9, 0x2e, 0x90, 0x75, 0x81, 0xec, 0x72, 0x87, 0x18, 0x5e, 0x85, 0xf5, 0xa0, 0xad, 0x61, 0xe3, + 0xc0, 0x7a, 0xb2, 0xaf, 0x5d, 0xce, 0x87, 0x88, 0x9a, 0x4e, 0xdc, 0x23, 0xae, 0x7d, 0x73, 0xd7, + 0x37, 0x4f, 0x0b, 0xaa, 0xe9, 0xc4, 0x33, 0x4b, 0xde, 0x69, 0x80, 0x4e, 0xa1, 0xab, 0x71, 0xf2, + 0x17, 0xc1, 0x7a, 0x2a, 0x58, 0x7b, 0x8e, 0x7c, 0x2e, 0x9c, 0xe2, 0xb9, 0x70, 0xce, 0x8b, 0xe7, + 0xc2, 0x6d, 0x72, 0xda, 0xeb, 0xbf, 0xfa, 0x86, 0xd7, 0x2e, 0xb9, 0xb8, 0x17, 0x7d, 0x0b, 0xdd, + 0x84, 0x5c, 0x31, 0xbf, 0xdc, 0x10, 0x6a, 0x1d, 0x3c, 0x6a, 0xa7, 0x3a, 0x3c, 0xac, 0x5a, 0x4f, + 0xf4, 0x16, 0x40, 0xe3, 0x68, 0x3c, 0x8a, 0x43, 0x8b, 0xe0, 0x42, 0x44, 0x59, 0x1a, 0x49, 0xf3, + 0x71, 0x42, 0x78, 0x98, 0x26, 0x64, 0x0c, 0xb6, 0xbe, 0x42, 0x15, 0x5f, 0xb9, 0x4d, 0x2d, 0x71, + 0x59, 0x2f, 0xab, 0x6d, 0xaa, 0xa2, 0xd5, 0x5e, 0xfd, 0xeb, 0x6e, 0xc3, 0xff, 0xdc, 0xed, 0xef, + 0xe0, 0xe3, 0xad, 0xdd, 0xde, 0xe1, 0x2f, 0xe5, 0x99, 0x42, 0xde, 0x40, 0x5b, 0xf6, 0x6d, 0xa2, + 0x42, 0x63, 0x31, 0x88, 0x39, 0xa1, 0xab, 0x05, 0xa3, 0x7e, 0x84, 0x69, 0x64, 0x1d, 0x0e, 0x8c, + 0xe3, 0x43, 0x39, 0x88, 0x9e, 0xb4, 0x9f, 0x60, 0x1a, 0xa1, 0x17, 0xd0, 0xc4, 0x59, 0x26, 0x21, + 0x6d, 0x01, 0x69, 0xe0, 0x2c, 0x13, 0xae, 0xaf, 0xa0, 0xc9, 0x87, 0x28, 0x5d, 0x31, 0x6a, 0x75, + 0xf7, 0x37, 0x58, 0xbc, 0xd4, 0xe7, 0x0a, 0xc0, 0x9f, 0x17, 0x55, 0x5e, 0x19, 0xe4, 0xfe, 0x70, + 0xb3, 0xb1, 0x8d, 0xdb, 0x8d, 0x6d, 0xfc, 0xbd, 0xb1, 0x8d, 0xeb, 0x7b, 0xbb, 0x76, 0x7b, 0x6f, + 0xd7, 0xfe, 0xb8, 0xb7, 0x6b, 0x3f, 0x7e, 0x11, 0xc6, 0x2c, 0x5a, 0xcd, 0x9c, 0x79, 0xba, 0x1c, + 0xe9, 0x7f, 0xc2, 0xea, 0x28, 0x7f, 0xc7, 0xbb, 0x3f, 0xf2, 0xd9, 0x81, 0xb0, 0x7f, 0xfe, 0x4f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x8e, 0x97, 0xe8, 0x4f, 0xe3, 0x07, 0x00, 0x00, } func (m *ABCIResponses) Marshal() (dAtA []byte, err error) { @@ -768,6 +778,16 @@ func (m *State) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.Timeouts.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a if m.InitialHeight != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.InitialHeight)) i-- @@ -843,12 +863,12 @@ func (m *State) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n11, err11 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):]) - if err11 != nil { - return 0, err11 + n12, err12 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):]) + if err12 != nil { + return 0, err12 } - i -= n11 - i = encodeVarintTypes(dAtA, i, uint64(n11)) + i -= n12 + i = encodeVarintTypes(dAtA, i, uint64(n12)) i-- dAtA[i] = 0x2a { @@ -1031,6 +1051,8 @@ func (m *State) Size() (n int) { if m.InitialHeight != 0 { n += 1 + sovTypes(uint64(m.InitialHeight)) } + l = m.Timeouts.Size() + n += 1 + l + sovTypes(uint64(l)) return n } @@ -2068,6 +2090,39 @@ func (m *State) Unmarshal(dAtA []byte) error { break } } + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeouts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Timeouts.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/state/types.proto b/proto/tendermint/state/types.proto index f3fdc0ef39..9796a8fc55 100644 --- a/proto/tendermint/state/types.proto +++ b/proto/tendermint/state/types.proto @@ -77,4 +77,7 @@ message State { // the latest AppHash we've received from calling abci.Commit() bytes app_hash = 13; + + // timeouts to be used for the next block height + tendermint.abci.TimeoutsInfo timeouts = 15 [(gogoproto.nullable) = false]; } diff --git a/proto/tendermint/store/types.proto b/proto/tendermint/store/types.proto index e1d994b4b4..64a32d1f71 100644 --- a/proto/tendermint/store/types.proto +++ b/proto/tendermint/store/types.proto @@ -11,11 +11,11 @@ message BlockStoreState { // TxInfo describes the location of a tx inside a committed block // as well as the result of executing the transaction and the error log output. message TxInfo { - int64 height = 1; - uint32 index = 2; + int64 height = 1; + uint32 index = 2; // The response code of executing the tx. 0 means // successfully executed, all others are error codes. - uint32 code = 3; + uint32 code = 3; // The error log output generated if the transaction execution fails. - string error = 4; + string error = 4; } diff --git a/rpc/client/http/http.go b/rpc/client/http/http.go index abcf9c9924..7acb6a43c2 100644 --- a/rpc/client/http/http.go +++ b/rpc/client/http/http.go @@ -118,7 +118,7 @@ func New(remote, wsEndpoint string) (*HTTP, error) { return NewWithClient(remote, wsEndpoint, httpClient) } -// Create timeout enabled http client +// NewWithTimeout creates timeout enabled http client func NewWithTimeout(remote, wsEndpoint string, timeout uint) (*HTTP, error) { httpClient, err := jsonrpcclient.DefaultHTTPClient(remote) if err != nil { diff --git a/rpc/client/interface.go b/rpc/client/interface.go index ceef3b223f..5fe6f75279 100644 --- a/rpc/client/interface.go +++ b/rpc/client/interface.go @@ -7,7 +7,7 @@ to a CometBFT node, as well as higher-level functionality. The main implementation for production code is client.HTTP, which connects via http to the jsonrpc interface of the CometBFT node. -For connecting to a node running in the same process (eg. when +For connecting to a node running in the same process (e.g., when compiling the abci app in the same process), you can use the client.Local implementation. diff --git a/rpc/client/local/local.go b/rpc/client/local/local.go index 93ecf6f0c0..783f209d45 100644 --- a/rpc/client/local/local.go +++ b/rpc/client/local/local.go @@ -43,7 +43,7 @@ type Local struct { ctx *rpctypes.Context } -// NewLocal configures a client that calls the Node directly. +// New configures a client that calls the Node directly. // // Note that given how rpc/core works with package singletons, that // you can only have one node per process. So make sure test cases diff --git a/rpc/jsonrpc/server/http_server.go b/rpc/jsonrpc/server/http_server.go index 29eae9fc32..bdd757e7e8 100644 --- a/rpc/jsonrpc/server/http_server.go +++ b/rpc/jsonrpc/server/http_server.go @@ -19,7 +19,7 @@ import ( types "github.com/tendermint/tendermint/rpc/jsonrpc/types" ) -// Config is a RPC server configuration. +// Config is an RPC server configuration. type Config struct { // see netutil.LimitListener MaxOpenConnections int @@ -64,7 +64,7 @@ func Serve(listener net.Listener, handler http.Handler, logger log.Logger, confi return err } -// Serve creates a http.Server and calls ServeTLS with the given listener, +// ServeTLS creates a http.Server and calls ServeTLS with the given listener, // certFile and keyFile. It wraps handler with RecoverAndLogHandler and a // handler, which limits the max body size to config.MaxBodyBytes. // diff --git a/state/execution.go b/state/execution.go index 1e71cadfe2..21aff937ae 100644 --- a/state/execution.go +++ b/state/execution.go @@ -200,7 +200,7 @@ func (blockExec *BlockExecutor) ProcessProposal( // ValidateBlock validates the given block against the given state. // If the block is invalid, it returns an error. // Validation does not mutate state, but does require historical information from the stateDB, -// ie. to verify evidence from a validator at an old height. +// i.e., to verify evidence from a validator at an old height. func (blockExec *BlockExecutor) ValidateBlock(state State, block *types.Block) error { err := validateBlock(state, block) if err != nil { @@ -514,7 +514,7 @@ func updateState( validatorUpdates []*types.Validator, ) (State, error) { - // Copy the valset so we can apply changes from EndBlock + // Copy the valset so that we can apply changes from EndBlock // and update s.LastValidators and s.Validators. nValSet := state.NextValidators.Copy() @@ -525,7 +525,7 @@ func updateState( if err != nil { return state, fmt.Errorf("error changing validator set: %v", err) } - // Change results from this height but only applies to the next next height. + // Change results from this height but only applies to the next height. lastHeightValsChanged = header.Height + 1 + 1 } @@ -553,7 +553,7 @@ func updateState( // NOTE: the AppHash has not been populated. // It will be filled on state.Save. - return State{ + s := State{ Version: nextVersion, ChainID: state.ChainID, InitialHeight: state.InitialHeight, @@ -568,7 +568,11 @@ func updateState( LastHeightConsensusParamsChanged: lastHeightParamsChanged, LastResultsHash: ABCIResponsesResultsHash(abciResponses), AppHash: nil, - }, nil + TimeoutCommit: abciResponses.EndBlock.Timeouts.TimeoutCommit, + TimeoutPropose: abciResponses.EndBlock.Timeouts.TimeoutPropose, + } + + return s, nil } // Fire NewBlock, NewBlockHeader. diff --git a/state/state.go b/state/state.go index 451377079f..3354f3eb4e 100644 --- a/state/state.go +++ b/state/state.go @@ -77,6 +77,10 @@ type State struct { // the latest AppHash we've received from calling abci.Commit() AppHash []byte + + // timeouts received from app, after ABCI EndBlock call, to be used in the next height + TimeoutPropose time.Duration + TimeoutCommit time.Duration } // Copy makes a copy of the State for mutating. @@ -101,6 +105,9 @@ func (state State) Copy() State { AppHash: state.AppHash, LastResultsHash: state.LastResultsHash, + + TimeoutCommit: state.TimeoutCommit, + TimeoutPropose: state.TimeoutPropose, } } @@ -170,6 +177,9 @@ func (state *State) ToProto() (*cmtstate.State, error) { sm.LastResultsHash = state.LastResultsHash sm.AppHash = state.AppHash + sm.Timeouts.TimeoutPropose = state.TimeoutPropose + sm.Timeouts.TimeoutCommit = state.TimeoutCommit + return sm, nil } @@ -220,6 +230,8 @@ func FromProto(pb *cmtstate.State) (*State, error) { //nolint:golint state.LastHeightConsensusParamsChanged = pb.LastHeightConsensusParamsChanged state.LastResultsHash = pb.LastResultsHash state.AppHash = pb.AppHash + state.TimeoutCommit = pb.Timeouts.TimeoutCommit + state.TimeoutPropose = pb.Timeouts.TimeoutPropose return state, nil } diff --git a/state/state_test.go b/state/state_test.go index b7abc418ff..67c22cf29c 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -7,6 +7,7 @@ import ( "math/big" "os" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -49,17 +50,54 @@ func TestStateCopy(t *testing.T) { tearDown, _, state := setupTestCase(t) defer tearDown(t) assert := assert.New(t) + // the timeouts coming from the setupTestCase are 0, + // we change it here just to ensure that they have non-zero values in the + // tests below + state.TimeoutPropose = 10 * time.Second + state.TimeoutCommit = 20 * time.Second + + tests := []struct { + name string + modifyState func(sm.State) sm.State + expected bool + }{ + { + name: "no modification", + modifyState: func(s sm.State) sm.State { + stateCopy := s.Copy() + return stateCopy + }, + expected: true, + }, + { + name: "modify block height and validators", + modifyState: func(s sm.State) sm.State { + stateCopy := s.Copy() + stateCopy.LastBlockHeight++ + stateCopy.LastValidators = s.Validators + return stateCopy + }, + expected: false, + }, + { + name: "modify timeouts", + modifyState: func(s sm.State) sm.State { + stateCopy := s.Copy() + stateCopy.TimeoutPropose = 1 * time.Second + stateCopy.TimeoutCommit = 2 * time.Second + return stateCopy + }, + expected: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + newState := tt.modifyState(state) + assert.Equal(tt.expected, state.Equals(newState), + fmt.Sprintf("expected state: %v\n got: %v\n", state, newState)) + }) - stateCopy := state.Copy() - - assert.True(state.Equals(stateCopy), - fmt.Sprintf("expected state and its copy to be identical.\ngot: %v\nexpected: %v\n", - stateCopy, state)) - - stateCopy.LastBlockHeight++ - stateCopy.LastValidators = state.Validators - assert.False(state.Equals(stateCopy), fmt.Sprintf(`expected states to be different. got same - %v`, state)) + } } // TestMakeGenesisStateNilValidators tests state's consistency when genesis file's validators field is nil. @@ -111,6 +149,11 @@ func TestStateSaveLoad(t *testing.T) { }) assert := assert.New(t) + // the timeouts coming from the setupTestCase are 0, + // we change it here just to ensure that they have non-zero values in the + // tests below + state.TimeoutCommit = 10 * time.Second + state.TimeoutPropose = 5 * time.Second state.LastBlockHeight++ state.LastValidators = state.Validators err := stateStore.Save(state) @@ -121,6 +164,11 @@ func TestStateSaveLoad(t *testing.T) { assert.True(state.Equals(loadedState), fmt.Sprintf("expected state and its copy to be identical.\ngot: %v\nexpected: %v\n", loadedState, state)) + + // the following assertions are just for additional assurance + assert.Equal(state.TimeoutCommit, loadedState.TimeoutCommit) + assert.Equal(state.TimeoutPropose, loadedState.TimeoutPropose, fmt.Sprintf("expected TimeoutPropose to be equal."+ + "\ngot: %v\nexpected: %v\n", loadedState.TimeoutPropose, state.TimeoutPropose)) } // TestABCIResponsesSaveLoad tests saving and loading ABCIResponses. @@ -143,9 +191,9 @@ func TestABCIResponsesSaveLoad1(t *testing.T) { abciResponses.DeliverTxs[0] = &abci.ResponseDeliverTx{Data: []byte("foo"), Events: nil} abciResponses.DeliverTxs[1] = &abci.ResponseDeliverTx{Data: []byte("bar"), Log: "ok", Events: nil} - abciResponses.EndBlock = &abci.ResponseEndBlock{ValidatorUpdates: []abci.ValidatorUpdate{ - types.TM2PB.NewValidatorUpdate(ed25519.GenPrivKey().PubKey(), 10), - }} + abciResponses.EndBlock = &abci.ResponseEndBlock{ + ValidatorUpdates: []abci.ValidatorUpdate{types.TM2PB.NewValidatorUpdate(ed25519.GenPrivKey().PubKey(), 10)}, + Timeouts: abci.TimeoutsInfo{TimeoutPropose: 1 * time.Second, TimeoutCommit: 2 * time.Second}} err := stateStore.SaveABCIResponses(block.Height, abciResponses) require.NoError(t, err) @@ -154,6 +202,7 @@ func TestABCIResponsesSaveLoad1(t *testing.T) { assert.Equal(abciResponses, loadedABCIResponses, fmt.Sprintf("ABCIResponses don't match:\ngot: %v\nexpected: %v\n", loadedABCIResponses, abciResponses)) + } // TestResultsSaveLoad tests saving and loading ABCI results. @@ -1101,6 +1150,12 @@ func TestStateProto(t *testing.T) { tearDown, _, state := setupTestCase(t) defer tearDown(t) + // for assurance, + // we make another state with non-zero timeouts to see if conversion works + stateCopyWithTimeouts := state.Copy() + stateCopyWithTimeouts.TimeoutCommit = 10 * time.Second + stateCopyWithTimeouts.TimeoutPropose = 11 * time.Second + tc := []struct { testName string state *sm.State @@ -1110,6 +1165,7 @@ func TestStateProto(t *testing.T) { {"empty state", &sm.State{}, true, false}, {"nil failure state", nil, false, false}, {"success state", &state, true, true}, + {"success state with timeouts", &stateCopyWithTimeouts, true, true}, } for _, tt := range tc { diff --git a/state/store.go b/state/store.go index 3fbadccdc0..7b5ec202a0 100644 --- a/state/store.go +++ b/state/store.go @@ -87,7 +87,7 @@ type dbStore struct { type StoreOptions struct { - // DiscardABCIResponses determines whether or not the store + // DiscardABCIResponses determines whether the store // retains all ABCIResponses. If DiscardABCiResponses is enabled, // the store will maintain only the response object from the latest // height. @@ -101,7 +101,7 @@ func NewStore(db dbm.DB, options StoreOptions) Store { return dbStore{db, options} } -// LoadStateFromDBOrGenesisFile loads the most recent state from the database, +// LoadFromDBOrGenesisFile loads the most recent state from the database, // or creates a new one from the given genesisFilePath. func (store dbStore) LoadFromDBOrGenesisFile(genesisFilePath string) (State, error) { state, err := store.Load() @@ -119,7 +119,7 @@ func (store dbStore) LoadFromDBOrGenesisFile(genesisFilePath string) (State, err return state, nil } -// LoadStateFromDBOrGenesisDoc loads the most recent state from the database, +// LoadFromDBOrGenesisDoc loads the most recent state from the database, // or creates a new one from the given genesisDoc. func (store dbStore) LoadFromDBOrGenesisDoc(genesisDoc *types.GenesisDoc) (State, error) { state, err := store.Load() @@ -138,7 +138,7 @@ func (store dbStore) LoadFromDBOrGenesisDoc(genesisDoc *types.GenesisDoc) (State return state, nil } -// LoadState loads the State from the database. +// Load loads the State from the database. func (store dbStore) Load() (State, error) { return store.loadState(stateKey) } @@ -196,6 +196,7 @@ func (store dbStore) save(state State, key []byte) error { state.LastHeightConsensusParamsChanged, state.ConsensusParams); err != nil { return err } + err := store.db.SetSync(key, state.Bytes()) if err != nil { return err @@ -203,7 +204,7 @@ func (store dbStore) save(state State, key []byte) error { return nil } -// BootstrapState saves a new state, used e.g. by state sync when starting from non-zero height. +// Bootstrap saves a new state, used e.g. by state sync when starting from non-zero height. func (store dbStore) Bootstrap(state State) error { height := state.LastBlockHeight + 1 if height == 1 { @@ -236,7 +237,7 @@ func (store dbStore) Bootstrap(state State) error { // guaranteed to delete all states, since the last checkpointed state and states being pointed to by // e.g. `LastHeightChanged` must remain. The state at to must also exist. // -// The from parameter is necessary since we can't do a key scan in a performant way due to the key +// The `from` parameter is necessary since we can't do a key scan in a performant way due to the key // encoding not preserving ordering: https://github.com/tendermint/tendermint/issues/4567 // This will cause some old states to be left behind when doing incremental partial prunes, // specifically older checkpoints and LastHeightChanged targets. @@ -403,7 +404,7 @@ func (store dbStore) LoadABCIResponses(height int64) (*cmtstate.ABCIResponses, e return abciResponses, nil } -// LoadLastABCIResponses loads the ABCIResponses from the most recent height. +// LoadLastABCIResponse loads the ABCIResponses from the most recent height. // The height parameter is used to ensure that the response corresponds to the latest height. // If not, an error is returned. // diff --git a/statesync/reactor.go b/statesync/reactor.go index d8aa5b2a7d..59f85f9aab 100644 --- a/statesync/reactor.go +++ b/statesync/reactor.go @@ -103,7 +103,7 @@ func (r *Reactor) RemovePeer(peer p2p.Peer, reason interface{}) { } } -// Receive implements p2p.Reactor. +// ReceiveEnvelope implements p2p.Reactor. func (r *Reactor) ReceiveEnvelope(e p2p.Envelope) { if !r.IsRunning() { return diff --git a/statesync/syncer.go b/statesync/syncer.go index 2f1ee85bda..89f66a9398 100644 --- a/statesync/syncer.go +++ b/statesync/syncer.go @@ -307,10 +307,14 @@ func (s *syncer) Sync(snapshot *snapshot, chunks *chunkQueue) (sm.State, *types. } // Verify app and app version - if err := s.verifyApp(snapshot, state.Version.Consensus.App); err != nil { + timeouts, err := s.verifyApp(snapshot, state.Version.Consensus.App) + if err != nil { return sm.State{}, nil, err } + state.TimeoutCommit = timeouts.TimeoutCommit + state.TimeoutPropose = timeouts.TimeoutPropose + // Done! 🎉 s.logger.Info("Snapshot restored", "height", snapshot.Height, "format", snapshot.Format, "hash", snapshot.Hash) @@ -484,10 +488,10 @@ func (s *syncer) requestChunk(snapshot *snapshot, chunk uint32) { } // verifyApp verifies the sync, checking the app hash, last block height and app version -func (s *syncer) verifyApp(snapshot *snapshot, appVersion uint64) error { +func (s *syncer) verifyApp(snapshot *snapshot, appVersion uint64) (abci.TimeoutsInfo, error) { resp, err := s.connQuery.InfoSync(proxy.RequestInfo) if err != nil { - return fmt.Errorf("failed to query ABCI app for appHash: %w", err) + return abci.TimeoutsInfo{}, fmt.Errorf("failed to query ABCI app for appHash: %w", err) } // sanity check that the app version in the block matches the application's own record @@ -495,14 +499,14 @@ func (s *syncer) verifyApp(snapshot *snapshot, appVersion uint64) error { if resp.AppVersion != appVersion { // An error here most likely means that the app hasn't inplemented state sync // or the Info call correctly - return fmt.Errorf("app version mismatch. Expected: %d, got: %d", + return abci.TimeoutsInfo{}, fmt.Errorf("app version mismatch. Expected: %d, got: %d", appVersion, resp.AppVersion) } if !bytes.Equal(snapshot.trustedAppHash, resp.LastBlockAppHash) { s.logger.Error("appHash verification failed", "expected", snapshot.trustedAppHash, "actual", resp.LastBlockAppHash) - return errVerifyFailed + return abci.TimeoutsInfo{}, errVerifyFailed } //nolint:gosec if uint64(resp.LastBlockHeight) != snapshot.Height { @@ -511,9 +515,9 @@ func (s *syncer) verifyApp(snapshot *snapshot, appVersion uint64) error { "expected", snapshot.Height, "actual", resp.LastBlockHeight, ) - return errVerifyFailed + return abci.TimeoutsInfo{}, errVerifyFailed } s.logger.Info("Verified ABCI app", "height", snapshot.Height, "appHash", snapshot.trustedAppHash) - return nil + return resp.Timeouts, nil } diff --git a/statesync/syncer_test.go b/statesync/syncer_test.go index 9aa5457650..9da872dce3 100644 --- a/statesync/syncer_test.go +++ b/statesync/syncer_test.go @@ -681,7 +681,7 @@ func TestSyncer_verifyApp(t *testing.T) { syncer := newSyncer(*cfg, log.NewNopLogger(), connSnapshot, connQuery, stateProvider, "") connQuery.On("InfoSync", proxy.RequestInfo).Return(tc.response, tc.err) - err := syncer.verifyApp(s, appVersion) + _, err := syncer.verifyApp(s, appVersion) unwrapped := errors.Unwrap(err) if unwrapped != nil { err = unwrapped diff --git a/store/store.go b/store/store.go index 2990f44378..5ddea3bbfc 100644 --- a/store/store.go +++ b/store/store.go @@ -79,7 +79,7 @@ func (bs *BlockStore) Size() int64 { return bs.height - bs.base + 1 } -// LoadBase atomically loads the base block meta, or returns nil if no base is found. +// LoadBaseMeta atomically loads the base block meta, or returns nil if no base is found. func (bs *BlockStore) LoadBaseMeta() *types.BlockMeta { bs.mtx.RLock() defer bs.mtx.RUnlock() @@ -197,8 +197,7 @@ func (bs *BlockStore) LoadBlockMeta(height int64) *types.BlockMeta { return blockMeta } -// LoadBlockMetaByHash returns the blockmeta who's header corresponds to the given -// hash. If none is found, returns nil. +// LoadBlockMetaByHash returns the blockmeta whose header corresponds to the given hash. If none is found, returns nil. func (bs *BlockStore) LoadBlockMetaByHash(hash []byte) *types.BlockMeta { bz, err := bs.db.Get(calcBlockHashKey(hash)) if err != nil { diff --git a/types/block.go b/types/block.go index 60e17193da..d9d9c70587 100644 --- a/types/block.go +++ b/types/block.go @@ -1289,7 +1289,7 @@ func (blockID *BlockID) ToProto() cmtproto.BlockID { } } -// FromProto sets a protobuf BlockID to the given pointer. +// BlockIDFromProto sets a protobuf BlockID to the given pointer. // It returns an error if the block id is invalid. func BlockIDFromProto(bID *cmtproto.BlockID) (*BlockID, error) { if bID == nil {