emulator

package
v0.7.0-alpha.12 Latest Latest
Warning

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

Go to latest
Published: Aug 8, 2023 License: Apache-2.0 Imports: 26 Imported by: 1

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

View Source
const (
	BlockKeepAll = -1
)

Variables

This section is empty.

Functions

func BlockchainDBSubrealm added in v1.0.3

func BlockchainDBSubrealm(store kv.KVStore) kv.KVStore

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 GetNonce added in v1.0.3

func GetNonce(s kv.KVStoreReader, addr common.Address) uint64

func Init

func Init(
	store kv.KVStore,
	chainID uint16,
	gasLimits GasLimits,
	timestamp uint64,
	alloc core.GenesisAlloc,
)

Init initializes the EVM state with the provided genesis allocation parameters

func StateDBSubrealm added in v1.0.3

func StateDBSubrealm(store kv.KVStore) kv.KVStore

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) GetLatestPendingReceipt

func (bc *BlockchainDB) GetLatestPendingReceipt() *types.Receipt

func (*BlockchainDB) GetNumber

func (bc *BlockchainDB) GetNumber() uint64

func (*BlockchainDB) GetPendingBlockNumber

func (bc *BlockchainDB) GetPendingBlockNumber() uint64

func (*BlockchainDB) GetPendingHeader

func (bc *BlockchainDB) GetPendingHeader(timestamp uint64) *types.Header

func (*BlockchainDB) GetReceiptByBlockNumberAndIndex

func (bc *BlockchainDB) GetReceiptByBlockNumberAndIndex(blockNumber uint64, txIndex uint32) *types.Receipt

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 BufferedStateDB

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

BufferedStateDB is a wrapper for StateDB that writes all mutations into an in-memory buffer, leaving the original state unmodified until the mutations are applied manually with Commit().

func NewBufferedStateDB

func NewBufferedStateDB(base *StateDB) *BufferedStateDB

func (*BufferedStateDB) Commit

func (b *BufferedStateDB) Commit()

func (*BufferedStateDB) StateDB

func (b *BufferedStateDB) StateDB() *StateDB

type EVMEmulator

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

func NewEVMEmulator

func NewEVMEmulator(
	store kv.KVStore,
	timestamp uint64,
	gasLimits GasLimits,
	blockKeepAmount int32,
	magicContracts map[common.Address]vm.ISCMagicContract,
	l2Balance L2Balance,
) *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, gasBurnEnable func(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,
	gasBurnEnable func(bool),
	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 GasLimits added in v1.0.3

type GasLimits struct {
	Block uint64
	Call  uint64
}

type L2Balance

type L2Balance interface {
	Get(addr common.Address) *big.Int
	Add(addr common.Address, amount *big.Int)
	Sub(addr common.Address, amount *big.Int)
}

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 NewStateDB(store kv.KVStore, l2Balance L2Balance) *StateDB

func (*StateDB) AddAddressToAccessList

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

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) AddBalance

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

func (*StateDB) AddLog

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

func (*StateDB) AddPreimage

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

func (*StateDB) AddRefund

func (s *StateDB) AddRefund(n uint64)

func (*StateDB) AddSlotToAccessList

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

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 (s *StateDB) AddressInAccessList(addr common.Address) bool

func (*StateDB) Buffered

func (s *StateDB) Buffered() *BufferedStateDB

func (*StateDB) CreateAccount

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

func (*StateDB) Empty

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

Empty returns whether the given account is empty. Empty is defined according to EIP161 (balance = nonce = code = 0).

func (*StateDB) Exist

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

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

func (*StateDB) ForEachStorage

func (s *StateDB) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error

func (*StateDB) GetBalance

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

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

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

func (*StateDB) GetLogs

func (s *StateDB) GetLogs(_ common.Hash) []*types.Log

func (*StateDB) GetNonce

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

func (*StateDB) GetRefund

func (s *StateDB) GetRefund() uint64

func (*StateDB) GetState

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

func (*StateDB) GetTransientState added in v1.0.3

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

GetTransientState implements vm.StateDB

func (*StateDB) HasSuicided

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

func (*StateDB) IncNonce added in v1.0.3

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

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 (s *StateDB) PrepareAccessList(sender common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList)

func (*StateDB) RevertToSnapshot

func (s *StateDB) RevertToSnapshot(int)

func (*StateDB) SetCode

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

func (*StateDB) SetNonce

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

func (*StateDB) SetState

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

func (*StateDB) SetTransientState added in v1.0.3

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

SetTransientState implements vm.StateDB

func (*StateDB) SlotInAccessList

func (s *StateDB) SlotInAccessList(addr common.Address, slot common.Hash) (addressOk, slotOk bool)

func (*StateDB) Snapshot

func (s *StateDB) Snapshot() int

func (*StateDB) SubBalance

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

func (*StateDB) SubRefund

func (s *StateDB) SubRefund(n uint64)

func (*StateDB) Suicide

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

Jump to

Keyboard shortcuts

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