From 312a505f217ea875e711b4dbc0b69e458bfe7216 Mon Sep 17 00:00:00 2001 From: samricotta <37125168+samricotta@users.noreply.github.com> Date: Tue, 2 Aug 2022 11:55:55 +0200 Subject: [PATCH] Optimize ABCI Response Information and flag to save ABCI results #8028 #8946 (#9090) *Adds a flag to the which enables discarding of abci responses Co-authored-by: Callum Waters Co-authored-by: Samantha Ricotta Co-authored-by: Samantha Ricotta --- CHANGELOG_PENDING.md | 1 + cmd/tendermint/commands/reindex_event.go | 7 +- config/config.go | 10 +- internal/blocksync/v0/reactor_test.go | 4 +- internal/blocksync/v2/reactor_test.go | 8 +- internal/consensus/byzantine_test.go | 4 +- internal/consensus/common_test.go | 4 +- internal/consensus/mempool_test.go | 4 +- internal/consensus/reactor_test.go | 4 +- internal/consensus/replay.go | 2 +- internal/consensus/replay_file.go | 2 +- internal/consensus/replay_test.go | 23 +- internal/consensus/wal_generator.go | 4 +- internal/evidence/pool_test.go | 4 +- internal/inspect/inspect.go | 2 +- internal/rpc/core/blocks_test.go | 4 +- internal/state/errors.go | 7 +- internal/state/execution_test.go | 20 +- internal/state/helpers_test.go | 4 +- internal/state/mocks/store.go | 23 ++ internal/state/rollback_test.go | 7 +- internal/state/state_test.go | 36 ++- internal/state/store.go | 112 ++++++-- internal/state/store_test.go | 92 ++++++- internal/state/validation_test.go | 12 +- node/node.go | 2 +- node/node_test.go | 20 +- node/setup.go | 4 +- proto/tendermint/state/types.pb.go | 329 +++++++++++++++++++---- proto/tendermint/state/types.proto | 5 + test/e2e/generator/generate.go | 2 +- 31 files changed, 622 insertions(+), 140 deletions(-) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index b02ab5343..1de47b867 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -25,5 +25,6 @@ Special thanks to external contributors on this release: ### IMPROVEMENTS - (indexer) \#8625 Fix overriding tx index of duplicated txs. +- [config] \#9054 Flag added to overwrite abciresponses. ### BUG FIXES diff --git a/cmd/tendermint/commands/reindex_event.go b/cmd/tendermint/commands/reindex_event.go index bd9577963..a6430dd57 100644 --- a/cmd/tendermint/commands/reindex_event.go +++ b/cmd/tendermint/commands/reindex_event.go @@ -37,6 +37,9 @@ replace the backend. The default start-height is 0, meaning the tooling will sta reindex from the base block height(inclusive); and the default end-height is 0, meaning the tooling will reindex until the latest block height(inclusive). User can omit either or both arguments. + +Note: This operation requires ABCIResponses. Do not set DiscardABCIResponses to true if you +want to use this command. `, Example: ` tendermint reindex-event @@ -154,7 +157,9 @@ func loadStateAndBlockStore(cfg *tmcfg.Config) (*store.BlockStore, state.Store, if err != nil { return nil, nil, err } - stateStore := state.NewStore(stateDB) + stateStore := state.NewStore(stateDB, state.StoreOptions{ + DiscardABCIResponses: cfg.RPC.DiscardABCIResponses, + }) return blockStore, stateStore, nil } diff --git a/config/config.go b/config/config.go index e7628b7f1..9cae1ef6e 100644 --- a/config/config.go +++ b/config/config.go @@ -554,6 +554,11 @@ type RPCConfig struct { // pprof listen address (https://golang.org/pkg/net/http/pprof) PprofListenAddress string `mapstructure:"pprof-laddr"` + + // Set false to ensure ABCI responses are persisted. + // ABCI responses are required for /BlockResults RPC queries, and + // to reindex events in the command-line tool. + DiscardABCIResponses bool `mapstructure:"persist-abci-responses"` } // DefaultRPCConfig returns a default configuration for the RPC server @@ -578,8 +583,9 @@ func DefaultRPCConfig() *RPCConfig { MaxBodyBytes: int64(1000000), // 1MB MaxHeaderBytes: 1 << 20, // same as the net/http default - TLSCertFile: "", - TLSKeyFile: "", + TLSCertFile: "", + TLSKeyFile: "", + DiscardABCIResponses: false, } } diff --git a/internal/blocksync/v0/reactor_test.go b/internal/blocksync/v0/reactor_test.go index 2cac774e5..47a8a6722 100644 --- a/internal/blocksync/v0/reactor_test.go +++ b/internal/blocksync/v0/reactor_test.go @@ -103,7 +103,9 @@ func (rts *reactorTestSuite) addNode(t *testing.T, blockDB := dbm.NewMemDB() stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(blockDB) state, err := sm.MakeGenesisState(genDoc) diff --git a/internal/blocksync/v2/reactor_test.go b/internal/blocksync/v2/reactor_test.go index f0266029e..fe7f5ce04 100644 --- a/internal/blocksync/v2/reactor_test.go +++ b/internal/blocksync/v2/reactor_test.go @@ -169,7 +169,9 @@ func newTestReactor(t *testing.T, p testReactorParams) *BlockchainReactor { err := proxyApp.Start() require.NoError(t, err) db := dbm.NewMemDB() - stateStore := sm.NewStore(db) + stateStore := sm.NewStore(db, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := tmstore.NewBlockStore(dbm.NewMemDB()) appl = sm.NewBlockExecutor( stateStore, p.logger, proxyApp.Consensus(), mock.Mempool{}, sm.EmptyEvidencePool{}, blockStore) @@ -494,7 +496,9 @@ func newReactorStore( stateDB := dbm.NewMemDB() blockStore := tmstore.NewBlockStore(dbm.NewMemDB()) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state, err := sm.MakeGenesisState(genDoc) require.NoError(t, err) diff --git a/internal/consensus/byzantine_test.go b/internal/consensus/byzantine_test.go index ab8d12205..3db524da4 100644 --- a/internal/consensus/byzantine_test.go +++ b/internal/consensus/byzantine_test.go @@ -45,7 +45,9 @@ func TestByzantinePrevoteEquivocation(t *testing.T) { func() { logger := consensusLogger().With("test", "byzantine", "validator", i) stateDB := dbm.NewMemDB() // each state needs its own db - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state, err := sm.MakeGenesisState(genDoc) require.NoError(t, err) require.NoError(t, stateStore.Save(state)) diff --git a/internal/consensus/common_test.go b/internal/consensus/common_test.go index 0477c8b0c..0354a90a9 100644 --- a/internal/consensus/common_test.go +++ b/internal/consensus/common_test.go @@ -431,7 +431,9 @@ func newStateWithConfigAndBlockStore( // Make State stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) if err := stateStore.Save(state); err != nil { // for save height 1's validators info panic(err) } diff --git a/internal/consensus/mempool_test.go b/internal/consensus/mempool_test.go index 558dbd4b3..55ff495f5 100644 --- a/internal/consensus/mempool_test.go +++ b/internal/consensus/mempool_test.go @@ -126,7 +126,7 @@ func TestMempoolTxConcurrentWithCommit(t *testing.T) { config := configSetup(t) state, privVals := randGenesisState(config, 1, false, 10) - stateStore := sm.NewStore(dbm.NewMemDB()) + stateStore := sm.NewStore(dbm.NewMemDB(), sm.StoreOptions{DiscardABCIResponses: false}) blockStore := store.NewBlockStore(dbm.NewMemDB()) cs := newStateWithConfigAndBlockStore(config, state, privVals[0], NewCounterApplication(), blockStore) err := stateStore.Save(state) @@ -153,7 +153,7 @@ func TestMempoolRmBadTx(t *testing.T) { state, privVals := randGenesisState(config, 1, false, 10) app := NewCounterApplication() - stateStore := sm.NewStore(dbm.NewMemDB()) + stateStore := sm.NewStore(dbm.NewMemDB(), sm.StoreOptions{DiscardABCIResponses: false}) blockStore := store.NewBlockStore(dbm.NewMemDB()) cs := newStateWithConfigAndBlockStore(config, state, privVals[0], app, blockStore) err := stateStore.Save(state) diff --git a/internal/consensus/reactor_test.go b/internal/consensus/reactor_test.go index 5843dc3b5..a28a20e93 100644 --- a/internal/consensus/reactor_test.go +++ b/internal/consensus/reactor_test.go @@ -329,7 +329,9 @@ func TestReactorWithEvidence(t *testing.T) { for i := 0; i < n; i++ { stateDB := dbm.NewMemDB() // each state needs its own db - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state, err := sm.MakeGenesisState(genDoc) require.NoError(t, err) thisConfig, err := ResetConfig(fmt.Sprintf("%s_%d", testName, i)) diff --git a/internal/consensus/replay.go b/internal/consensus/replay.go index 60ad0c041..c687dcbf5 100644 --- a/internal/consensus/replay.go +++ b/internal/consensus/replay.go @@ -419,7 +419,7 @@ func (h *Handshaker) ReplayBlocks( case appBlockHeight == storeBlockHeight: // We ran Commit, but didn't save the state, so replayBlock with mock app. - abciResponses, err := h.stateStore.LoadABCIResponses(storeBlockHeight) + abciResponses, err := h.stateStore.LoadLastABCIResponse(storeBlockHeight) if err != nil { return nil, err } diff --git a/internal/consensus/replay_file.go b/internal/consensus/replay_file.go index f60dff531..bb74eceda 100644 --- a/internal/consensus/replay_file.go +++ b/internal/consensus/replay_file.go @@ -300,7 +300,7 @@ func newConsensusStateForReplay(cfg config.BaseConfig, csConfig *config.Consensu if err != nil { tmos.Exit(err.Error()) } - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{DiscardABCIResponses: false}) gdoc, err := sm.MakeGenesisDocFromFile(cfg.GenesisFile()) if err != nil { tmos.Exit(err.Error()) diff --git a/internal/consensus/replay_test.go b/internal/consensus/replay_test.go index 42c449a05..5fda3802f 100644 --- a/internal/consensus/replay_test.go +++ b/internal/consensus/replay_test.go @@ -152,7 +152,9 @@ LOOP: logger := log.NewNopLogger() blockDB := dbm.NewMemDB() stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(blockDB) state, err := sm.MakeGenesisStateFromFile(consensusReplayConfig.GenesisFile()) require.NoError(t, err) @@ -730,7 +732,9 @@ func testHandshakeReplay(t *testing.T, sim *simulatorTestSuite, nBlocks int, mod stateDB, genesisState, store = stateAndStore(cfg, pubKey, kvstore.ProtocolVersion) } - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) store.chain = chain store.commits = commits @@ -749,8 +753,7 @@ func testHandshakeReplay(t *testing.T, sim *simulatorTestSuite, nBlocks int, mod // run nBlocks against a new client to build up the app state. // use a throwaway tendermint state proxyApp := proxy.NewAppConns(clientCreator2, proxy.NopMetrics()) - stateDB1 := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB1) + stateStore := sm.NewStore(dbm.NewMemDB(), sm.StoreOptions{DiscardABCIResponses: false}) err := stateStore.Save(genesisState) require.NoError(t, err) buildAppStateFromChain(proxyApp, stateStore, sim.Mempool, sim.Evpool, genesisState, chain, nBlocks, mode, store) @@ -950,7 +953,9 @@ func TestHandshakePanicsIfAppReturnsWrongAppHash(t *testing.T) { pubKey, err := privVal.GetPubKey(context.Background()) require.NoError(t, err) stateDB, state, store := stateAndStore(cfg, pubKey, appVersion) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) genDoc, _ := sm.MakeGenesisDocFromFile(cfg.GenesisFile()) state.LastValidators = state.Validators.Copy() // mode = 0 for committing all the blocks @@ -1161,7 +1166,9 @@ func stateAndStore( pubKey crypto.PubKey, appVersion uint64) (dbm.DB, sm.State, *mockBlockStore) { stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state, _ := sm.MakeGenesisStateFromFile(cfg.GenesisFile()) state.Version.Consensus.App = appVersion store := newMockBlockStore(cfg, state.ConsensusParams) @@ -1242,7 +1249,9 @@ func TestHandshakeUpdatesValidators(t *testing.T) { pubKey, err := privVal.GetPubKey(context.Background()) require.NoError(t, err) stateDB, state, store := stateAndStore(cfg, pubKey, 0x0) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) oldValAddr := state.Validators.Validators[0].Address diff --git a/internal/consensus/wal_generator.go b/internal/consensus/wal_generator.go index 6ac438c4a..7f6f4ea11 100644 --- a/internal/consensus/wal_generator.go +++ b/internal/consensus/wal_generator.go @@ -53,7 +53,9 @@ func WALGenerateNBlocks(t *testing.T, wr io.Writer, numBlocks int) (err error) { } blockStoreDB := dbm.NewMemDB() stateDB := blockStoreDB - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state, err := sm.MakeGenesisState(genDoc) if err != nil { return fmt.Errorf("failed to make genesis state: %w", err) diff --git a/internal/evidence/pool_test.go b/internal/evidence/pool_test.go index f38c09e02..6de8c569e 100644 --- a/internal/evidence/pool_test.go +++ b/internal/evidence/pool_test.go @@ -387,7 +387,9 @@ func TestRecoverPendingEvidence(t *testing.T) { func initializeStateFromValidatorSet(t *testing.T, valSet *types.ValidatorSet, height int64) sm.Store { stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state := sm.State{ ChainID: evidenceChainID, InitialHeight: 1, diff --git a/internal/inspect/inspect.go b/internal/inspect/inspect.go index 3f49866b3..7ae7a562e 100644 --- a/internal/inspect/inspect.go +++ b/internal/inspect/inspect.go @@ -77,7 +77,7 @@ func NewFromConfig(logger log.Logger, cfg *config.Config) (*Inspector, error) { if err != nil { return nil, err } - ss := state.NewStore(sDB) + ss := state.NewStore(sDB, state.StoreOptions{DiscardABCIResponses: false}) return New(cfg.RPC, bs, ss, sinks, logger), nil } diff --git a/internal/rpc/core/blocks_test.go b/internal/rpc/core/blocks_test.go index 213845bf4..a1861f089 100644 --- a/internal/rpc/core/blocks_test.go +++ b/internal/rpc/core/blocks_test.go @@ -81,7 +81,9 @@ func TestBlockResults(t *testing.T) { } env := &Environment{} - env.StateStore = sm.NewStore(dbm.NewMemDB()) + env.StateStore = sm.NewStore(dbm.NewMemDB(), sm.StoreOptions{ + DiscardABCIResponses: false, + }) err := env.StateStore.SaveABCIResponses(100, results) require.NoError(t, err) mockstore := &mocks.BlockStore{} diff --git a/internal/state/errors.go b/internal/state/errors.go index 6e0cdfa47..38c581f7d 100644 --- a/internal/state/errors.go +++ b/internal/state/errors.go @@ -1,6 +1,9 @@ package state -import "fmt" +import ( + "errors" + "fmt" +) type ( ErrInvalidBlock error @@ -99,3 +102,5 @@ func (e ErrNoConsensusParamsForHeight) Error() string { func (e ErrNoABCIResponsesForHeight) Error() string { return fmt.Sprintf("could not find results for height #%d", e.Height) } + +var ErrABCIResponsesNotPersisted = errors.New("node is not persisting abci responses") diff --git a/internal/state/execution_test.go b/internal/state/execution_test.go index a66b677f9..1987119ca 100644 --- a/internal/state/execution_test.go +++ b/internal/state/execution_test.go @@ -42,7 +42,9 @@ func TestApplyBlock(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, _ := makeState(1, 1) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mmock.Mempool{}, sm.EmptyEvidencePool{}, blockStore) @@ -67,7 +69,9 @@ func TestBeginBlockValidators(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // no need to check error again state, stateDB, _ := makeState(2, 2) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) prevHash := state.LastBlockID.Hash prevParts := types.PartSetHeader{} @@ -130,7 +134,9 @@ func TestBeginBlockByzantineValidators(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, privVals := makeState(1, 1) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) defaultEvidenceTime := time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC) privVal := privVals[state.Validators.Validators[0].Address.String()] @@ -355,7 +361,9 @@ func TestEndBlockValidatorUpdates(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, _ := makeState(1, 1) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( @@ -428,7 +436,9 @@ func TestEndBlockValidatorUpdatesResultingInEmptySet(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, _ := makeState(1, 1) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, diff --git a/internal/state/helpers_test.go b/internal/state/helpers_test.go index 0cedebb00..d8e4ebf2f 100644 --- a/internal/state/helpers_test.go +++ b/internal/state/helpers_test.go @@ -111,7 +111,9 @@ func makeState(nVals, height int) (sm.State, dbm.DB, map[string]types.PrivValida }) stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) if err := stateStore.Save(s); err != nil { panic(err) } diff --git a/internal/state/mocks/store.go b/internal/state/mocks/store.go index 91dad3127..ecb665585 100644 --- a/internal/state/mocks/store.go +++ b/internal/state/mocks/store.go @@ -108,6 +108,29 @@ func (_m *Store) LoadConsensusParams(_a0 int64) (types.ConsensusParams, error) { return r0, r1 } +// LoadLastABCIResponse provides a mock function with given fields: _a0 +func (_m *Store) LoadLastABCIResponse(_a0 int64) (*tendermintstate.ABCIResponses, error) { + ret := _m.Called(_a0) + + var r0 *tendermintstate.ABCIResponses + if rf, ok := ret.Get(0).(func(int64) *tendermintstate.ABCIResponses); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*tendermintstate.ABCIResponses) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(int64) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // LoadValidators provides a mock function with given fields: _a0 func (_m *Store) LoadValidators(_a0 int64) (*types.ValidatorSet, error) { ret := _m.Called(_a0) diff --git a/internal/state/rollback_test.go b/internal/state/rollback_test.go index ad7f12afc..e9351dc9a 100644 --- a/internal/state/rollback_test.go +++ b/internal/state/rollback_test.go @@ -78,7 +78,10 @@ func TestRollback(t *testing.T) { } func TestRollbackNoState(t *testing.T) { - stateStore := state.NewStore(dbm.NewMemDB()) + stateStore := state.NewStore(dbm.NewMemDB(), + state.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := &mocks.BlockStore{} _, _, err := state.Rollback(blockStore, stateStore) @@ -111,7 +114,7 @@ func TestRollbackDifferentStateHeight(t *testing.T) { } func setupStateStore(t *testing.T, height int64) state.Store { - stateStore := state.NewStore(dbm.NewMemDB()) + stateStore := state.NewStore(dbm.NewMemDB(), state.StoreOptions{DiscardABCIResponses: false}) valSet, _ := factory.RandValidatorSet(5, 10) params := types.DefaultConsensusParams() diff --git a/internal/state/state_test.go b/internal/state/state_test.go index fdf681294..0a185bb1d 100644 --- a/internal/state/state_test.go +++ b/internal/state/state_test.go @@ -32,7 +32,9 @@ func setupTestCase(t *testing.T) (func(t *testing.T), dbm.DB, sm.State) { dbType := dbm.BackendType(cfg.DBBackend) stateDB, err := dbm.NewDB("state", dbType, cfg.DBDir()) require.NoError(t, err) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state, err := stateStore.Load() require.NoError(t, err) require.Empty(t, state) @@ -82,7 +84,9 @@ func TestMakeGenesisStateNilValidators(t *testing.T) { func TestStateSaveLoad(t *testing.T) { tearDown, stateDB, state := setupTestCase(t) defer tearDown(t) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) assert := assert.New(t) state.LastBlockHeight++ @@ -101,7 +105,9 @@ func TestStateSaveLoad(t *testing.T) { func TestABCIResponsesSaveLoad1(t *testing.T) { tearDown, stateDB, state := setupTestCase(t) defer tearDown(t) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) assert := assert.New(t) state.LastBlockHeight++ @@ -134,7 +140,9 @@ func TestABCIResponsesSaveLoad2(t *testing.T) { defer tearDown(t) assert := assert.New(t) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) cases := [...]struct { // Height is implied to equal index+2, @@ -222,7 +230,9 @@ func TestValidatorSimpleSaveLoad(t *testing.T) { defer tearDown(t) assert := assert.New(t) - statestore := sm.NewStore(stateDB) + statestore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) // Can't load anything for height 0. _, err := statestore.LoadValidators(0) @@ -255,7 +265,9 @@ func TestValidatorSimpleSaveLoad(t *testing.T) { func TestOneValidatorChangesSaveLoad(t *testing.T) { tearDown, stateDB, state := setupTestCase(t) defer tearDown(t) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) // Change vals at these heights. changeHeights := []int64{1, 2, 4, 5, 10, 15, 16, 17, 20} @@ -907,7 +919,9 @@ func TestStoreLoadValidatorsIncrementsProposerPriority(t *testing.T) { const valSetSize = 2 tearDown, stateDB, state := setupTestCase(t) t.Cleanup(func() { tearDown(t) }) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state.Validators = genValSet(valSetSize) state.NextValidators = state.Validators.CopyIncrementProposerPriority(1) err := stateStore.Save(state) @@ -932,7 +946,9 @@ func TestManyValidatorChangesSaveLoad(t *testing.T) { const valSetSize = 7 tearDown, stateDB, state := setupTestCase(t) defer tearDown(t) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) require.Equal(t, int64(0), state.LastBlockHeight) state.Validators = genValSet(valSetSize) state.NextValidators = state.Validators.CopyIncrementProposerPriority(1) @@ -996,7 +1012,9 @@ func TestConsensusParamsChangesSaveLoad(t *testing.T) { tearDown, stateDB, state := setupTestCase(t) defer tearDown(t) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) // Change vals at these heights. changeHeights := []int64{1, 2, 4, 5, 10, 15, 16, 17, 20} diff --git a/internal/state/store.go b/internal/state/store.go index 6d9807e40..0b8ea79b7 100644 --- a/internal/state/store.go +++ b/internal/state/store.go @@ -29,10 +29,11 @@ const ( const ( // prefixes are unique across all tm db's - prefixValidators = int64(5) - prefixConsensusParams = int64(6) - prefixABCIResponses = int64(7) - prefixState = int64(8) + prefixValidators = int64(5) + prefixConsensusParams = int64(6) + prefixAllABCIResponses = int64(7) + prefixState = int64(8) + prefixLastABCIResponse = int64(13) ) func encodeKey(prefix int64, height int64) []byte { @@ -52,11 +53,12 @@ func consensusParamsKey(height int64) []byte { } func abciResponsesKey(height int64) []byte { - return encodeKey(prefixABCIResponses, height) + return encodeKey(prefixAllABCIResponses, height) } // stateKey should never change after being set in init() var stateKey []byte +var lastABCIResponseKey []byte func init() { var err error @@ -64,6 +66,11 @@ func init() { if err != nil { panic(err) } + + lastABCIResponseKey, err = orderedcode.Append(nil, prefixLastABCIResponse) + if err != nil { + panic(err) + } } //---------------------- @@ -81,6 +88,8 @@ type Store interface { LoadValidators(int64) (*types.ValidatorSet, error) // LoadABCIResponses loads the abciResponse for a given height LoadABCIResponses(int64) (*tmstate.ABCIResponses, error) + // LoadLastABCIResponse loads the last abciResponse for a given height + LoadLastABCIResponse(int64) (*tmstate.ABCIResponses, error) // LoadConsensusParams loads the consensus params for a given height LoadConsensusParams(int64) (types.ConsensusParams, error) // Save overwrites the previous state with the updated one @@ -100,13 +109,24 @@ type Store interface { // dbStore wraps a db (github.com/tendermint/tm-db) type dbStore struct { db dbm.DB + + StoreOptions +} + +type StoreOptions struct { + + // DiscardABCIResponses determines whether or not the store + // retains all ABCIResponses. If DiscardABCiResponses is enabled, + // the store will maintain only the response object from the latest + // height. + DiscardABCIResponses bool } var _ Store = (*dbStore)(nil) // NewStore creates the dbStore of the state pkg. -func NewStore(db dbm.DB) Store { - return dbStore{db} +func NewStore(db dbm.DB, options StoreOptions) Store { + return dbStore{db, options} } // LoadState loads the State from the database. @@ -407,44 +427,71 @@ func ABCIResponsesResultsHash(ar *tmstate.ABCIResponses) []byte { } // LoadABCIResponses loads the ABCIResponses for the given height from the -// database. If not found, ErrNoABCIResponsesForHeight is returned. -// -// This is useful for recovering from crashes where we called app.Commit and -// before we called s.Save(). It can also be used to produce Merkle proofs of -// the result of txs. +// database. If the node has DiscardABCIResponses set to true, ErrABCIResponsesNotPersisted +// is persisted. If not found, ErrNoABCIResponsesForHeight is returned. func (store dbStore) LoadABCIResponses(height int64) (*tmstate.ABCIResponses, error) { + if store.DiscardABCIResponses { + return nil, ErrABCIResponsesNotPersisted + } + buf, err := store.db.Get(abciResponsesKey(height)) if err != nil { return nil, err } - if len(buf) == 0 { + if len(buf) == 0 { return nil, ErrNoABCIResponsesForHeight{height} } - abciResponses := new(tmstate.ABCIResponses) err = abciResponses.Unmarshal(buf) if err != nil { // DATA HAS BEEN CORRUPTED OR THE SPEC HAS CHANGED tmos.Exit(fmt.Sprintf(`LoadABCIResponses: Data has been corrupted or its spec has - changed: %v\n`, err)) + changed: %v\n`, err)) } // TODO: ensure that buf is completely read. return abciResponses, nil } +// LoadLastABCIResponses 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. +// +// This method is used for recovering in the case that we called the Commit ABCI +// method on the application but crashed before persisting the results. +func (store dbStore) LoadLastABCIResponse(height int64) (*tmstate.ABCIResponses, error) { + bz, err := store.db.Get(lastABCIResponseKey) + if err != nil { + return nil, err + } + + if len(bz) == 0 { + return nil, errors.New("value retrieved from db is empty") + } + + abciResponse := new(tmstate.ABCIResponsesInfo) + err = abciResponse.Unmarshal(bz) + if err != nil { + tmos.Exit(fmt.Sprintf(`LoadLastABCIResponses: Data has been corrupted or its spec has + changed: %v\n`, err)) + } + + // Here we validate the result by comparing its height to the expected height. + if height != abciResponse.GetHeight() { + return nil, errors.New("expected height %d but last stored abci responses was at height %d") + } + + return abciResponse.AbciResponses, nil +} + // SaveABCIResponses persists the ABCIResponses to the database. // This is useful in case we crash after app.Commit and before s.Save(). // Responses are indexed by height so they can also be loaded later to produce // Merkle proofs. // -// Exposed for testing. +//CONTRACT: height must be monotonically increasing every time this is called. func (store dbStore) SaveABCIResponses(height int64, abciResponses *tmstate.ABCIResponses) error { - return store.saveABCIResponses(height, abciResponses) -} - -func (store dbStore) saveABCIResponses(height int64, abciResponses *tmstate.ABCIResponses) error { var dtxs []*abci.ResponseDeliverTx // strip nil values, for _, tx := range abciResponses.DeliverTxs { @@ -452,15 +499,32 @@ func (store dbStore) saveABCIResponses(height int64, abciResponses *tmstate.ABCI dtxs = append(dtxs, tx) } } - abciResponses.DeliverTxs = dtxs - bz, err := abciResponses.Marshal() + // If the flag is false then we save the ABCIResponse. This can be used for the /BlockResults + // query or to reindex an event using the command line. + if !store.DiscardABCIResponses { + bz, err := abciResponses.Marshal() + if err != nil { + return err + } + if err := store.db.Set(abciResponsesKey(height), bz); err != nil { + return err + } + } + + // We always save the last ABCI response for crash recovery. + // This overwrites the previous saved ABCI Response. + response := &tmstate.ABCIResponsesInfo{ + AbciResponses: abciResponses, + Height: height, + } + bz, err := response.Marshal() if err != nil { return err } - return store.db.SetSync(abciResponsesKey(height), bz) + return store.db.SetSync(lastABCIResponseKey, bz) } // SaveValidatorSets is used to save the validator set over multiple heights. @@ -547,7 +611,7 @@ func loadValidatorsInfo(db dbm.DB, height int64) (*tmstate.ValidatorsInfo, error if err != nil { // DATA HAS BEEN CORRUPTED OR THE SPEC HAS CHANGED tmos.Exit(fmt.Sprintf(`LoadValidators: Data has been corrupted or its spec has changed: - %v\n`, err)) + %v\n`, err)) } // TODO: ensure that buf is completely read. diff --git a/internal/state/store_test.go b/internal/state/store_test.go index 815d1f7a1..1dc78af37 100644 --- a/internal/state/store_test.go +++ b/internal/state/store_test.go @@ -7,8 +7,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - dbm "github.com/tendermint/tm-db" - abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" @@ -18,6 +16,7 @@ import ( tmrand "github.com/tendermint/tendermint/libs/rand" tmstate "github.com/tendermint/tendermint/proto/tendermint/state" "github.com/tendermint/tendermint/types" + dbm "github.com/tendermint/tm-db" ) const ( @@ -27,7 +26,9 @@ const ( func TestStoreBootstrap(t *testing.T) { stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) val, _ := factory.RandValidator(true, 10) val2, _ := factory.RandValidator(true, 10) val3, _ := factory.RandValidator(true, 10) @@ -53,7 +54,9 @@ func TestStoreBootstrap(t *testing.T) { func TestStoreLoadValidators(t *testing.T) { stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) val, _ := factory.RandValidator(true, 10) val2, _ := factory.RandValidator(true, 10) val3, _ := factory.RandValidator(true, 10) @@ -108,7 +111,9 @@ func BenchmarkLoadValidators(b *testing.B) { dbType := dbm.BackendType(cfg.DBBackend) stateDB, err := dbm.NewDB("state", dbType, cfg.DBDir()) require.NoError(b, err) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) state, err := sm.MakeGenesisStateFromFile(cfg.GenesisFile()) if err != nil { b.Fatal(err) @@ -142,7 +147,9 @@ func BenchmarkLoadValidators(b *testing.B) { func TestStoreLoadConsensusParams(t *testing.T) { stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) err := stateStore.Save(makeRandomStateFromConsensusParams(types.DefaultConsensusParams(), 1, 1)) require.NoError(t, err) params, err := stateStore.LoadConsensusParams(1) @@ -185,7 +192,9 @@ func TestPruneStates(t *testing.T) { t.Run(name, func(t *testing.T) { db := dbm.NewMemDB() - stateStore := sm.NewStore(db) + stateStore := sm.NewStore(db, sm.StoreOptions{ + DiscardABCIResponses: false, + }) pk := ed25519.GenPrivKey().PubKey() // Generate a bunch of state data. Validators change for heights ending with 3, and @@ -307,3 +316,72 @@ func TestABCIResponsesResultsHash(t *testing.T) { require.NoError(t, err) assert.NoError(t, proof.Verify(root, bz)) } + +func TestLastABCIResponses(t *testing.T) { + // create an empty state store. + t.Run("Not persisting responses", func(t *testing.T) { + stateDB := dbm.NewMemDB() + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) + responses, err := stateStore.LoadABCIResponses(1) + require.Error(t, err) + require.Nil(t, responses) + // stub the abciresponses. + response1 := &tmstate.ABCIResponses{ + BeginBlock: &abci.ResponseBeginBlock{}, + DeliverTxs: []*abci.ResponseDeliverTx{ + {Code: 32, Data: []byte("Hello"), Log: "Huh?"}, + }, + EndBlock: &abci.ResponseEndBlock{}, + } + // create new db and state store and set discard abciresponses to false. + stateDB = dbm.NewMemDB() + stateStore = sm.NewStore(stateDB, sm.StoreOptions{DiscardABCIResponses: false}) + height := int64(10) + // save the last abci response. + err = stateStore.SaveABCIResponses(height, response1) + require.NoError(t, err) + // search for the last abciresponse and check if it has saved. + lastResponse, err := stateStore.LoadLastABCIResponse(height) + require.NoError(t, err) + // check to see if the saved response height is the same as the loaded height. + assert.Equal(t, lastResponse, response1) + // use an incorret height to make sure the state store errors. + _, err = stateStore.LoadLastABCIResponse(height + 1) + assert.Error(t, err) + // check if the abci response didnt save in the abciresponses. + responses, err = stateStore.LoadABCIResponses(height) + require.NoError(t, err, responses) + require.Equal(t, response1, responses) + }) + + t.Run("persisting responses", func(t *testing.T) { + stateDB := dbm.NewMemDB() + height := int64(10) + // stub the second abciresponse. + response2 := &tmstate.ABCIResponses{ + BeginBlock: &abci.ResponseBeginBlock{}, + DeliverTxs: []*abci.ResponseDeliverTx{ + {Code: 44, Data: []byte("Hello again"), Log: "????"}, + }, + EndBlock: &abci.ResponseEndBlock{}, + } + // create a new statestore with the responses on. + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: true, + }) + // save an additional response. + err := stateStore.SaveABCIResponses(height+1, response2) + require.NoError(t, err) + // check to see if the response saved by calling the last response. + lastResponse2, err := stateStore.LoadLastABCIResponse(height + 1) + require.NoError(t, err) + // check to see if the saved response height is the same as the loaded height. + assert.Equal(t, response2, lastResponse2) + // should error as we are no longer saving the response. + _, err = stateStore.LoadABCIResponses(height + 1) + assert.Equal(t, sm.ErrABCIResponsesNotPersisted, err) + }) + +} diff --git a/internal/state/validation_test.go b/internal/state/validation_test.go index eb0cebbb7..ffd7951fd 100644 --- a/internal/state/validation_test.go +++ b/internal/state/validation_test.go @@ -33,7 +33,9 @@ func TestValidateBlockHeader(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, privVals := makeState(3, 1) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, @@ -120,7 +122,9 @@ func TestValidateBlockCommit(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, privVals := makeState(1, 1) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) blockExec := sm.NewBlockExecutor( stateStore, @@ -241,7 +245,9 @@ func TestValidateBlockEvidence(t *testing.T) { defer proxyApp.Stop() //nolint:errcheck // ignore for tests state, stateDB, privVals := makeState(4, 1) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) defaultEvidenceTime := time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC) diff --git a/node/node.go b/node/node.go index fcdc547a5..93ed3e3eb 100644 --- a/node/node.go +++ b/node/node.go @@ -139,7 +139,7 @@ func makeNode(cfg *config.Config, } closers = append(closers, dbCloser) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{DiscardABCIResponses: cfg.RPC.DiscardABCIResponses}) genDoc, err := genesisDocProvider() if err != nil { diff --git a/node/node_test.go b/node/node_test.go index 305f9b873..c3bce6d11 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -232,7 +232,9 @@ func TestCreateProposalBlock(t *testing.T) { const height int64 = 1 state, stateDB, privVals := state(1, height) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) maxBytes := 16384 const partSize uint32 = 256 maxEvidenceBytes := int64(maxBytes / 2) @@ -325,7 +327,9 @@ func TestMaxTxsProposalBlockSize(t *testing.T) { const height int64 = 1 state, stateDB, _ := state(1, height) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) const maxBytes int64 = 16384 const partSize uint32 = 256 @@ -387,7 +391,9 @@ func TestMaxProposalBlockSize(t *testing.T) { logger := log.TestingLogger() state, stateDB, _ := state(types.MaxVotesCount, int64(1)) - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) blockStore := store.NewBlockStore(dbm.NewMemDB()) const maxBytes int64 = 1024 * 1024 * 2 state.ConsensusParams.Block.MaxBytes = maxBytes @@ -625,7 +631,9 @@ func state(nVals int, height int64) (sm.State, dbm.DB, []types.PrivValidator) { // save validators to db for 2 heights stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) if err := stateStore.Save(s); err != nil { panic(err) } @@ -648,7 +656,9 @@ func loadStatefromGenesis(t *testing.T) sm.State { t.Helper() stateDB := dbm.NewMemDB() - stateStore := sm.NewStore(stateDB) + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: false, + }) cfg, err := config.ResetTestRoot("load_state_from_genesis") require.NoError(t, err) diff --git a/node/setup.go b/node/setup.go index 3dad14991..7c943880f 100644 --- a/node/setup.go +++ b/node/setup.go @@ -297,7 +297,9 @@ func createEvidenceReactor( logger = logger.With("module", "evidence") reactorShim := p2p.NewReactorShim(logger, "EvidenceShim", evidence.ChannelShims) - evidencePool, err := evidence.NewPool(logger, evidenceDB, sm.NewStore(stateDB), blockStore) + evidencePool, err := evidence.NewPool(logger, evidenceDB, sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: cfg.RPC.DiscardABCIResponses, + }), blockStore) if err != nil { return nil, nil, nil, fmt.Errorf("creating evidence pool: %w", err) } diff --git a/proto/tendermint/state/types.pb.go b/proto/tendermint/state/types.pb.go index d94724fff..af9367095 100644 --- a/proto/tendermint/state/types.pb.go +++ b/proto/tendermint/state/types.pb.go @@ -199,6 +199,58 @@ func (m *ConsensusParamsInfo) GetLastHeightChanged() int64 { return 0 } +type ABCIResponsesInfo struct { + AbciResponses *ABCIResponses `protobuf:"bytes,1,opt,name=abci_responses,json=abciResponses,proto3" json:"abci_responses,omitempty"` + Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` +} + +func (m *ABCIResponsesInfo) Reset() { *m = ABCIResponsesInfo{} } +func (m *ABCIResponsesInfo) String() string { return proto.CompactTextString(m) } +func (*ABCIResponsesInfo) ProtoMessage() {} +func (*ABCIResponsesInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_ccfacf933f22bf93, []int{3} +} +func (m *ABCIResponsesInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ABCIResponsesInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ABCIResponsesInfo.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 *ABCIResponsesInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ABCIResponsesInfo.Merge(m, src) +} +func (m *ABCIResponsesInfo) XXX_Size() int { + return m.Size() +} +func (m *ABCIResponsesInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ABCIResponsesInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_ABCIResponsesInfo proto.InternalMessageInfo + +func (m *ABCIResponsesInfo) GetAbciResponses() *ABCIResponses { + if m != nil { + return m.AbciResponses + } + return nil +} + +func (m *ABCIResponsesInfo) GetHeight() int64 { + if m != nil { + return m.Height + } + return 0 +} + type Version struct { Consensus version.Consensus `protobuf:"bytes,1,opt,name=consensus,proto3" json:"consensus"` Software string `protobuf:"bytes,2,opt,name=software,proto3" json:"software,omitempty"` @@ -208,7 +260,7 @@ func (m *Version) Reset() { *m = Version{} } func (m *Version) String() string { return proto.CompactTextString(m) } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{3} + return fileDescriptor_ccfacf933f22bf93, []int{4} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -284,7 +336,7 @@ func (m *State) Reset() { *m = State{} } func (m *State) String() string { return proto.CompactTextString(m) } func (*State) ProtoMessage() {} func (*State) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{4} + return fileDescriptor_ccfacf933f22bf93, []int{5} } func (m *State) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -415,6 +467,7 @@ func init() { proto.RegisterType((*ABCIResponses)(nil), "tendermint.state.ABCIResponses") proto.RegisterType((*ValidatorsInfo)(nil), "tendermint.state.ValidatorsInfo") proto.RegisterType((*ConsensusParamsInfo)(nil), "tendermint.state.ConsensusParamsInfo") + proto.RegisterType((*ABCIResponsesInfo)(nil), "tendermint.state.ABCIResponsesInfo") proto.RegisterType((*Version)(nil), "tendermint.state.Version") proto.RegisterType((*State)(nil), "tendermint.state.State") } @@ -422,55 +475,58 @@ func init() { func init() { proto.RegisterFile("tendermint/state/types.proto", fileDescriptor_ccfacf933f22bf93) } var fileDescriptor_ccfacf933f22bf93 = []byte{ - // 763 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcf, 0x6f, 0xd3, 0x30, - 0x14, 0x6e, 0xe8, 0xb6, 0xb6, 0xce, 0xda, 0x0e, 0x8f, 0x43, 0xd6, 0xb1, 0xb4, 0x2b, 0x3f, 0x34, - 0x71, 0x48, 0xa5, 0x71, 0x40, 0x5c, 0x26, 0x2d, 0x2d, 0x62, 0x95, 0x26, 0x04, 0xd9, 0xb4, 0x03, - 0x97, 0xc8, 0x6d, 0xbc, 0x24, 0xa2, 0x4d, 0xa2, 0xd8, 0x2d, 0xe3, 0x0f, 0xe0, 0xbe, 0x2b, 0xff, - 0xd1, 0x8e, 0x3b, 0x22, 0x0e, 0x03, 0xba, 0x7f, 0x04, 0xd9, 0xce, 0x0f, 0xb7, 0x65, 0xd2, 0x10, - 0x37, 0xfb, 0x7d, 0xdf, 0xfb, 0xfc, 0xf9, 0xf9, 0x3d, 0x19, 0x3c, 0xa6, 0x38, 0x70, 0x70, 0x3c, - 0xf6, 0x03, 0xda, 0x21, 0x14, 0x51, 0xdc, 0xa1, 0x5f, 0x22, 0x4c, 0x8c, 0x28, 0x0e, 0x69, 0x08, - 0x37, 0x72, 0xd4, 0xe0, 0x68, 0xe3, 0x91, 0x1b, 0xba, 0x21, 0x07, 0x3b, 0x6c, 0x25, 0x78, 0x8d, - 0x6d, 0x49, 0x05, 0x0d, 0x86, 0xbe, 0x2c, 0xd2, 0x90, 0x8f, 0xe0, 0xf1, 0x39, 0xb4, 0xb5, 0x84, - 0x4e, 0xd1, 0xc8, 0x77, 0x10, 0x0d, 0xe3, 0x84, 0xb1, 0xb3, 0xc4, 0x88, 0x50, 0x8c, 0xc6, 0xa9, - 0x80, 0x2e, 0xc1, 0x53, 0x1c, 0x13, 0x3f, 0x0c, 0xe6, 0x0e, 0x68, 0xba, 0x61, 0xe8, 0x8e, 0x70, - 0x87, 0xef, 0x06, 0x93, 0xf3, 0x0e, 0xf5, 0xc7, 0x98, 0x50, 0x34, 0x8e, 0x04, 0xa1, 0xfd, 0x43, - 0x01, 0xd5, 0x43, 0xb3, 0xdb, 0xb7, 0x30, 0x89, 0xc2, 0x80, 0x60, 0x02, 0xbb, 0x40, 0x75, 0xf0, - 0xc8, 0x9f, 0xe2, 0xd8, 0xa6, 0x17, 0x44, 0x53, 0x5a, 0xc5, 0x3d, 0x75, 0xbf, 0x6d, 0x48, 0xc5, - 0x60, 0x97, 0x34, 0xd2, 0x84, 0x9e, 0xe0, 0x9e, 0x5e, 0x58, 0xc0, 0x49, 0x97, 0x04, 0x1e, 0x80, - 0x0a, 0x0e, 0x1c, 0x7b, 0x30, 0x0a, 0x87, 0x9f, 0xb4, 0x07, 0x2d, 0x65, 0x4f, 0xdd, 0xdf, 0xbd, - 0x53, 0xe2, 0x4d, 0xe0, 0x98, 0x8c, 0x68, 0x95, 0x71, 0xb2, 0x82, 0x3d, 0xa0, 0x0e, 0xb0, 0xeb, - 0x07, 0x89, 0x42, 0x91, 0x2b, 0x3c, 0xb9, 0x53, 0xc1, 0x64, 0x5c, 0xa1, 0x01, 0x06, 0xd9, 0xba, - 0xfd, 0x55, 0x01, 0xb5, 0xb3, 0xb4, 0xa0, 0xa4, 0x1f, 0x9c, 0x87, 0xb0, 0x0b, 0xaa, 0x59, 0x89, - 0x6d, 0x82, 0xa9, 0xa6, 0x70, 0x69, 0x5d, 0x96, 0x16, 0x05, 0xcc, 0x12, 0x4f, 0x30, 0xb5, 0xd6, - 0xa7, 0xd2, 0x0e, 0x1a, 0x60, 0x73, 0x84, 0x08, 0xb5, 0x3d, 0xec, 0xbb, 0x1e, 0xb5, 0x87, 0x1e, - 0x0a, 0x5c, 0xec, 0xf0, 0x7b, 0x16, 0xad, 0x87, 0x0c, 0x3a, 0xe2, 0x48, 0x57, 0x00, 0xed, 0x6f, - 0x0a, 0xd8, 0xec, 0x32, 0x9f, 0x01, 0x99, 0x90, 0xf7, 0xfc, 0xfd, 0xb8, 0x19, 0x0b, 0x6c, 0x0c, - 0xd3, 0xb0, 0x2d, 0xde, 0x35, 0xf1, 0xb3, 0xbb, 0xec, 0x67, 0x41, 0xc0, 0x5c, 0xb9, 0xba, 0x69, - 0x16, 0xac, 0xfa, 0x70, 0x3e, 0xfc, 0xcf, 0xde, 0x3c, 0x50, 0x3a, 0x13, 0x8d, 0x03, 0x0f, 0x41, - 0x25, 0x53, 0x4b, 0x7c, 0xec, 0xc8, 0x3e, 0x92, 0x06, 0xcb, 0x9d, 0x24, 0x1e, 0xf2, 0x2c, 0xd8, - 0x00, 0x65, 0x12, 0x9e, 0xd3, 0xcf, 0x28, 0xc6, 0xfc, 0xc8, 0x8a, 0x95, 0xed, 0xdb, 0xbf, 0xd7, - 0xc0, 0xea, 0x09, 0x9b, 0x23, 0xf8, 0x1a, 0x94, 0x12, 0xad, 0xe4, 0x98, 0x2d, 0x63, 0x71, 0xd6, - 0x8c, 0xc4, 0x54, 0x72, 0x44, 0xca, 0x87, 0xcf, 0x41, 0x79, 0xe8, 0x21, 0x3f, 0xb0, 0x7d, 0x71, - 0xa7, 0x8a, 0xa9, 0xce, 0x6e, 0x9a, 0xa5, 0x2e, 0x8b, 0xf5, 0x7b, 0x56, 0x89, 0x83, 0x7d, 0x07, - 0x3e, 0x03, 0x35, 0x3f, 0xf0, 0xa9, 0x8f, 0x46, 0x49, 0x25, 0xb4, 0x1a, 0xaf, 0x40, 0x35, 0x89, - 0x8a, 0x22, 0xc0, 0x17, 0x80, 0x97, 0x44, 0xb4, 0x59, 0xca, 0x2c, 0x72, 0x66, 0x9d, 0x01, 0xbc, - 0x8f, 0x12, 0xae, 0x05, 0xaa, 0x12, 0xd7, 0x77, 0xb4, 0x95, 0x65, 0xef, 0xe2, 0xa9, 0x78, 0x56, - 0xbf, 0x67, 0x6e, 0x32, 0xef, 0xb3, 0x9b, 0xa6, 0x7a, 0x9c, 0x4a, 0xf5, 0x7b, 0x96, 0x9a, 0xe9, - 0xf6, 0x1d, 0x78, 0x0c, 0xea, 0x92, 0x26, 0x1b, 0x4e, 0x6d, 0x95, 0xab, 0x36, 0x0c, 0x31, 0xb9, - 0x46, 0x3a, 0xb9, 0xc6, 0x69, 0x3a, 0xb9, 0x66, 0x99, 0xc9, 0x5e, 0xfe, 0x6c, 0x2a, 0x56, 0x35, - 0xd3, 0x62, 0x28, 0x7c, 0x0b, 0xea, 0x01, 0xbe, 0xa0, 0x76, 0xd6, 0xac, 0x44, 0x5b, 0xbb, 0x57, - 0x7b, 0xd7, 0x58, 0x5a, 0x3e, 0x29, 0xf0, 0x00, 0x00, 0x49, 0xa3, 0x74, 0x2f, 0x0d, 0x29, 0x83, - 0x19, 0xe1, 0xd7, 0x92, 0x44, 0xca, 0xf7, 0x33, 0xc2, 0xd2, 0x24, 0x23, 0x5d, 0xa0, 0xcb, 0xdd, - 0x9c, 0xeb, 0x65, 0x8d, 0x5d, 0xe1, 0x8f, 0xb5, 0x9d, 0x37, 0x76, 0x9e, 0x9d, 0xb4, 0xf8, 0x5f, - 0xc7, 0x0c, 0xfc, 0xe7, 0x98, 0xbd, 0x03, 0x4f, 0xe7, 0xc6, 0x6c, 0x41, 0x3f, 0xb3, 0xa7, 0x72, - 0x7b, 0x2d, 0x69, 0xee, 0xe6, 0x85, 0x52, 0x8f, 0x69, 0x23, 0xc6, 0x98, 0x4c, 0x46, 0x94, 0xd8, - 0x1e, 0x22, 0x9e, 0xb6, 0xde, 0x52, 0xf6, 0xd6, 0x45, 0x23, 0x5a, 0x22, 0x7e, 0x84, 0x88, 0x07, - 0xb7, 0x40, 0x19, 0x45, 0x91, 0xa0, 0x54, 0x39, 0xa5, 0x84, 0xa2, 0x88, 0x41, 0xe6, 0x87, 0xab, - 0x99, 0xae, 0x5c, 0xcf, 0x74, 0xe5, 0xd7, 0x4c, 0x57, 0x2e, 0x6f, 0xf5, 0xc2, 0xf5, 0xad, 0x5e, - 0xf8, 0x7e, 0xab, 0x17, 0x3e, 0xbe, 0x72, 0x7d, 0xea, 0x4d, 0x06, 0xc6, 0x30, 0x1c, 0x77, 0xe4, - 0x3f, 0x25, 0x5f, 0x8a, 0x8f, 0x6d, 0xf1, 0x4b, 0x1c, 0xac, 0xf1, 0xf8, 0xcb, 0x3f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0xa5, 0x17, 0xac, 0x23, 0x2d, 0x07, 0x00, 0x00, + // 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, } func (m *ABCIResponses) Marshal() (dAtA []byte, err error) { @@ -612,6 +668,46 @@ func (m *ConsensusParamsInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ABCIResponsesInfo) 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 *ABCIResponsesInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ABCIResponsesInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x10 + } + if m.AbciResponses != nil { + { + size, err := m.AbciResponses.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -747,12 +843,12 @@ func (m *State) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):]) - if err10 != nil { - return 0, err10 + 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 } - i -= n10 - i = encodeVarintTypes(dAtA, i, uint64(n10)) + i -= n11 + i = encodeVarintTypes(dAtA, i, uint64(n11)) i-- dAtA[i] = 0x2a { @@ -854,6 +950,22 @@ func (m *ConsensusParamsInfo) Size() (n int) { return n } +func (m *ABCIResponsesInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AbciResponses != nil { + l = m.AbciResponses.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + return n +} + func (m *Version) Size() (n int) { if m == nil { return 0 @@ -1300,6 +1412,111 @@ func (m *ConsensusParamsInfo) Unmarshal(dAtA []byte) error { } return nil } +func (m *ABCIResponsesInfo) 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: ABCIResponsesInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ABCIResponsesInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AbciResponses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AbciResponses == nil { + m.AbciResponses = &ABCIResponses{} + } + if err := m.AbciResponses.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Version) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/state/types.proto b/proto/tendermint/state/types.proto index 919da91e5..23b55b5f9 100644 --- a/proto/tendermint/state/types.proto +++ b/proto/tendermint/state/types.proto @@ -32,6 +32,11 @@ message ConsensusParamsInfo { int64 last_height_changed = 2; } +message ABCIResponsesInfo { + ABCIResponses abci_responses = 1; + int64 height = 2; +} + message Version { tendermint.version.Consensus consensus = 1 [(gogoproto.nullable) = false]; string software = 2; diff --git a/test/e2e/generator/generate.go b/test/e2e/generator/generate.go index c66c32e03..10363d0a1 100644 --- a/test/e2e/generator/generate.go +++ b/test/e2e/generator/generate.go @@ -184,7 +184,7 @@ func generateTestnet(r *rand.Rand, opt map[string]interface{}) (e2e.Manifest, er numValidators = 4 case "large": // FIXME Networks are kept small since large ones use too much CPU. - numSeeds = r.Intn(1) + numSeeds = r.Intn(2) numLightClients = r.Intn(2) numValidators = 4 + r.Intn(4) numFulls = r.Intn(4)