state

package
v1.3.0 Latest Latest
Warning

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

Go to latest
Published: Feb 5, 2020 License: MIT Imports: 19 Imported by: 1

Documentation

Overview

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

Index

Constants

This section is empty.

Variables

View Source
var MaxTrieCacheGen = uint16(120)

MaxTrieCacheGen limit after which to evict trie nodes from memory.

Functions

This section is empty.

Types

type Account

type Account struct {
	Nonce    uint64
	Balance  *big.Int
	Root     common.Hash // merkle root of the storage trie
	CodeHash []byte
}

Account is the Ethereum consensus representation of accounts. These objects are stored in the main account trie.

type Code

type Code []byte

Code ...

func (Code) String

func (code Code) String() string

type DB

type DB struct {
	// contains filtered or unexported fields
}

DB 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) (*DB, error)

New creates a new state from a given trie.

func (*DB) AddBalance

func (db *DB) AddBalance(addr common.Address, amount *big.Int)

AddBalance adds amount to the account associated with addr.

func (*DB) AddLog

func (db *DB) AddLog(log *types.Log)

AddLog ...

func (*DB) AddPreimage

func (db *DB) AddPreimage(hash common.Hash, preimage []byte)

AddPreimage records a SHA3 preimage seen by the VM.

func (*DB) AddRefund

func (db *DB) AddRefund(gas uint64)

AddRefund adds gas to the refund counter

func (*DB) AddReward added in v1.3.0

func (db *DB) AddReward(snapshot *stk.ValidatorWrapper, reward *big.Int) error

AddReward distributes the reward to all the delegators based on stake percentage.

func (*DB) Commit

func (db *DB) Commit(deleteEmptyObjects bool) (root common.Hash, err error)

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

func (*DB) Copy

func (db *DB) Copy() *DB

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

func (*DB) CreateAccount

func (db *DB) CreateAccount(addr common.Address)

CreateAccount explicitly creates a state object. If a state object with the address already exists the balance is carried over to the new account.

CreateAccount is called during the EVM CREATE operation. The situation might arise that a contract does the following:

  1. sends funds to sha(account ++ (nonce + 1))
  2. tx_create(sha(account ++ nonce)) (note that this gets the address of 1)

Carrying over the balance ensures that Ether doesn't disappear.

func (*DB) Database

func (db *DB) Database() Database

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

func (*DB) Dump

func (db *DB) Dump() []byte

Dump ...

func (*DB) Empty

func (db *DB) 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 (*DB) Error

func (db *DB) Error() error

func (*DB) Exist

func (db *DB) Exist(addr common.Address) bool

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

func (*DB) Finalise

func (db *DB) Finalise(deleteEmptyObjects bool)

Finalise finalises the state by removing the db destructed objects and clears the journal as well as the refunds.

func (*DB) ForEachStorage

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

ForEachStorage ...

func (*DB) GetBalance

func (db *DB) GetBalance(addr common.Address) *big.Int

GetBalance retrieves the balance from the given address or 0 if object not found

func (*DB) GetCode

func (db *DB) GetCode(addr common.Address) []byte

GetCode ...

func (*DB) GetCodeHash

func (db *DB) GetCodeHash(addr common.Address) common.Hash

GetCodeHash ...

func (*DB) GetCodeSize

func (db *DB) GetCodeSize(addr common.Address) int

GetCodeSize ...

func (*DB) GetCommittedState

