Fabcoin Core  0.16.2
P2P Digital Currency
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Friends | List of all members
dev::eth::State Class Reference

Model of an Ethereum state, essentially a facade for the trie. More...

#include <State.h>

Inheritance diagram for dev::eth::State:
[legend]
Collaboration diagram for dev::eth::State:
[legend]

Public Types

enum  CommitBehaviour { CommitBehaviour::KeepEmptyAccounts, CommitBehaviour::RemoveEmptyAccounts }
 
enum  NullType { Null }
 

Public Member Functions

 State (u256 const &_accountStartNonce)
 Default constructor; creates with a blank database prepopulated with the genesis block. More...
 
 State (u256 const &_accountStartNonce, OverlayDB const &_db, BaseState _bs=BaseState::PreExisting)
 Basic state object from database. More...
 
 State (NullType)
 
 State (State const &_s)
 Copy state object. More...
 
Stateoperator= (State const &_s)
 Copy state object. More...
 
OverlayDB const & db () const
 
OverlayDBdb ()
 
void populateFrom (AccountMap const &_map)
 Populate the state from the given AccountMap. Just uses dev::eth::commit(). More...
 
std::unordered_map< Address, u256addresses () const
 
std::pair< ExecutionResult, TransactionReceiptexecute (EnvInfo const &_envInfo, SealEngineFace const &_sealEngine, Transaction const &_t, Permanence _p=Permanence::Committed, OnOpFunc const &_onOp=OnOpFunc())
 Execute a given transaction. More...
 
bool addressInUse (Address const &_address) const
 Check if the address is in use. More...
 
bool accountNonemptyAndExisting (Address const &_address) const
 Check if the account exists in the state and is non empty (nonce > 0 || balance > 0 || code nonempty). More...
 
bool addressHasCode (Address const &_address) const
 Check if the address contains executable code. More...
 
u256 balance (Address const &_id) const
 Get an account's balance. More...
 
virtual void addBalance (Address const &_id, u256 const &_amount)
 Add some amount to balance. More...
 
void subBalance (Address const &_addr, u256 const &_value)
 Subtract the _value amount from the balance of _addr account. More...
 
virtual void transferBalance (Address const &_from, Address const &_to, u256 const &_value)
 Transfers "the balance _value between two accounts. More...
 
h256 storageRoot (Address const &_contract) const
 Get the root of the storage of an account. More...
 
u256 storage (Address const &_contract, u256 const &_memory) const
 Get the value of a storage position of an account. More...
 
void setStorage (Address const &_contract, u256 const &_location, u256 const &_value)
 Set the value of a storage position of an account. More...
 
void createContract (Address const &_address)
 Create a contract at the given address (with unset code and unchanged balance). More...
 
void setNewCode (Address const &_address, bytes &&_code)
 Sets the code of the account. Must only be called during / after contract creation. More...
 
virtual void kill (Address _a)
 Delete an account (used for processing suicides). More...
 
std::map< h256, std::pair< u256, u256 > > storage (Address const &_contract) const
 Get the storage of an account. More...
 
bytes const & code (Address const &_addr) const
 Get the code of an account. More...
 
h256 codeHash (Address const &_contract) const
 Get the code hash of an account. More...
 
size_t codeSize (Address const &_contract) const
 Get the byte-size of the code of an account. More...
 
void incNonce (Address const &_id)
 Increament the account nonce. More...
 
u256 getNonce (Address const &_addr) const
 Get the account nonce – the number of transactions it has sent. More...
 
h256 rootHash () const
 The hash of the root of our state tree. More...
 
void commit (CommitBehaviour _commitBehaviour)
 Commit all changes waiting in the address cache to the DB. More...
 
void setRoot (h256 const &_root)
 Resets any uncommitted changes to the cache. More...
 
u256 const & accountStartNonce () const
 Get the account start nonce. May be required. More...
 
u256 const & requireAccountStartNonce () const
 
void noteAccountStartNonce (u256 const &_actual)
 
size_t savepoint () const
 Create a savepoint in the state changelog. More...
 
