mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2025-01-06 11:02:18 +00:00
111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
|
package state
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/binary"
|
||
|
|
||
|
"github.com/VictoriaMetrics/fastcache"
|
||
|
"github.com/holiman/uint256"
|
||
|
|
||
|
"github.com/ledgerwatch/turbo-geth/common"
|
||
|
"github.com/ledgerwatch/turbo-geth/common/dbutils"
|
||
|
"github.com/ledgerwatch/turbo-geth/core/types/accounts"
|
||
|
)
|
||
|
|
||
|
var _ WriterWithChangeSets = (*CacheStateWriter)(nil)
|
||
|
|
||
|
type CacheStateWriter struct {
|
||
|
accountCache *fastcache.Cache
|
||
|
storageCache *fastcache.Cache
|
||
|
codeCache *fastcache.Cache
|
||
|
codeSizeCache *fastcache.Cache
|
||
|
}
|
||
|
|
||
|
func NewCacheStateWriter() *CacheStateWriter {
|
||
|
return &CacheStateWriter{}
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) SetAccountCache(accountCache *fastcache.Cache) {
|
||
|
w.accountCache = accountCache
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) SetStorageCache(storageCache *fastcache.Cache) {
|
||
|
w.storageCache = storageCache
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) SetCodeCache(codeCache *fastcache.Cache) {
|
||
|
w.codeCache = codeCache
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) SetCodeSizeCache(codeSizeCache *fastcache.Cache) {
|
||
|
w.codeSizeCache = codeSizeCache
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) UpdateAccountData(ctx context.Context, address common.Address, original, account *accounts.Account) error {
|
||
|
value := make([]byte, account.EncodingLengthForStorage())
|
||
|
account.EncodeForStorage(value)
|
||
|
if w.accountCache != nil {
|
||
|
w.accountCache.Set(address[:], value)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) UpdateAccountCode(address common.Address, incarnation uint64, codeHash common.Hash, code []byte) error {
|
||
|
if w.codeCache != nil {
|
||
|
if len(code) <= 1024 {
|
||
|
w.codeCache.Set(address[:], code)
|
||
|
} else {
|
||
|
w.codeCache.Del(address[:])
|
||
|
}
|
||
|
}
|
||
|
if w.codeSizeCache != nil {
|
||
|
var b [4]byte
|
||
|
binary.BigEndian.PutUint32(b[:], uint32(len(code)))
|
||
|
w.codeSizeCache.Set(address[:], b[:])
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) DeleteAccount(ctx context.Context, address common.Address, original *accounts.Account) error {
|
||
|
if w.accountCache != nil {
|
||
|
w.accountCache.Set(address[:], nil)
|
||
|
}
|
||
|
if w.codeCache != nil {
|
||
|
w.codeCache.Set(address[:], nil)
|
||
|
}
|
||
|
if w.codeSizeCache != nil {
|
||
|
var b [4]byte
|
||
|
binary.BigEndian.PutUint32(b[:], 0)
|
||
|
w.codeSizeCache.Set(address[:], b[:])
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) WriteAccountStorage(ctx context.Context, address common.Address, incarnation uint64, key *common.Hash, original, value *uint256.Int) error {
|
||
|
if *original == *value {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
if w.storageCache != nil {
|
||
|
compositeKey := dbutils.PlainGenerateCompositeStorageKey(address, incarnation, *key)
|
||
|
w.storageCache.Set(compositeKey, value.Bytes())
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) CreateContract(address common.Address) error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) WriteChangeSets() error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) WriteHistory() error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (w *CacheStateWriter) ChangeSetWriter() *ChangeSetWriter {
|
||
|
return nil
|
||
|
}
|