From 3b2dc8346dd48360f1cddea7a48db1bb48275e34 Mon Sep 17 00:00:00 2001 From: Nishant Das Date: Mon, 22 Jun 2020 23:25:55 +0800 Subject: [PATCH] Release State Field Trie (#6340) * remove flag and references * fix flag * Merge refs/heads/master into releaseStateFieldTrie * Merge refs/heads/master into releaseStateFieldTrie --- beacon-chain/state/state_trie.go | 134 +++++++++++--------------- beacon-chain/state/state_trie_test.go | 6 +- shared/featureconfig/config.go | 6 -- shared/featureconfig/flags.go | 12 +-- 4 files changed, 63 insertions(+), 95 deletions(-) diff --git a/beacon-chain/state/state_trie.go b/beacon-chain/state/state_trie.go index 7335f37fc7..e32d47c5cb 100644 --- a/beacon-chain/state/state_trie.go +++ b/beacon-chain/state/state_trie.go @@ -12,7 +12,6 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" pbp2p "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" "github.com/prysmaticlabs/prysm/shared/bytesutil" - "github.com/prysmaticlabs/prysm/shared/featureconfig" "github.com/prysmaticlabs/prysm/shared/hashutil" "github.com/prysmaticlabs/prysm/shared/htrutils" "github.com/prysmaticlabs/prysm/shared/params" @@ -246,111 +245,90 @@ func (b *BeaconState) rootSelector(field fieldIndex) ([32]byte, error) { case latestBlockHeader: return stateutil.BlockHeaderRoot(b.state.LatestBlockHeader) case blockRoots: - if featureconfig.Get().EnableFieldTrie { - if b.rebuildTrie[field] { - err := b.resetFieldTrie(field, b.state.BlockRoots, params.BeaconConfig().SlotsPerHistoricalRoot) - if err != nil { - return [32]byte{}, err - } - b.dirtyIndices[field] = []uint64{} - delete(b.rebuildTrie, field) - return b.stateFieldLeaves[field].TrieRoot() + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.BlockRoots, params.BeaconConfig().SlotsPerHistoricalRoot) + if err != nil { + return [32]byte{}, err } - return b.recomputeFieldTrie(blockRoots, b.state.BlockRoots) + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() } - return stateutil.RootsArrayHashTreeRoot(b.state.BlockRoots, params.BeaconConfig().SlotsPerHistoricalRoot, "BlockRoots") + return b.recomputeFieldTrie(blockRoots, b.state.BlockRoots) case stateRoots: - if featureconfig.Get().EnableFieldTrie { - if b.rebuildTrie[field] { - err := b.resetFieldTrie(field, b.state.StateRoots, params.BeaconConfig().SlotsPerHistoricalRoot) - if err != nil { - return [32]byte{}, err - } - b.dirtyIndices[field] = []uint64{} - delete(b.rebuildTrie, field) - return b.stateFieldLeaves[field].TrieRoot() + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.StateRoots, params.BeaconConfig().SlotsPerHistoricalRoot) + if err != nil { + return [32]byte{}, err } - return b.recomputeFieldTrie(stateRoots, b.state.StateRoots) + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() } - return stateutil.RootsArrayHashTreeRoot(b.state.StateRoots, params.BeaconConfig().SlotsPerHistoricalRoot, "StateRoots") + return b.recomputeFieldTrie(stateRoots, b.state.StateRoots) case historicalRoots: return htrutils.HistoricalRootsRoot(b.state.HistoricalRoots) case eth1Data: return stateutil.Eth1Root(hasher, b.state.Eth1Data) case eth1DataVotes: - if featureconfig.Get().EnableFieldTrie { - if b.rebuildTrie[field] { - err := b.resetFieldTrie(field, b.state.Eth1DataVotes, params.BeaconConfig().EpochsPerEth1VotingPeriod*params.BeaconConfig().SlotsPerEpoch) - if err != nil { - return [32]byte{}, err - } - b.dirtyIndices[field] = []uint64{} - delete(b.rebuildTrie, field) - return b.stateFieldLeaves[field].TrieRoot() + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.Eth1DataVotes, params.BeaconConfig().EpochsPerEth1VotingPeriod*params.BeaconConfig().SlotsPerEpoch) + if err != nil { + return [32]byte{}, err } - return b.recomputeFieldTrie(field, b.state.Eth1DataVotes) + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() } - return stateutil.Eth1DataVotesRoot(b.state.Eth1DataVotes) + return b.recomputeFieldTrie(field, b.state.Eth1DataVotes) case validators: - if featureconfig.Get().EnableFieldTrie { - if b.rebuildTrie[field] { - err := b.resetFieldTrie(field, b.state.Validators, params.BeaconConfig().ValidatorRegistryLimit) - if err != nil { - return [32]byte{}, err - } - b.dirtyIndices[validators] = []uint64{} - delete(b.rebuildTrie, validators) - return b.stateFieldLeaves[field].TrieRoot() + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.Validators, params.BeaconConfig().ValidatorRegistryLimit) + if err != nil { + return [32]byte{}, err } - return b.recomputeFieldTrie(validators, b.state.Validators) + b.dirtyIndices[validators] = []uint64{} + delete(b.rebuildTrie, validators) + return b.stateFieldLeaves[field].TrieRoot() } - return stateutil.ValidatorRegistryRoot(b.state.Validators) + return b.recomputeFieldTrie(validators, b.state.Validators) case balances: return stateutil.ValidatorBalancesRoot(b.state.Balances) case randaoMixes: - if featureconfig.Get().EnableFieldTrie { - if b.rebuildTrie[field] { - err := b.resetFieldTrie(field, b.state.RandaoMixes, params.BeaconConfig().EpochsPerHistoricalVector) - if err != nil { - return [32]byte{}, err - } - b.dirtyIndices[field] = []uint64{} - delete(b.rebuildTrie, field) - return b.stateFieldLeaves[field].TrieRoot() + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.RandaoMixes, params.BeaconConfig().EpochsPerHistoricalVector) + if err != nil { + return [32]byte{}, err } - return b.recomputeFieldTrie(randaoMixes, b.state.RandaoMixes) + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() } - return stateutil.RootsArrayHashTreeRoot(b.state.RandaoMixes, params.BeaconConfig().EpochsPerHistoricalVector, "RandaoMixes") + return b.recomputeFieldTrie(randaoMixes, b.state.RandaoMixes) case slashings: return htrutils.SlashingsRoot(b.state.Slashings) case previousEpochAttestations: - if featureconfig.Get().EnableFieldTrie { - if b.rebuildTrie[field] { - err := b.resetFieldTrie(field, b.state.PreviousEpochAttestations, params.BeaconConfig().MaxAttestations*params.BeaconConfig().SlotsPerEpoch) - if err != nil { - return [32]byte{}, err - } - b.dirtyIndices[field] = []uint64{} - delete(b.rebuildTrie, field) - return b.stateFieldLeaves[field].TrieRoot() + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.PreviousEpochAttestations, params.BeaconConfig().MaxAttestations*params.BeaconConfig().SlotsPerEpoch) + if err != nil { + return [32]byte{}, err } - return b.recomputeFieldTrie(field, b.state.PreviousEpochAttestations) + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() } - return stateutil.EpochAttestationsRoot(b.state.PreviousEpochAttestations) + return b.recomputeFieldTrie(field, b.state.PreviousEpochAttestations) case currentEpochAttestations: - if featureconfig.Get().EnableFieldTrie { - if b.rebuildTrie[field] { - err := b.resetFieldTrie(field, b.state.CurrentEpochAttestations, params.BeaconConfig().MaxAttestations*params.BeaconConfig().SlotsPerEpoch) - if err != nil { - return [32]byte{}, err - } - b.dirtyIndices[field] = []uint64{} - delete(b.rebuildTrie, field) - return b.stateFieldLeaves[field].TrieRoot() + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.CurrentEpochAttestations, params.BeaconConfig().MaxAttestations*params.BeaconConfig().SlotsPerEpoch) + if err != nil { + return [32]byte{}, err } - return b.recomputeFieldTrie(field, b.state.CurrentEpochAttestations) + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() } - return stateutil.EpochAttestationsRoot(b.state.CurrentEpochAttestations) + return b.recomputeFieldTrie(field, b.state.CurrentEpochAttestations) case justificationBits: return bytesutil.ToBytes32(b.state.JustificationBits), nil case previousJustifiedCheckpoint: diff --git a/beacon-chain/state/state_trie_test.go b/beacon-chain/state/state_trie_test.go index 01e215a0a2..c80e6691e2 100644 --- a/beacon-chain/state/state_trie_test.go +++ b/beacon-chain/state/state_trie_test.go @@ -8,7 +8,6 @@ import ( "github.com/prysmaticlabs/go-ssz" "github.com/prysmaticlabs/prysm/beacon-chain/state" pbp2p "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" - "github.com/prysmaticlabs/prysm/shared/featureconfig" "github.com/prysmaticlabs/prysm/shared/params" "github.com/prysmaticlabs/prysm/shared/testutil" ) @@ -178,10 +177,7 @@ func TestBeaconState_HashTreeRoot(t *testing.T) { } } -func TestBeaconState_HashTreeRoot_EnableFieldTrie(t *testing.T) { - resetCfg := featureconfig.InitWithReset(&featureconfig.Flags{EnableFieldTrie: true}) - defer resetCfg() - +func TestBeaconState_HashTreeRoot_FieldTrie(t *testing.T) { testState, _ := testutil.DeterministicGenesisState(t, 64) type test struct { diff --git a/shared/featureconfig/config.go b/shared/featureconfig/config.go index 46e7e914f9..f833711384 100644 --- a/shared/featureconfig/config.go +++ b/shared/featureconfig/config.go @@ -54,7 +54,6 @@ type Flags struct { EnableNoise bool // EnableNoise enables the beacon node to use NOISE instead of SECIO when performing a handshake with another peer. DontPruneStateStartUp bool // DontPruneStateStartUp disables pruning state upon beacon node start up. NewStateMgmt bool // NewStateMgmt enables the new state mgmt service. - EnableFieldTrie bool // EnableFieldTrie enables the state from using field specific tries when computing the root. NoInitSyncBatchSaveBlocks bool // NoInitSyncBatchSaveBlocks disables batch save blocks mode during initial syncing. EnableStateRefCopy bool // EnableStateRefCopy copies the references to objects instead of the objects themselves when copying state fields. WaitForSynced bool // WaitForSynced uses WaitForSynced in validator startup to ensure it can communicate with the beacon node as soon as possible. @@ -196,11 +195,6 @@ func ConfigureBeaconChain(ctx *cli.Context) { log.Warn("Disabling new state management service") cfg.NewStateMgmt = false } - cfg.EnableFieldTrie = true - if ctx.Bool(disableFieldTrie.Name) { - log.Warn("Disabling state field trie") - cfg.EnableFieldTrie = false - } if ctx.Bool(disableInitSyncBatchSaveBlocks.Name) { log.Warn("Disabling init sync batch save blocks mode") cfg.NoInitSyncBatchSaveBlocks = true diff --git a/shared/featureconfig/flags.go b/shared/featureconfig/flags.go index 2616b518d3..a1a0e6f649 100644 --- a/shared/featureconfig/flags.go +++ b/shared/featureconfig/flags.go @@ -124,11 +124,6 @@ var ( Name: "disable-new-state-mgmt", Usage: "This disables the usage of state mgmt service across Prysm", } - disableFieldTrie = &cli.BoolFlag{ - Name: "disable-state-field-trie", - Usage: "Disables the usage of state field tries to compute the state root", - } - disableInitSyncBatchSaveBlocks = &cli.BoolFlag{ Name: "disable-init-sync-batch-save-blocks", Usage: "Instead of saving batch blocks to the DB during initial syncing, this disables batch saving of blocks", @@ -430,6 +425,11 @@ var ( Usage: deprecatedUsage, Hidden: true, } + deprecatedDisableFieldTrie = &cli.BoolFlag{ + Name: "disable-state-field-trie", + Usage: deprecatedUsage, + Hidden: true, + } ) var deprecatedFlags = []cli.Flag{ @@ -482,6 +482,7 @@ var deprecatedFlags = []cli.Flag{ deprecatedSchlesiTestnetFlag, deprecateReduceAttesterStateCopies, deprecatedEnableInitSyncWeightedRoundRobin, + deprecatedDisableFieldTrie, } // ValidatorFlags contains a list of all the feature flags that apply to the validator client. @@ -538,7 +539,6 @@ var BeaconChainFlags = append(deprecatedFlags, []cli.Flag{ waitForSyncedFlag, skipRegenHistoricalStates, disableInitSyncWeightedRoundRobin, - disableFieldTrie, disableStateRefCopy, disableNewStateMgmt, enableKadDht,