void rollback (size_t _savepoint)
 Revert all recent changes up to the given _savepoint savepoint. More...
 
virtual ~State ()
 

Static Public Member Functions

static OverlayDB openDB (std::string const &_path, h256 const &_genesisHash, WithExisting _we=WithExisting::Trust)
 Open a DB - useful for passing into the constructor & keeping for other states that are necessary. More...
 

Protected Member Functions

void removeEmptyAccounts ()
 Turns all "touched" empty accounts into non-alive accounts. More...
 
Account const * account (Address const &_addr) const
 
Accountaccount (Address const &_addr)
 
void clearCacheIfTooLarge () const
 Purges non-modified entries in m_cache if it grows too large. More...
 
void createAccount (Address const &_address, Account const &&_account)
 

Protected Attributes

OverlayDB m_db
 Our overlay for the state tree. More...
 
SecureTrieDB< Address, OverlayDBm_state
 Our state tree, as an OverlayDB DB. More...
 
std::unordered_map< Address, Accountm_cache
 Our address cache. This stores the states of each address that has (or at least might have) been changed. More...
 
std::vector< Addressm_unchangedCacheEntries
 Tracks entries in m_cache that can potentially be purged if it grows too large. More...
 
std::set< Addressm_nonExistingAccountsCache
 Tracks addresses that are known to not exist. More...
 
AddressHash m_touched
 Tracks all addresses touched so far. More...
 
u256 m_accountStartNonce
 
std::vector< detail::Changem_changeLog
 

Friends

class ExtVM
 
class dev::test::ImportTest
 
class dev::test::StateLoader
 
class BlockChain
 
std::ostream & operator<< (std::ostream &_out, State const &_s)
 

Detailed Description

Model of an Ethereum state, essentially a facade for the trie.

Allows you to query the state of accounts as well as creating and modifying accounts. It has built-in caching for various aspects of the state.

State Changelog

Any atomic change to any account is registered and appended in the changelog. In case some changes must be reverted, the changes are popped from the changelog and undone. For possible atomic changes list

See also
Change::Kind. The changelog is managed by savepoint(), rollback() and commit() methods.

Definition at line 161 of file State.h.

Member Enumeration Documentation

Enumerator
KeepEmptyAccounts 
RemoveEmptyAccounts 

Definition at line 169 of file State.h.

Enumerator
Null 

Definition at line 184 of file State.h.

Constructor & Destructor Documentation

dev::eth::State::State ( u256 const &  _accountStartNonce)
inlineexplicit

Default constructor; creates with a blank database prepopulated with the genesis block.

Definition at line 176 of file State.h.

State::State ( u256 const &  _accountStartNonce,
OverlayDB const &  _db,
BaseState  _bs = BaseState::PreExisting 
)
explicit

Basic state object from database.

Use the default when you already have a database and you just want to make a State object which uses it. If you have no preexisting database then set BaseState to something other than BaseState::PreExisting in order to prepopulate the Trie.

Definition at line 54 of file State.cpp.

dev::eth::State::State ( NullType  )
inline

Definition at line 185 of file State.h.

State::State ( State const &  _s)

Copy state object.

Definition at line 64 of file State.cpp.

virtual dev::eth::State::~State ( )
inlinevirtual

Definition at line 309 of file State.h.

Member Function Documentation

Account const * State::account ( Address const &  _addr) const
protected
Returns
the account at the given address or a null pointer if it does not exist. The pointer is valid until the next access to the state or account.

Definition at line 158 of file State.cpp.

Here is the caller graph for this function:

Account * State::account ( Address const &  _addr)
protected
Returns
the account at the given address or a null pointer if it does not exist. The pointer is valid until the next access to the state or account.

Definition at line 163 of file State.cpp.

Here is the call graph for this function:

bool State::accountNonemptyAndExisting ( Address const &  _address) const

Check if the account exists in the state and is non empty (nonce > 0 || balance > 0 || code nonempty).

These two notions are equivalent after EIP158.

Definition at line 250 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

u256 const& dev::eth::State::accountStartNonce ( ) const
inline

Get the account start nonce. May be required.

Definition at line 298 of file State.h.

