Documentation ¶
Overview ¶
Package emulator contains the implementation of the EVMEmulator and subcomponents.
The main components in this package are:
EVMEmulator, which is responsible for executing the Ethereum transactions.
The EVMEmulator relies on the `go-ethereum` implementation of the Ethereum Virtual Machine (EVM). We use a fork that adds support for ISC's magic contract.
StateDB, which adapts go-ethereum's vm.StateDB interface to ISC's kv.KVStore interface. In other words, it keeps track of the EVM state (the key-value store, account balances, contract codes, etc), storing it in a subpartition of the `evm` core contract's state.
BlockchainDB, which keeps track of the Ethereum blocks and their transactions and receipts.
The emulator package is mostly agnostic about ISC. It depends only on the ethereum and kv packages.
Index ¶
- Constants
- func BlockchainDBSubrealm(store kv.KVStore) kv.KVStore
- func BlockchainDBSubrealmR(store kv.KVStoreReader) kv.KVStoreReader
- func CreateAccount(kv kv.KVStore, addr common.Address)
- func GetChainIDFromBlockChainDBState(kv kv.KVStoreReader) uint16
- func GetCode(s kv.KVStoreReader, addr common.Address) []byte
- func GetNonce(s kv.KVStoreReader, addr common.Address) uint64
- func GetState(s kv.KVStoreReader, addr common.Address, key common.Hash) common.Hash
- func IncNonce(kv kv.KVStore, addr common.Address)
- func Init(emulatorState kv.KVStore, chainID uint16, gasLimits GasLimits, ...)
- func SetCode(kv kv.KVStore, addr common.Address, code []byte)
- func SetNonce(kv kv.KVStore, addr common.Address, n uint64)
- func SetState(kv kv.KVStore, addr common.Address, key, value common.Hash)
- func StateDBSubrealm(store kv.KVStore) kv.KVStore
- func StateDBSubrealmR(store kv.KVStoreReader) kv.KVStoreReader
- type BlockchainDB
- func (bc *BlockchainDB) AddTransaction(tx *types.Transaction, receipt *types.Receipt)
- func (bc *BlockchainDB) GetBlockByHash(hash common.Hash) *types.Block
- func (bc *BlockchainDB) GetBlockByNumber(blockNumber uint64) *types.Block
- func (bc *BlockchainDB) GetBlockHashByBlockNumber(blockNumber uint64) common.Hash
- func (bc *BlockchainDB) GetBlockNumberByBlockHash(hash common.Hash) (uint64, bool)
- func (bc *BlockchainDB) GetBlockNumberByTxHash(txHash common.Hash) (uint64, bool)
- func (bc *BlockchainDB) GetChainID() uint16
- func (bc *BlockchainDB) GetCurrentBlock() *types.Block
- func (bc *BlockchainDB) GetHeaderByBlockNumber(blockNumber uint64) *types.Header
- func (bc *BlockchainDB) GetHeaderByHash(hash common.Hash) *types.Header
- func (bc *BlockchainDB) GetNumber() uint64
- func (bc *BlockchainDB) GetPendingBlockNumber() uint64
- func (bc *BlockchainDB) GetPendingCumulativeGasUsed() uint64
- func (bc *BlockchainDB) GetPendingHeader(timestamp uint64) *types.Header
- func (bc *BlockchainDB) GetReceiptByTxHash(txHash common.Hash) *types.Receipt
- func (bc *BlockchainDB) GetReceiptsByBlockNumber(blockNumber uint64) []*types.Receipt
- func (bc *BlockchainDB) GetTimestampByBlockNumber(blockNumber uint64) uint64
- func (bc *BlockchainDB) GetTransactionByBlockNumberAndIndex(blockNumber uint64, i uint32) *types.Transaction
- func (bc *BlockchainDB) GetTransactionByHash(txHash common.Hash) (tx *types.Transaction, blockHash common.Hash, blockNumber, index uint64, ...)
- func (bc *BlockchainDB) GetTransactionsByBlockNumber(blockNumber uint64) []*types.Transaction
- func (bc *BlockchainDB) GetTxIndexInBlockByTxHash(txHash common.Hash) uint32
- func (bc *BlockchainDB) Init(chainID uint16, timestamp uint64)
- func (bc *BlockchainDB) Initialized() bool
- func (bc *BlockchainDB) MintBlock(timestamp uint64)
- func (bc *BlockchainDB) SetChainID(chainID uint16)
- type Context
- type EVMEmulator
- func (e *EVMEmulator) BlockGasLimit() uint64
- func (e *EVMEmulator) BlockchainDB() *BlockchainDB
- func (e *EVMEmulator) CallContract(call ethereum.CallMsg, gasEstimateMode bool) (*core.ExecutionResult, error)
- func (e *EVMEmulator) CallGasLimit() uint64
- func (e *EVMEmulator) ChainContext() core.ChainContext
- func (e *EVMEmulator) MintBlock()
- func (e *EVMEmulator) SendTransaction(tx *types.Transaction, tracer tracers.Tracer, addToBlockchain ...bool) (receipt *types.Receipt, result *core.ExecutionResult, err error)
- func (e *EVMEmulator) Signer() types.Signer
- func (e *EVMEmulator) StateDB() *StateDB
- type GasLimits
- type StateDB
- func (s *StateDB) AddAddressToAccessList(addr common.Address)
- func (s *StateDB) AddBalance(addr common.Address, amount *uint256.Int)
- func (s *StateDB) AddLog(log *types.Log)
- func (s *StateDB) AddPreimage(common.Hash, []byte)
- func (s *StateDB) AddRefund(n uint64)
- func (s *StateDB) AddSlotToAccessList(addr common.Address, slot common.Hash)
- func (s *StateDB) AddressInAccessList(addr common.Address) bool
- func (s *StateDB) CreateAccount(addr common.Address)
- func (s *StateDB) Empty(addr common.Address) bool
- func (s *StateDB) Exist(addr common.Address) bool
- func (s *StateDB) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error
- func (s *StateDB) GetBalance(addr common.Address) *uint256.Int
- func (s *StateDB) GetCode(addr common.Address) []byte
- func (s *StateDB) GetCodeHash(addr common.Address) common.Hash
- func (s *StateDB) GetCodeSize(addr common.Address) int
- func (s *StateDB) GetCommittedState(addr common.Address, key common.Hash) common.Hash
- func (s *StateDB) GetLogs() []*types.Log
- func (s *StateDB) GetNonce(addr common.Address) uint64
- func (s *StateDB) GetRefund() uint64
- func (s *StateDB) GetState(addr common.Address, key common.Hash) common.Hash
- func (*StateDB) GetTransientState(addr common.Address, key common.Hash) common.Hash
- func (s *StateDB) HasSelfDestructed(addr common.Address) bool
- func (s *StateDB) IncNonce(addr common.Address)
- func (s *StateDB) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, ...)
- func (s *StateDB) PrepareAccessList(sender common.Address, dest *common.Address, precompiles []common.Address, ...)
- func (s *StateDB) RevertToSnapshot(i int)
- func (s *StateDB) SelfDestruct(addr common.Address)
- func (s *StateDB) Selfdestruct6780(addr common.Address)
- func (s *StateDB) SetCode(addr common.Address, code []byte)
- func (s *StateDB) SetNonce(addr common.Address, n uint64)
- func (s *StateDB) SetState(addr common.Address, key, value common.Hash)
- func (*StateDB) SetTransientState(addr common.Address, key common.Hash, value common.Hash)
- func (s *StateDB) SlotInAccessList(addr common.Address, slot common.Hash) (addressOk, slotOk bool)
- func (s *StateDB) Snapshot() int
- func (s *StateDB) SubBalance(addr common.Address, amount *uint256.Int)
- func (s *StateDB) SubRefund(n uint64)
Constants ¶
const (
BlockKeepAll = -1
)
Variables ¶
This section is empty.
Functions ¶
func BlockchainDBSubrealmR ¶ added in v1.0.3
func BlockchainDBSubrealmR(store kv.KVStoreReader) kv.KVStoreReader
func GetChainIDFromBlockChainDBState ¶ added in v1.0.3
func GetChainIDFromBlockChainDBState(kv kv.KVStoreReader) uint16
func Init ¶
func Init( emulatorState kv.KVStore, chainID uint16, gasLimits GasLimits, timestamp uint64, alloc core.GenesisAlloc, )
Init initializes the EVM state with the provided genesis allocation parameters
func StateDBSubrealmR ¶ added in v1.0.3
func StateDBSubrealmR(store kv.KVStoreReader) kv.KVStoreReader
Types ¶
type BlockchainDB ¶
type BlockchainDB struct {
// contains filtered or unexported fields
}
BlockchainDB contains logic for storing a fake blockchain (more like a list of blocks), intended for satisfying EVM tools that depend on the concept of a block.
func NewBlockchainDB ¶
func NewBlockchainDB(store kv.KVStore, blockGasLimit uint64, blockKeepAmount int32) *BlockchainDB
func (*BlockchainDB) AddTransaction ¶
func (bc *BlockchainDB) AddTransaction(tx *types.Transaction, receipt *types.Receipt)
func (*BlockchainDB) GetBlockByHash ¶
func (bc *BlockchainDB) GetBlockByHash(hash common.Hash) *types.Block
func (*BlockchainDB) GetBlockByNumber ¶
func (bc *BlockchainDB) GetBlockByNumber(blockNumber uint64) *types.Block
func (*BlockchainDB) GetBlockHashByBlockNumber ¶
func (bc *BlockchainDB) GetBlockHashByBlockNumber(blockNumber uint64) common.Hash
func (*BlockchainDB) GetBlockNumberByBlockHash ¶
func (bc *BlockchainDB) GetBlockNumberByBlockHash(hash common.Hash) (uint64, bool)
func (*BlockchainDB) GetBlockNumberByTxHash ¶
func (bc *BlockchainDB) GetBlockNumberByTxHash(txHash common.Hash) (uint64, bool)
func (*BlockchainDB) GetChainID ¶
func (bc *BlockchainDB) GetChainID() uint16
func (*BlockchainDB) GetCurrentBlock ¶
func (bc *BlockchainDB) GetCurrentBlock() *types.Block
func (*BlockchainDB) GetHeaderByBlockNumber ¶
func (bc *BlockchainDB) GetHeaderByBlockNumber(blockNumber uint64) *types.Header
func (*BlockchainDB) GetHeaderByHash ¶
func (bc *BlockchainDB) GetHeaderByHash(hash common.Hash) *types.Header
func (*BlockchainDB) GetNumber ¶
func (bc *BlockchainDB) GetNumber() uint64
func (*BlockchainDB) GetPendingBlockNumber ¶
func (bc *BlockchainDB) GetPendingBlockNumber() uint64
func (*BlockchainDB) GetPendingCumulativeGasUsed ¶ added in v1.0.3
func (bc *BlockchainDB) GetPendingCumulativeGasUsed() uint64
func (*BlockchainDB) GetPendingHeader ¶
func (bc *BlockchainDB) GetPendingHeader(timestamp uint64) *types.Header
func (*BlockchainDB) GetReceiptByTxHash ¶
func (bc *BlockchainDB) GetReceiptByTxHash(txHash common.Hash) *types.Receipt
func (*BlockchainDB) GetReceiptsByBlockNumber ¶
func (bc *BlockchainDB) GetReceiptsByBlockNumber(blockNumber uint64) []*types.Receipt
func (*BlockchainDB) GetTimestampByBlockNumber ¶
func (bc *BlockchainDB) GetTimestampByBlockNumber(blockNumber uint64) uint64
func (*BlockchainDB) GetTransactionByBlockNumberAndIndex ¶
func (bc *BlockchainDB) GetTransactionByBlockNumberAndIndex(blockNumber uint64, i uint32) *types.Transaction
func (*BlockchainDB) GetTransactionByHash ¶
func (bc *BlockchainDB) GetTransactionByHash(txHash common.Hash) (tx *types.Transaction, blockHash common.Hash, blockNumber, index uint64, err error)
func (*BlockchainDB) GetTransactionsByBlockNumber ¶
func (bc *BlockchainDB) GetTransactionsByBlockNumber(blockNumber uint64) []*types.Transaction
func (*BlockchainDB) GetTxIndexInBlockByTxHash ¶ added in v1.0.3
func (bc *BlockchainDB) GetTxIndexInBlockByTxHash(txHash common.Hash) uint32
func (*BlockchainDB) Init ¶
func (bc *BlockchainDB) Init(chainID uint16, timestamp uint64)
func (*BlockchainDB) Initialized ¶
func (bc *BlockchainDB) Initialized() bool
func (*BlockchainDB) MintBlock ¶
func (bc *BlockchainDB) MintBlock(timestamp uint64)
func (*BlockchainDB) SetChainID ¶
func (bc *BlockchainDB) SetChainID(chainID uint16)
type Context ¶ added in v1.0.3
type Context interface { State() kv.KVStore Timestamp() uint64 GasLimits() GasLimits BlockKeepAmount() int32 MagicContracts() map[common.Address]vm.ISCMagicContract TakeSnapshot() int RevertToSnapshot(int) BaseTokensDecimals() uint32 GetBaseTokensBalance(addr common.Address) *big.Int AddBaseTokensBalance(addr common.Address, amount *big.Int) SubBaseTokensBalance(addr common.Address, amount *big.Int) WithoutGasBurn(f func()) }
type EVMEmulator ¶
type EVMEmulator struct {
// contains filtered or unexported fields
}
func NewEVMEmulator ¶
func NewEVMEmulator(ctx Context) *EVMEmulator
func (*EVMEmulator) BlockGasLimit ¶ added in v1.0.3
func (e *EVMEmulator) BlockGasLimit() uint64
func (*EVMEmulator) BlockchainDB ¶
func (e *EVMEmulator) BlockchainDB() *BlockchainDB
func (*EVMEmulator) CallContract ¶
func (e *EVMEmulator) CallContract(call ethereum.CallMsg, gasEstimateMode bool) (*core.ExecutionResult, error)
CallContract executes a contract call, without committing changes to the state
func (*EVMEmulator) CallGasLimit ¶ added in v1.0.3
func (e *EVMEmulator) CallGasLimit() uint64
func (*EVMEmulator) ChainContext ¶
func (e *EVMEmulator) ChainContext() core.ChainContext
func (*EVMEmulator) MintBlock ¶
func (e *EVMEmulator) MintBlock()
func (*EVMEmulator) SendTransaction ¶
func (e *EVMEmulator) SendTransaction( tx *types.Transaction, tracer tracers.Tracer, addToBlockchain ...bool, ) (receipt *types.Receipt, result *core.ExecutionResult, err error)
func (*EVMEmulator) Signer ¶
func (e *EVMEmulator) Signer() types.Signer
func (*EVMEmulator) StateDB ¶
func (e *EVMEmulator) StateDB() *StateDB
type StateDB ¶
type StateDB struct {
// contains filtered or unexported fields
}
StateDB implements vm.StateDB with a kv.KVStore as backend. The Ethereum account balance is tied to the L1 balance.
func NewStateDB ¶
func NewStateDBFromKVStore ¶ added in v1.1.0
NewStateDBFromKVStore Creates a StateDB without any context. Handle with care. Functions requiring the context will crash. It is currently only used for the ERC721 registration using a KVStore which doesn't justify a new class.
func (*StateDB) AddAddressToAccessList ¶
AddAddressToAccessList adds the given address to the access list. This operation is safe to perform even if the feature/fork is not active yet
func (*StateDB) AddSlotToAccessList ¶
AddSlotToAccessList adds the given (address,slot) to the access list. This operation is safe to perform even if the feature/fork is not active yet
func (*StateDB) AddressInAccessList ¶
func (*StateDB) CreateAccount ¶
func (*StateDB) Empty ¶
Empty returns whether the given account is empty. Empty is defined according to EIP161 (balance = nonce = code = 0).
func (*StateDB) Exist ¶
Exist reports whether the given account exists in state. Notably this should also return true for self-destructed accounts.
func (*StateDB) ForEachStorage ¶
func (*StateDB) GetCommittedState ¶
func (*StateDB) GetTransientState ¶ added in v1.0.3
GetTransientState implements vm.StateDB
func (*StateDB) HasSelfDestructed ¶ added in v1.0.3
func (*StateDB) Prepare ¶ added in v1.0.3
func (s *StateDB) Prepare(rules params.Rules, sender common.Address, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList)
Prepare implements vm.StateDB
func (*StateDB) PrepareAccessList ¶
func (*StateDB) RevertToSnapshot ¶
func (*StateDB) SelfDestruct ¶ added in v1.0.3
func (*StateDB) Selfdestruct6780 ¶ added in v1.0.3
func (*StateDB) SetTransientState ¶ added in v1.0.3
SetTransientState implements vm.StateDB