stateroot: add and use DataMPTAux for auxiliary data

Use DataMPT for nodes only, otherwise with 1M blocks with have 1M
height-stateroot mapping entries that our GC has to iterate over for no
reason.
This commit is contained in:
Roman Khimov 2022-02-12 22:48:16 +03:00
parent ad606101c7
commit ccdda21718
4 changed files with 14 additions and 20 deletions

View file

@ -44,7 +44,7 @@ import (
// Tuning parameters. // Tuning parameters.
const ( const (
headerBatchCount = 2000 headerBatchCount = 2000
version = "0.2.2" version = "0.2.3"
defaultInitialGAS = 52000000_00000000 defaultInitialGAS = 52000000_00000000
defaultGCPeriod = 10000 defaultGCPeriod = 10000

View file

@ -118,7 +118,7 @@ func (s *Module) CurrentValidatedHeight() uint32 {
// Init initializes state root module at the given height. // Init initializes state root module at the given height.
func (s *Module) Init(height uint32) error { func (s *Module) Init(height uint32) error {
data, err := s.Store.Get([]byte{byte(storage.DataMPT), prefixValidated}) data, err := s.Store.Get([]byte{byte(storage.DataMPTAux), prefixValidated})
if err == nil { if err == nil {
s.validatedHeight.Store(binary.LittleEndian.Uint32(data)) s.validatedHeight.Store(binary.LittleEndian.Uint32(data))
} }
@ -156,16 +156,6 @@ func (s *Module) CleanStorage() error {
if err != nil { if err != nil {
return fmt.Errorf("failed to remove outdated MPT-reated items: %w", err) return fmt.Errorf("failed to remove outdated MPT-reated items: %w", err)
} }
currentLocal := s.currentLocal.Load().(util.Uint256)
if !currentLocal.Equals(util.Uint256{}) {
err := s.addLocalStateRoot(s.Store, &state.MPTRoot{
Index: s.localHeight.Load(),
Root: currentLocal,
})
if err != nil {
return fmt.Errorf("failed to store current local stateroot: %w", err)
}
}
return nil return nil
} }
@ -177,7 +167,7 @@ func (s *Module) JumpToState(sr *state.MPTRoot) error {
data := make([]byte, 4) data := make([]byte, 4)
binary.LittleEndian.PutUint32(data, sr.Index) binary.LittleEndian.PutUint32(data, sr.Index)
if err := s.Store.Put([]byte{byte(storage.DataMPT), prefixValidated}, data); err != nil { if err := s.Store.Put([]byte{byte(storage.DataMPTAux), prefixValidated}, data); err != nil {
return fmt.Errorf("failed to store validated height: %w", err) return fmt.Errorf("failed to store validated height: %w", err)
} }
s.validatedHeight.Store(sr.Index) s.validatedHeight.Store(sr.Index)

View file

@ -29,7 +29,7 @@ func (s *Module) addLocalStateRoot(store *storage.MemCachedStore, sr *state.MPTR
data := make([]byte, 4) data := make([]byte, 4)
binary.LittleEndian.PutUint32(data, sr.Index) binary.LittleEndian.PutUint32(data, sr.Index)
return store.Put([]byte{byte(storage.DataMPT), prefixLocal}, data) return store.Put([]byte{byte(storage.DataMPTAux), prefixLocal}, data)
} }
func putStateRoot(store *storage.MemCachedStore, key []byte, sr *state.MPTRoot) error { func putStateRoot(store *storage.MemCachedStore, key []byte, sr *state.MPTRoot) error {
@ -52,7 +52,7 @@ func (s *Module) getStateRoot(key []byte) (*state.MPTRoot, error) {
func makeStateRootKey(index uint32) []byte { func makeStateRootKey(index uint32) []byte {
key := make([]byte, 5) key := make([]byte, 5)
key[0] = byte(storage.DataMPT) key[0] = byte(storage.DataMPTAux)
binary.BigEndian.PutUint32(key, index) binary.BigEndian.PutUint32(key, index)
return key return key
} }
@ -79,7 +79,7 @@ func (s *Module) AddStateRoot(sr *state.MPTRoot) error {
data := make([]byte, 4) data := make([]byte, 4)
binary.LittleEndian.PutUint32(data, sr.Index) binary.LittleEndian.PutUint32(data, sr.Index)
if err := s.Store.Put([]byte{byte(storage.DataMPT), prefixValidated}, data); err != nil { if err := s.Store.Put([]byte{byte(storage.DataMPTAux), prefixValidated}, data); err != nil {
return err return err
} }
s.validatedHeight.Store(sr.Index) s.validatedHeight.Store(sr.Index)

View file

@ -11,10 +11,14 @@ import (
// KeyPrefix constants. // KeyPrefix constants.
const ( const (
DataExecutable KeyPrefix = 0x01 DataExecutable KeyPrefix = 0x01
DataMPT KeyPrefix = 0x03 // DataMPT is used for MPT node entries identified by Uint256.
STAccount KeyPrefix = 0x40 DataMPT KeyPrefix = 0x03
STContractID KeyPrefix = 0x51 // DataMPTAux is used to store additional MPT data like height-root
STStorage KeyPrefix = 0x70 // mappings and local/validated heights.
DataMPTAux KeyPrefix = 0x04
STAccount KeyPrefix = 0x40
STContractID KeyPrefix = 0x51
STStorage KeyPrefix = 0x70
// STTempStorage is used to store contract storage items during state sync process // STTempStorage is used to store contract storage items during state sync process
// in order not to mess up the previous state which has its own items stored by // in order not to mess up the previous state which has its own items stored by
// STStorage prefix. Once state exchange process is completed, all items with // STStorage prefix. Once state exchange process is completed, all items with