Here is the caller graph for this function:

void State::addBalance ( Address const &  _id,
u256 const &  _amount 
)
virtual

Add some amount to balance.

Will initialise the address if it has never been used.

Reimplemented in FascState.

Definition at line 286 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

unordered_map< Address, u256 > State::addresses ( ) const
Returns
the set containing all addresses currently in use in Ethereum.
Warning
This is slowslowslow. Don't use it unless you want to lock the object for seconds or minutes at a time.
Exceptions
InterfaceNotSupportedif compiled without ETH_FATDB.

Definition at line 220 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

bool State::addressHasCode ( Address const &  _address) const

Check if the address contains executable code.

Definition at line 258 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

bool State::addressInUse ( Address const &  _address) const

Check if the address is in use.

Definition at line 245 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

u256 State::balance ( Address const &  _id) const

Get an account's balance.

Returns
0 if the address has never been used.

Definition at line 266 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::clearCacheIfTooLarge ( ) const
protected

Purges non-modified entries in m_cache if it grows too large.

Definition at line 192 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

bytes const & State::code ( Address const &  _addr) const

Get the code of an account.

Returns
bytes() if no account exists at that address.
Warning
The reference to the code is only valid until the access to other account. Do not keep it.

Definition at line 423 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

h256 State::codeHash ( Address const &  _contract) const

Get the code hash of an account.

Returns
EmptySHA3 if no account exists at that address or if there is no code associated with the address.

Definition at line 446 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

size_t State::codeSize ( Address const &  _contract) const

Get the byte-size of the code of an account.

Returns
code(_contract).size(), but utilizes CodeSizeHash.

Definition at line 454 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::commit ( CommitBehaviour  _commitBehaviour)

Commit all changes waiting in the address cache to the DB.

Parameters
_commitBehaviourwhether or not to remove empty accounts during commit.

Definition at line 210 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::createAccount ( Address const &  _address,
Account const &&  _account 
)
protected

Definition at line 330 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::createContract ( Address const &  _address)

Create a contract at the given address (with unset code and unchanged balance).

Definition at line 325 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

OverlayDB const& dev::eth::State::db ( ) const
inline

Definition at line 195 of file State.h.

Here is the caller graph for this function:

OverlayDB& dev::eth::State::db ( )
inline

Definition at line 196 of file State.h.

Here is the call graph for this function:

std::pair< ExecutionResult, TransactionReceipt > State::execute ( EnvInfo const &  _envInfo,
SealEngineFace const &  _sealEngine,
Transaction const &  _t,
Permanence  _p = Permanence::Committed,
OnOpFunc const &  _onOp = OnOpFunc() 
)

Execute a given transaction.

This will change the state accordingly.

Definition at line 515 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

u256 State::getNonce ( Address const &  _addr) const

Get the account nonce – the number of transactions it has sent.

Returns
0 if the address has never been used.

Definition at line 345 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::incNonce ( Address const &  _id)

Increament the account nonce.

Definition at line 274 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::kill ( Address  _a)
virtual

Delete an account (used for processing suicides).

Reimplemented in FascState.

Definition at line 338 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::noteAccountStartNonce ( u256 const &  _actual)

Definition at line 128 of file State.cpp.

Here is the caller graph for this function:

OverlayDB State::openDB ( std::string const &  _path,
h256 const &  _genesisHash,
WithExisting  _we = WithExisting::Trust 
)
static

Open a DB - useful for passing into the constructor & keeping for other states that are necessary.

Definition at line 74 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

State & State::operator= ( State const &  _s)

Copy state object.

Definition at line 143 of file State.cpp.

void State::populateFrom ( AccountMap const &  _map)

Populate the state from the given AccountMap. Just uses dev::eth::commit().

Definition at line 115 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void State::removeEmptyAccounts ( )
protected

Turns all "touched" empty accounts into non-alive accounts.

Definition at line 136 of file State.cpp.

Here is the caller graph for this function:

u256 const & State::requireAccountStartNonce ( ) const

Definition at line 121 of file State.cpp.

Here is the caller graph for this function:

