diff --git a/dot/state/storage.go b/dot/state/storage.go index b2ba64870e..360b0e86eb 100644 --- a/dot/state/storage.go +++ b/dot/state/storage.go @@ -85,12 +85,11 @@ func (s *StorageState) StoreTrie(ts *rtstorage.TrieState, header *types.Header) } if header != nil { - insertedMerkleValues, err := ts.GetInsertedMerkleValues() + insertedMerkleValues, deletedMerkleValues, err := ts.GetChangedNodeHashes() if err != nil { return fmt.Errorf("failed to get state trie inserted keys: block %s %w", header.Hash(), err) } - deletedMerkleValues := ts.GetDeletedMerkleValues() err = s.pruner.StoreJournalRecord(deletedMerkleValues, insertedMerkleValues, header.Hash(), int64(header.Number)) if err != nil { return err diff --git a/lib/runtime/storage/trie.go b/lib/runtime/storage/trie.go index e7dc4ca72c..e35579603c 100644 --- a/lib/runtime/storage/trie.go +++ b/lib/runtime/storage/trie.go @@ -271,18 +271,10 @@ func (s *TrieState) LoadCodeHash() (common.Hash, error) { return common.Blake2bHash(code) } -// GetInsertedMerkleValues returns the set of all node Merkle value inserted -// into the state trie since the last block produced. -func (s *TrieState) GetInsertedMerkleValues() (merkleValues map[string]struct{}, err error) { +// GetChangedNodeHashes returns the two sets of hashes for all nodes +// inserted and deleted in the state trie since the last block produced (trie snapshot). +func (s *TrieState) GetChangedNodeHashes() (inserted, deleted map[string]struct{}, err error) { s.lock.RLock() defer s.lock.RUnlock() - return s.t.GetInsertedMerkleValues() -} - -// GetDeletedMerkleValues returns the set of all node Merkle values deleted -// from the state trie since the last block produced. -func (s *TrieState) GetDeletedMerkleValues() (merkleValues map[string]struct{}) { - s.lock.RLock() - defer s.lock.RUnlock() - return s.t.GetDeletedMerkleValues() + return s.t.GetChangedNodeHashes() } diff --git a/lib/trie/database.go b/lib/trie/database.go index 6035e0c852..2a0682bba1 100644 --- a/lib/trie/database.go +++ b/lib/trie/database.go @@ -363,15 +363,22 @@ func (t *Trie) writeDirtyNode(db chaindb.Batch, n *Node) (err error) { return nil } -// GetInsertedMerkleValues returns the set of node Merkle values -// for each node that was inserted in the state trie since the last snapshot. -func (t *Trie) GetInsertedMerkleValues() (merkleValues map[string]struct{}, err error) { - merkleValues = make(map[string]struct{}) - err = t.getInsertedNodeHashesAtNode(t.root, merkleValues) +// GetChangedNodeHashes returns the two sets of hashes for all nodes +// inserted and deleted in the state trie since the last snapshot. +// Returned maps are safe for mutation. +func (t *Trie) GetChangedNodeHashes() (inserted, deleted map[string]struct{}, err error) { + inserted = make(map[string]struct{}) + err = t.getInsertedNodeHashesAtNode(t.root, inserted) if err != nil { - return nil, err + return nil, nil, err } - return merkleValues, nil + + deleted = make(map[string]struct{}, len(t.deletedMerkleValues)) + for k := range t.deletedMerkleValues { + deleted[k] = struct{}{} + } + + return inserted, deleted, nil } func (t *Trie) getInsertedNodeHashesAtNode(n *Node, merkleValues map[string]struct{}) (err error) { @@ -411,14 +418,3 @@ func (t *Trie) getInsertedNodeHashesAtNode(n *Node, merkleValues map[string]stru return nil } - -// GetDeletedMerkleValues returns a set of all the node Merkle values for each -// node that was deleted from the trie since the last snapshot was made. -// The returned set is a copy of the internal set to prevent data corruption. -func (t *Trie) GetDeletedMerkleValues() (merkleValues map[string]struct{}) { - merkleValues = make(map[string]struct{}, len(t.deletedMerkleValues)) - for k := range t.deletedMerkleValues { - merkleValues[k] = struct{}{} - } - return merkleValues -}