func (db *DB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash

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

func (*DB) GetLogs

func (db *DB) GetLogs(hash common.Hash) []*types.Log

GetLogs ...

func (*DB) GetNonce

func (db *DB) GetNonce(addr common.Address) uint64

GetNonce ...

func (*DB) GetOrNewStateObject

func (db *DB) GetOrNewStateObject(addr common.Address) *Object

GetOrNewStateObject retrieves a state object or create a new state object if nil.

func (*DB) GetProof

func (db *DB) GetProof(a common.Address) ([][]byte, error)

GetProof returns the MerkleProof for a given Account

func (*DB) GetRefund

func (db *DB) GetRefund() uint64

GetRefund returns the current value of the refund counter.

func (*DB) GetStakingInfo added in v1.3.0

func (db *DB) GetStakingInfo(addr common.Address) *stk.ValidatorWrapper

GetStakingInfo returns staking information of a given validator (including delegation info)

func (*DB) GetState

func (db *DB) GetState(addr common.Address, hash common.Hash) common.Hash

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

func (*DB) GetStorageProof

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

GetStorageProof returns the StorageProof for given key

func (*DB) HasSuicided

func (db *DB) HasSuicided(addr common.Address) bool

HasSuicided ...

func (*DB) IntermediateRoot

func (db *DB) 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 (*DB) IsValidator added in v1.3.0

func (db *DB) IsValidator(addr common.Address) bool

IsValidator checks whether it is a validator object

func (*DB) Logs

func (db *DB) Logs() []*types.Log

Logs ...

func (*DB) Preimages

func (db *DB) Preimages() map[common.Hash][]byte

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

func (*DB) Prepare

func (db *DB) Prepare(thash, bhash common.Hash, ti int)

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

func (*DB) RawDump

func (db *DB) RawDump() Dump

RawDump ...

func (*DB) Reset

func (db *DB) Reset(root common.Hash) error

Reset clears out all ephemeral state objects from the state db, but keeps the underlying state trie to avoid reloading data for the next operations.

func (*DB) RevertToSnapshot

func (db *DB) RevertToSnapshot(revid int)

RevertToSnapshot reverts all state changes made since the given revision.

func (*DB) SetBalance

func (db *DB) SetBalance(addr common.Address, amount *big.Int)

SetBalance ...

func (*DB) SetCode

func (db *DB) SetCode(addr common.Address, code []byte)

SetCode ...

func (*DB) SetNonce

func (db *DB) SetNonce(addr common.Address, nonce uint64)

SetNonce ...

func (*DB) SetState

func (db *DB) SetState(addr common.Address, key, value common.Hash)

SetState ...

func (*DB) SetValidatorFlag added in v1.3.0

func (db *DB) SetValidatorFlag(addr common.Address)

SetValidatorFlag checks whether it is a validator object

func (*DB) Snapshot

func (db *DB) Snapshot() int

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

func (*DB) StorageTrie

func (db *DB) 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 (*DB) SubBalance

func (db *DB) SubBalance(addr common.Address, amount *big.Int)

SubBalance subtracts amount from the account associated with addr.

func (*DB) SubRefund

func (db *DB) SubRefund(gas uint64)

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

func (*DB) Suicide

func (db *DB) Suicide(addr common.Address) bool

Suicide marks the given account as suicided. 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 Suicide.

func (*DB) UnsetValidatorFlag added in v1.3.0

func (db *DB) UnsetValidatorFlag(addr common.Address)

UnsetValidatorFlag checks whether it is a validator object

func (*DB) UpdateStakingInfo added in v1.3.0

func (db *DB) UpdateStakingInfo(addr common.Address, val *stk.ValidatorWrapper) error

UpdateStakingInfo update staking information of a given validator (including delegation info)

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(addrHash, root common.Hash) (Trie, error)

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

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

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

	// 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 ethdb.Database) Database

NewDatabase creates a backing store for state. The returned database is safe for concurrent use and retains a few recent expanded trie nodes in memory. To keep more historical state in memory, use the NewDatabaseWithCache constructor.

func NewDatabaseWithCache

func NewDatabaseWithCache(db ethdb.Database, cache int) Database

NewDatabaseWithCache creates a backing store for state. The returned database is safe for concurrent use and retains both a few recent expanded trie nodes in memory, as well as a lot of collapsed RLP trie nodes in a large memory cache.

type Dump

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

Dump ...

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"`
	Storage  map[string]string `json:"storage"`
}

DumpAccount ...

type ManagedState

type ManagedState struct {
	*DB
	// contains filtered or unexported fields
}

ManagedState ...

func ManageState

func ManageState(statedb *DB) *ManagedState

ManageState returns a new managed state with the statedb as it's backing layer

func (*ManagedState) GetNonce

func (ms *ManagedState) GetNonce(addr common.Address) uint64

GetNonce returns the canonical nonce for the managed or unmanaged account.

Because GetNonce mutates the DB, we must take a write lock.

func (*ManagedState) HasAccount

func (ms *ManagedState) HasAccount(addr common.Address) bool

HasAccount returns whether the given address is managed or not

func (*ManagedState) NewNonce

func (ms *ManagedState) NewNonce(addr common.Address) uint64

NewNonce returns the new canonical nonce for the managed account

func (*ManagedState) RemoveNonce

func (ms *ManagedState) RemoveNonce(addr common.Address, n uint64)

RemoveNonce removed the nonce from the managed state and all future pending nonces

func (*ManagedState) SetNonce

func (ms *ManagedState) SetNonce(addr common.Address, nonce uint64)

SetNonce sets the new canonical nonce for the managed state

func (*ManagedState) SetState

func (ms *ManagedState) SetState(statedb *DB)

SetState sets the backing layer of the managed state

type Object

type Object struct {
	// contains filtered or unexported fields
}

Object represents an Ethereum account which is being modified.

The usage pattern is as follows: First you need to obtain a state object. Account values can be accessed and modified through the object. Finally, call CommitTrie to write the modified storage trie into a database.

func (*Object) AddBalance

func (so *Object) AddBalance(amount *big.Int)

AddBalance removes amount from c's balance. It is used to add funds to the destination account of a transfer.

func (*Object) Address

func (so *Object) Address() common.Address

Address returns the address of the contract/account

func (*Object) Balance

func (so *Object) Balance() *big.Int

Balance ...

func (*Object) Code

func (so *Object) Code(db Database) []byte

Code returns the contract code associated with this object, if any.

func (*Object) CodeHash

func (so *Object) CodeHash() []byte

CodeHash ...

func (*Object) CommitTrie

func (so *Object) CommitTrie(db Database) error

CommitTrie the storage trie of the object to db. This updates the trie root.

func (*Object) EncodeRLP

func (so *Object) EncodeRLP(w io.Writer) error

EncodeRLP implements rlp.Encoder.

func (*Object) GetCommittedState

func (so *Object) GetCommittedState(db Database, key common.Hash) common.Hash

GetCommittedState retrieves a value from the committed account storage trie.

func (*Object) GetState

func (so *Object) GetState(db Database, key common.Hash) common.Hash

GetState retrieves a value from the account storage trie.

func (*Object) IsValidator added in v1.3.0

func (so *Object) IsValidator(db Database) bool

IsValidator checks whether it is a validator object

func (*Object) Nonce

func (so *Object) Nonce() uint64

Nonce ...

func (*Object) ReturnGas

func (so *Object) ReturnGas(gas *big.Int)

ReturnGas returns the gas back to the origin. Used by the Virtual machine or Closures

func (*Object) SetBalance

func (so *Object) SetBalance(amount *big.Int)

SetBalance ...

func (*Object) SetCode

func (so *Object) SetCode(codeHash common.Hash, code []byte)

SetCode ...

func (*Object) SetNonce

func (so *Object) SetNonce(nonce uint64)

SetNonce ...

func (*Object) SetState

func (so *Object) SetState(db Database, key, value common.Hash)

SetState updates a value in account storage. to remove, set value to common.Hash{}

func (*Object) SubBalance

func (so *Object) SubBalance(amount *big.Int)

SubBalance removes amount from c's balance. It is used to remove funds from the origin account of a transfer.

func (*Object) Value

func (so *Object) Value() *big.Int

Value never called, but must be present to allow Object to be used as a vm.Account interface that also satisfies the vm.ContractRef interface. Interfaces are awesome.

type Storage

type Storage map[common.Hash]common.Hash

Storage ...

func (Storage) Copy

func (storage Storage) Copy() Storage

Copy ...

func (Storage) String

func (storage Storage) String() (str string)

type Trie

type Trie interface {
	TryGet(key []byte) ([]byte, error)
	TryUpdate(key, value []byte) error
	TryDelete(key []byte) error
	Commit(onleaf trie.LeafCallback) (common.Hash, error)
	Hash() common.Hash
	NodeIterator(startKey []byte) trie.NodeIterator
	GetKey([]byte) []byte // TODO(fjl): remove this when SecureTrie is removed
	Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error
}

Trie is a Ethereum Merkle Trie.

Jump to

Keyboard shortcuts

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