void State::rollback ( size_t  _savepoint)

Revert all recent changes up to the given _savepoint savepoint.

Definition at line 480 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

h256 dev::eth::State::rootHash ( ) const
inline

The hash of the root of our state tree.

Definition at line 288 of file State.h.

Here is the call graph for this function:

Here is the caller graph for this function:

size_t State::savepoint ( ) const

Create a savepoint in the state changelog.

///

Returns
The savepoint index that can be used in rollback() function.

Definition at line 475 of file State.cpp.

Here is the caller graph for this function:

void State::setNewCode ( Address const &  _address,
bytes &&  _code 
)

Sets the code of the account. Must only be called during / after contract creation.

Definition at line 440 of file State.cpp.

Here is the caller graph for this function:

void State::setRoot ( h256 const &  _root)

Resets any uncommitted changes to the cache.

Definition at line 236 of file State.cpp.

Here is the caller graph for this function:

void State::setStorage ( Address const &  _contract,
u256 const &  _location,
u256 const &  _value 
)

Set the value of a storage position of an account.

Definition at line 372 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

u256 State::storage ( Address const &  _contract,
u256 const &  _memory 
) const

Get the value of a storage position of an account.

Returns
0 if no account exists at that address.

Definition at line 353 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

map< h256, pair< u256, u256 > > State::storage ( Address const &  _contract) const

Get the storage of an account.

Note
This is expensive. Don't use it unless you need to.
Returns
map of hashed keys to key-value pairs or empty map if no account exists at that address.

Definition at line 378 of file State.cpp.

Here is the call graph for this function:

h256 State::storageRoot ( Address const &  _contract) const

Get the root of the storage of an account.

Definition at line 412 of file State.cpp.

Here is the call graph for this function:

void State::subBalance ( Address const &  _addr,
u256 const &  _value 
)

Subtract the _value amount from the balance of _addr account.

Exceptions
NotEnoughCashif the balance of the account is less than the amount to be subtrackted (also in case the account does not exist).

Definition at line 311 of file State.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

virtual void dev::eth::State::transferBalance ( Address const &  _from,
Address const &  _to,
u256 const &  _value 
)
inlinevirtual

Transfers "the balance _value between two accounts.

Parameters
_fromAccount from which _value will be deducted.
_toAccount to which _value will be added.
_valueAmount to be transferred.

Reimplemented in FascState.

Definition at line 240 of file State.h.

Here is the caller graph for this function:

Friends And Related Function Documentation

friend class BlockChain
friend

Definition at line 166 of file State.h.

friend class dev::test::ImportTest
friend

Definition at line 164 of file State.h.

friend class dev::test::StateLoader
friend

Definition at line 165 of file State.h.

friend class ExtVM
friend

Definition at line 163 of file State.h.

std::ostream& operator<< ( std::ostream &  _out,
State const &  _s 
)
friend

Member Data Documentation

u256 dev::eth::State::m_accountStartNonce
protected

Definition at line 336 of file State.h.

std::unordered_map<Address, Account> dev::eth::State::m_cache
mutableprotected

Our address cache. This stores the states of each address that has (or at least might have) been changed.

Definition at line 331 of file State.h.

std::vector<detail::Change> dev::eth::State::m_changeLog
protected

Definition at line 339 of file State.h.

OverlayDB dev::eth::State::m_db
protected

Our overlay for the state tree.

Definition at line 329 of file State.h.

std::set<Address> dev::eth::State::m_nonExistingAccountsCache
mutableprotected

Tracks addresses that are known to not exist.

Definition at line 333 of file State.h.

SecureTrieDB<Address, OverlayDB> dev::eth::State::m_state
protected

Our state tree, as an OverlayDB DB.

Definition at line 330 of file State.h.

AddressHash dev::eth::State::m_touched
protected

Tracks all addresses touched so far.

Definition at line 334 of file State.h.

std::vector<Address> dev::eth::State::m_unchangedCacheEntries
mutableprotected

Tracks entries in m_cache that can potentially be purged if it grows too large.

Definition at line 332 of file State.h.


The documentation for this class was generated from the following files: