state

package
v1.10.59 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 23, 2024 License: GPL-3.0, GPL-3.0 Imports: 27 Imported by: 0

Documentation

Overview

Copyright 2021 The go-ethereum Authors This file is part of The go-ethereum library.

The go-ethereum library is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

The go-ethereum library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with The go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

Package state provides a caching layer atop the Cortex state trie.

Index

Constants

View Source
const TriesInMemory = 128

TriesInMemory represents the number of layers that are kept in RAM.

Variables

This section is empty.

Functions

func NewStateSync

func NewStateSync(root common.Hash, database ctxcdb.KeyValueReader, bloom *trie.SyncBloom) *trie.Sync

NewStateSync create a new state trie download scheduler.

Types

type Database

type Database interface {
	// OpenTrie opens the main account trie.
	OpenTrie(root common.Hash) (Trie, error)

	// OpenStorageTrie opens the storage trie of an account.
	OpenStorageTrie(stateRoot common.Hash, address common.Address, root common.Hash, trie Trie) (Trie, error)

	// CopyTrie returns an independent copy of the given trie.
	CopyTrie(Trie) Trie

	// ContractCode retrieves a particular contract's code.
	ContractCode(addr common.Address, codeHash common.Hash) ([]byte, error)

	// ContractCodeSize retrieves a particular contracts code's size.
	ContractCodeSize(addr common.Address, codeHash common.Hash) (int, error)

	// DiskDB returns the underlying key-value disk database.
	DiskDB() ctxcdb.KeyValueStore

	// TrieDB retrieves the low level trie database used for data storage.
	TrieDB() *trie.Database
}

Database wraps access to tries and contract code.

func NewDatabase

func NewDatabase(db ctxcdb.Database) Database

NewDatabase creates a backing store for state. The returned database is safe for concurrent use, but does not retain any recent trie nodes in memory. To keep some historical state in memory, use the NewDatabaseWithCache constructor.

func NewDatabaseWithConfig added in v1.10.13

func NewDatabaseWithConfig(db ctxcdb.Database, config *trie.Config) Database

NewDatabaseWithCache creates a backing store for state. The returned database is safe for concurrent use and retains a lot of collapsed RLP trie nodes in a large memory cache.

type Dump

type Dump struct {
	Root     string                         `json:"root"`
	Accounts map[common.Address]DumpAccount `json:"accounts"`
}

Dump represents the full dump in a collected format, as one large map.

type DumpAccount

type DumpAccount struct {
	Balance   string                 `json:"balance"`
	Nonce     uint64                 `json:"nonce"`
	Root      string                 `json:"root"`
	CodeHash  string                 `json:"codeHash"`
	Code      string                 `json:"code,omitempty"`
	Storage   map[common.Hash]string `json:"storage,omitempty"`
	Address   *common.Address        `json:"address,omitempty"` // Address only present in iterative (line-by-line) mode
	SecureKey hexutil.Bytes          `json:"key,omitempty"`     // If we don't have address, we can output the key

}

DumpAccount represents an account in the state.

type IteratorDump added in v1.9.55

type IteratorDump struct {
	Root     string                         `json:"root"`
	Accounts map[common.Address]DumpAccount `json:"accounts"`
	Next     []byte                         `json:"next,omitempty"` // nil if no more accounts
}

IteratorDump is an implementation for iterating over data.

type NodeIterator

type NodeIterator struct {
	Hash   common.Hash // Hash of the current entry being iterated (nil if not standalone)
	Parent common.Hash // Hash of the first full ancestor node (nil if current is the root)

	Error error // Failure set in case of an internal error in the iterator
	// contains filtered or unexported fields
}

NodeIterator is an iterator to traverse the entire state trie post-order, including all of the contract code and contract state tries.

func NewNodeIterator

func NewNodeIterator(state *StateDB) *NodeIterator

NewNodeIterator creates an post-order state node iterator.

func (*NodeIterator) Next

func (it *NodeIterator) Next() bool

Next moves the iterator to the next node, returning whether there are any further nodes. In case of an internal error this method returns false and sets the Error field to the encountered failure.

type StateDB

type StateDB struct {
	AccountReads         time.Duration
	AccountHashes        time.Duration
	AccountUpdates       time.Duration
	AccountCommits       time.Duration
	StorageReads         time.Duration
	StorageHashes        time.Duration
	StorageUpdates       time.Duration
	StorageCommits       time.Duration
	SnapshotAccountReads time.Duration
	SnapshotStorageReads time.Duration
	SnapshotCommits      time.Duration
	TrieDBCommits        time.Duration

	AccountUpdated int
	StorageUpdated atomic.Int64
	AccountDeleted int
	StorageDeleted atomic.Int64
	// contains filtered or unexported fields
}

StateDB structs within the ethereum protocol are used to store anything within the merkle trie. StateDBs take care of caching and storing nested states. It's the general query interface to retrieve: * Contracts * Accounts

func New

func New(root common.Hash, db Database, snaps *snapshot.Tree) (*StateDB, error)

Create a new state from a given trie.

func (*StateDB) AddAddressToAccessList added in v1.10.18

func (s *StateDB) AddAddressToAccessList(addr common.Address)

AddAddressToAccessList adds the given address to the access list

func (*StateDB) AddBalance

func (s *StateDB) AddBalance(addr common.Address, amount *big.Int)

AddBalance adds amount to the account associated with addr.

func (*StateDB) AddLog

func (s *StateDB) AddLog(log *types.Log)

func (*StateDB) AddPreimage

func (s *StateDB) AddPreimage(hash common.Hash, preimage []byte)

AddPreimage records a SHA3 preimage seen by the VM.

func (*StateDB) AddRefund

func (s *StateDB) AddRefund(gas uint64)

AddRefund adds gas to the refund counter

func (*StateDB) AddSlotToAccessList added in v1.10.18

func (s *StateDB) AddSlotToAccessList(addr common.Address, slot common.Hash)

AddSlotToAccessList adds the given (address, slot)-tuple to the access list

func (*StateDB) AddressInAccessList added in v1.10.18

func (s *StateDB) AddressInAccessList(addr common.Address) bool

AddressInAccessList returns true if the given address is in the access list.

func (*StateDB) Commit

func (s *StateDB) Commit(block uint64, deleteEmptyObjects bool) (common.Hash, error)

Commit writes the state to the underlying in-memory trie database.

func (*StateDB) Copy

func (s *StateDB) Copy() *StateDB

Copy creates a deep, independent copy of the state. Snapshots of the copied state cannot be applied to the copy.

func (*StateDB) CreateAccount

func (s *StateDB) CreateAccount(addr common.Address)

CreateAccount explicitly creates a new state object, assuming that the account did not previously exist in the state. If the account already exists, this function will silently overwrite it which might lead to a consensus bug eventually.

func (*StateDB) CreateContract added in v1.10.56

func (s *StateDB) CreateContract(addr common.Address)

CreateContract is used whenever a contract is created. This may be preceded by CreateAccount, but that is not required if it already existed in the state due to funds sent beforehand. This operation sets the 'newContract'-flag, which is required in order to correctly handle EIP-6780 'delete-in-same-transaction' logic.

func (*StateDB) Database

func (s *StateDB) Database() Database

Database retrieves the low level database supporting the lower level trie ops.

func (*StateDB) Dump

func (s *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages bool) []byte

Dump returns a JSON string representing the entire state as a single json-object

func (*StateDB) Empty

func (s *StateDB) Empty(addr common.Address) bool

Empty returns whether the state object is either non-existent or empty according to the EIP161 specification (balance = nonce = code = 0)

func (*StateDB) Error

func (s *StateDB) Error() error

func (*StateDB) Exist

func (s *StateDB) Exist(addr common.Address) bool

Exist reports whether the given account address exists in the state. Notably this also returns true for self-destructed accounts.

func (*StateDB) Finalise

func (s *StateDB) Finalise(deleteEmptyObjects bool)

Finalise finalises the state by removing the s destructed objects and clears the journal as well as the refunds. Finalise, however, will not push any updates into the tries just yet. Only IntermediateRoot or Commit will do that.

func (*StateDB) ForEachStorage

func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) error

func (*StateDB) GetBalance

func (s *StateDB) GetBalance(addr common.Address) *big.Int

Retrieve the balance from the given address or 0 if object not found

func (*StateDB) GetCode

func (s *StateDB) GetCode(addr common.Address) []byte

func (*StateDB) GetCodeHash

func (s *StateDB) GetCodeHash(addr common.Address) common.Hash

func (*StateDB) GetCodeSize

func (s *StateDB) GetCodeSize(addr common.Address) int

func (*StateDB) GetCommittedState added in v1.0.0

func (s *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash

GetCommittedState retrieves a value from the given account's committed storage trie.

func (*StateDB) GetLogs

func (s *StateDB) GetLogs(hash common.Hash, blockNumber uint64, blockHash common.Hash) []*types.Log

func (*StateDB) GetNonce

func (s *StateDB) GetNonce(addr common.Address) uint64

func (*StateDB) GetNum

func (s *StateDB) GetNum(addr common.Address) *big.Int

func (*StateDB) GetProof added in v1.0.0

func (s *StateDB) GetProof(addr common.Address) ([][]byte, error)

GetProof returns the MerkleProof for a given Account

func (*StateDB) GetProofByHash added in v1.10.14

func (s *StateDB) GetProofByHash(addrHash common.Hash) ([][]byte, error)

GetProofByHash returns the Merkle proof for a given account.

func (*StateDB) GetRefund

func (s *StateDB) GetRefund() uint64

GetRefund returns the current value of the refund counter.

func (*StateDB) GetSolidityBytes

func (s *StateDB) GetSolidityBytes(addr common.Address, slot common.Hash) ([]byte, error)

GetState returns a value in account storage.

func (*StateDB) GetState

func (s *StateDB) GetState(addr common.Address, bhash common.Hash) common.Hash

GetState retrieves a value from the given account's storage trie

func (*StateDB) GetStorageProof added in v1.0.0

func (s *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byte, error)

GetProof returns the StorageProof for given key

func (*StateDB) GetStorageProofByHash added in v1.10.14

func (s *StateDB) GetStorageProofByHash(a common.Address, key common.Hash) ([][]byte, error)

GetStorageProofByHash returns the Merkle proof for given storage slot.

func (*StateDB) GetStorageRoot added in v1.10.48

func (s *StateDB) GetStorageRoot(addr common.Address) common.Hash

GetStorageRoot retrieves the storage root from the given address or empty if object not found.

func (*StateDB) GetTransientState added in v1.10.47

func (s *StateDB) GetTransientState(addr common.Address, key common.Hash) common.Hash

GetTransientState gets transient storage for a given account.

func (*StateDB) GetUpload

func (s *StateDB) GetUpload(addr common.Address) *big.Int

func (*StateDB) HasSelfDestructed added in v1.10.47

func (s *StateDB) HasSelfDestructed(addr common.Address) bool

func (*StateDB) IntermediateRoot

func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash

IntermediateRoot computes the current root hash of the state trie. It is called in between transactions to get the root hash that goes into transaction receipts.

func (*StateDB) IterativeDump added in v1.9.55

func (s *StateDB) IterativeDump(excludeCode, excludeStorage, excludeMissingPreimages bool, output *json.Encoder)

IterativeDump dumps out accounts as json-objects, delimited by linebreaks on stdout

func (*StateDB) IteratorDump added in v1.9.55

func (s *StateDB) IteratorDump(excludeCode, excludeStorage, excludeMissingPreimages bool, start []byte, maxResults int) IteratorDump

IteratorDump dumps out a batch of accounts starts with the given start key

func (*StateDB) Logs

func (s *StateDB) Logs() []*types.Log

func (*StateDB) Preimages

func (s *StateDB) Preimages() map[common.Hash][]byte

Preimages returns a list of SHA3 preimages that have been submitted.

func (*StateDB) RawDump

func (s *StateDB) RawDump(excludeCode, excludeStorage, excludeMissingPreimages bool) Dump

RawDump returns the entire state an a single large object

func (*StateDB) RevertToSnapshot

func (s *StateDB) RevertToSnapshot(revid int)

RevertToSnapshot reverts all state changes made since the given revision.

func (*StateDB) SelfDestruct added in v1.10.47

func (s *StateDB) SelfDestruct(addr common.Address)

SelfDestruct marks the given account as selfdestructed. This clears the account balance.

The account's state object is still available until the state is committed, getStateObject will return a non-nil account after SelfDestruct.

func (*StateDB) Selfdestruct6780 added in v1.10.47

func (s *StateDB) Selfdestruct6780(addr common.Address)

func (*StateDB) SetBalance

func (s *StateDB) SetBalance(addr common.Address, amount *big.Int)

func (*StateDB) SetCode

func (s *StateDB) SetCode(addr common.Address, code []byte)

func (*StateDB) SetNonce

func (s *StateDB) SetNonce(addr common.Address, nonce uint64)

func (*StateDB) SetNum

func (s *StateDB) SetNum(addr common.Address, num *big.Int)

func (*StateDB) SetState

func (s *StateDB) SetState(addr common.Address, key, value common.Hash)

func (*StateDB) SetStorage added in v1.10.34

func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash)

SetStorage replaces the entire storage for the specified account with given storage. This function should only be used for debugging.

func (*StateDB) SetTransientState added in v1.10.47

func (s *StateDB) SetTransientState(addr common.Address, key, value common.Hash)

SetTransientState sets transient storage for a given account. It adds the change to the journal so that it can be rolled back to its previous value if there is a revert.

func (*StateDB) SetTxContext added in v1.10.39

func (s *StateDB) SetTxContext(thash common.Hash, ti int)

Prepare sets the current transaction hash and index and block hash which is used when the CVM emits new state logs.

func (*StateDB) SetUpload

func (s *StateDB) SetUpload(addr common.Address, amount *big.Int)

func (*StateDB) SlotInAccessList added in v1.10.18

func (s *StateDB) SlotInAccessList(addr common.Address, slot common.Hash) (addressPresent bool, slotPresent bool)

SlotInAccessList returns true if the given (address, slot)-tuple is in the access list.

func (*StateDB) Snapshot

func (s *StateDB) Snapshot() int

Snapshot returns an identifier for the current revision of the state.

func (*StateDB) StartPrefetcher added in v1.10.18

func (s *StateDB) StartPrefetcher(namespace string, noreads bool)

StartPrefetcher initializes a new trie prefetcher to pull in nodes from the state trie concurrently while the state is mutated so that when we reach the commit phase, most of the needed data is already hot.

func (*StateDB) StopPrefetcher added in v1.10.18

func (s *StateDB) StopPrefetcher()

StopPrefetcher terminates a running prefetcher and reports any leftover stats from the gathered metrics.

func (*StateDB) StorageTrie

func (s *StateDB) StorageTrie(addr common.Address) Trie

StorageTrie returns the storage trie of an account. The return value is a copy and is nil for non-existent accounts.

func (*StateDB) SubBalance

func (s *StateDB) SubBalance(addr common.Address, amount *big.Int)

SubBalance subtracts amount from the account associated with addr.

func (*StateDB) SubRefund added in v1.0.0

func (s *StateDB) SubRefund(gas uint64)

SubRefund removes gas from the refund counter. This method will panic if the refund counter goes below zero

func (*StateDB) SubUpload

func (s *StateDB) SubUpload(addr common.Address, amount *big.Int) *big.Int

func (*StateDB) TxIndex added in v1.9.53

func (s *StateDB) TxIndex() int

TxIndex returns the current transaction index set by SetTxContext.

func (*StateDB) Upload added in v1.0.0

func (s *StateDB) Upload(addr common.Address) *big.Int

func (*StateDB) Uploading

func (s *StateDB) Uploading(addr common.Address) bool

type Storage

type Storage map[common.Hash]common.Hash

func (Storage) Copy

func (s Storage) Copy() Storage

type Trie

type Trie interface {
	// GetKey returns the sha3 preimage of a hashed key that was previously used
	// to store a value.
	//
	// TODO(fjl): remove this when StateTrie is removed
	GetKey([]byte) []byte

	// TryGet returns the value for key stored in the trie. The value bytes must
	// not be modified by the caller. If a node was not found in the database, a
	// trie.MissingNodeError is returned.
	TryGet(key []byte) ([]byte, error)

	// GetAccount abstracts an account read from the trie. It retrieves the
	// account blob from the trie with provided account address and decodes it
	// with associated decoding algorithm. If the specified account is not in
	// the trie, nil will be returned. If the trie is corrupted(e.g. some nodes
	// are missing or the account blob is incorrect for decoding), an error will
	// be returned.
	GetAccount(address common.Address) (*types.StateAccount, error)

	// GetStorage returns the value for key stored in the trie. The value bytes
	// must not be modified by the caller. If a node was not found in the database,
	// a trie.MissingNodeError is returned.
	GetStorage(addr common.Address, key []byte) ([]byte, error)

	// TryUpdateAccount abstract an account write in the trie.
	TryUpdateAccount(key []byte, account *types.StateAccount) error

	// UpdateContractCode abstracts code write to the trie. It is expected
	// to be moved to the stateWriter interface when the latter is ready.
	UpdateContractCode(address common.Address, codeHash common.Hash, code []byte) error

	// TryUpdate associates key with value in the trie. If value has length zero, any
	// existing value is deleted from the trie. The value bytes must not be modified
	// by the caller while they are stored in the trie. If a node was not found in the
	// database, a trie.MissingNodeError is returned.
	TryUpdate(key, value []byte) error

	// TryDelete removes any existing value for key from the trie. If a node was not
	// found in the database, a trie.MissingNodeError is returned.
	TryDelete(key []byte) error

	// TryDeleteAccount abstracts an account deletion from the trie.
	TryDeleteAccount(key []byte) error

	// Hash returns the root hash of the trie. It does not write to the database and
	// can be used even if the trie doesn't have one.
	Hash() common.Hash

	// Commit writes all nodes to the trie's memory database, tracking the internal
	// and external (for account tries) references.
	Commit(onleaf trie.LeafCallback) (common.Hash, error)

	// NodeIterator returns an iterator that returns nodes of the trie. Iteration
	// starts at the key after the given start key.
	NodeIterator(startKey []byte) trie.NodeIterator

	// Prove constructs a Merkle proof for key. The result contains all encoded nodes
	// on the path to the value at key. The value itself is also included in the last
	// node and can be retrieved by verifying the proof.
	//
	// If the trie does not contain a value for key, the returned proof contains all
	// nodes of the longest existing prefix of the key (at least the root), ending
	// with the node that proves the absence of the key.
	Prove(key []byte, fromLevel uint, proofDb ctxcdb.KeyValueWriter) error
}

Trie is a Merkle Patricia trie.

Directories

Path Synopsis
Package snapshot implements a journaled, dynamic state dump.
Package snapshot implements a journaled, dynamic state dump.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL