Skip to content

Commit

Permalink
move block_class from state to vm
Browse files Browse the repository at this point in the history
  • Loading branch information
carver committed May 3, 2018
1 parent b62eeb6 commit bb5b969
Show file tree
Hide file tree
Showing 10 changed files with 27 additions and 32 deletions.
24 changes: 19 additions & 5 deletions evm/vm/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
import contextlib
import functools
import logging
from typing import List # noqa: F401
from typing import ( # noqa: F401
List,
Type,
TYPE_CHECKING
)

import rlp

Expand Down Expand Up @@ -52,6 +56,11 @@
Message,
)

if TYPE_CHECKING:
from evm.rlp.blocks import ( # noqa: F401
BaseBlock,
)


class BaseVM(Configurable, metaclass=ABCMeta):
"""
Expand All @@ -62,8 +71,10 @@ class BaseVM(Configurable, metaclass=ABCMeta):
Each :class:`~evm.vm.base.BaseVM` class must be configured with:
``_state_class``: The :class:`~evm.vm.state.State` class used by this VM for execution.
- ``block_class``: The :class:`~evm.rlp.blocks.Block` class for blocks in this VM ruleset.
- ``_state_class``: The :class:`~evm.vm.state.State` class used by this VM for execution.
"""
block_class = None # type: Type[BaseBlock]
fork = None
chaindb = None
_state_class = None
Expand Down Expand Up @@ -457,11 +468,14 @@ def create_unsigned_transaction(self, *args, **kwargs):
# Blocks
#
@classmethod
def get_block_class(cls):
def get_block_class(cls) -> Type['BaseBlock']:
"""
Return the :class:`~evm.rlp.blocks.Block` class that the state class uses for blocks.
Return the :class:`~evm.rlp.blocks.Block` class that this VM uses for blocks.
"""
return cls.get_state_class().get_block_class()
if cls.block_class is None:
raise AttributeError("No `block_class` has been set for this VM")
else:
return cls.block_class

@classmethod
@functools.lru_cache(maxsize=32)
Expand Down
2 changes: 2 additions & 0 deletions evm/vm/forks/byzantium/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from evm.vm.forks.spurious_dragon import SpuriousDragonVM
from evm.vm.forks.frontier import make_frontier_receipt

from .blocks import ByzantiumBlock
from .constants import (
EIP658_TRANSACTION_STATUS_CODE_FAILURE,
EIP658_TRANSACTION_STATUS_CODE_SUCCESS,
Expand Down Expand Up @@ -30,6 +31,7 @@ def make_byzantium_receipt(base_header, transaction, computation, state):
# fork name
fork='byzantium',
# classes
block_class=ByzantiumBlock,
_state_class=ByzantiumState,
# Methods
create_header_from_parent=staticmethod(create_byzantium_header_from_parent),
Expand Down
2 changes: 0 additions & 2 deletions evm/vm/forks/byzantium/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,13 @@
)
from evm.vm.forks.spurious_dragon.state import SpuriousDragonState

from .blocks import ByzantiumBlock
from .computation import ByzantiumComputation
from .constants import (
EIP649_BLOCK_REWARD,
)


class ByzantiumState(SpuriousDragonState):
block_class = ByzantiumBlock
computation_class = ByzantiumComputation

@staticmethod
Expand Down
2 changes: 2 additions & 0 deletions evm/vm/forks/frontier/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
Log,
)

from .blocks import FrontierBlock
from .state import FrontierState
from .headers import (
create_frontier_header_from_parent,
Expand Down Expand Up @@ -51,6 +52,7 @@ def make_frontier_receipt(base_header, transaction, computation, state):
# fork name
fork='frontier',
# classes
block_class=FrontierBlock,
_state_class=FrontierState,
# helpers
create_header_from_parent=staticmethod(create_frontier_header_from_parent),
Expand Down
2 changes: 0 additions & 2 deletions evm/vm/forks/frontier/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
encode_hex,
)

from .blocks import FrontierBlock
from .computation import FrontierComputation
from .constants import REFUND_SELFDESTRUCT
from .transaction_context import ( # noqa: F401
Expand Down Expand Up @@ -175,7 +174,6 @@ def run_post_computation(self, transaction, computation):


class FrontierState(BaseState, FrontierTransactionExecutor):
block_class = FrontierBlock
computation_class = FrontierComputation
transaction_context_class = FrontierTransactionContext # type: Type[BaseTransactionContext]
account_db_class = AccountDB # Type[BaseAccountDB]
Expand Down
2 changes: 2 additions & 0 deletions evm/vm/forks/homestead/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
)
from evm.vm.forks.frontier import FrontierVM

from .blocks import HomesteadBlock
from .headers import (
create_homestead_header_from_parent,
compute_homestead_difficulty,
Expand All @@ -22,6 +23,7 @@ class MetaHomesteadVM(FrontierVM): # type: ignore
# fork name
fork='homestead',
# classes
block_class=HomesteadBlock,
_state_class=HomesteadState,
# method overrides
create_header_from_parent=staticmethod(create_homestead_header_from_parent),
Expand Down
2 changes: 0 additions & 2 deletions evm/vm/forks/homestead/state.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from evm.vm.forks.frontier.state import FrontierState

from .blocks import HomesteadBlock
from .computation import HomesteadComputation
from .validation import validate_homestead_transaction


class HomesteadState(FrontierState):
block_class = HomesteadBlock
computation_class = HomesteadComputation

def validate_transaction(self, transaction):
Expand Down
2 changes: 2 additions & 0 deletions evm/vm/forks/spurious_dragon/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from ..homestead import HomesteadVM

from .blocks import SpuriousDragonBlock
from .state import SpuriousDragonState

SpuriousDragonVM = HomesteadVM.configure(
Expand All @@ -8,5 +9,6 @@
# fork name
fork='spurious-dragon',
# classes
block_class=SpuriousDragonBlock,
_state_class=SpuriousDragonState,
)
2 changes: 0 additions & 2 deletions evm/vm/forks/spurious_dragon/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,11 @@
HomesteadState,
)

from .blocks import SpuriousDragonBlock
from .computation import SpuriousDragonComputation
from .utils import collect_touched_accounts


class SpuriousDragonState(HomesteadState):
block_class = SpuriousDragonBlock
computation_class = SpuriousDragonComputation

def run_post_computation(self, transaction, computation):
Expand Down
19 changes: 0 additions & 19 deletions evm/vm/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@
)

if TYPE_CHECKING:
from evm.rlp.blocks import ( # noqa: F401
BaseBlock,
)
from evm.computation import ( # noqa: F401
BaseComputation,
)
Expand All @@ -51,7 +48,6 @@ class BaseState(Configurable, metaclass=ABCMeta):
Each :class:`~evm.vm.state.BaseState` class must be configured with:
- ``block_class``: The :class:`~evm.rlp.blocks.Block` class for blocks in this VM ruleset.
- ``computation_class``: The :class:`~evm.vm.computation.BaseComputation` class for
vm execution.
- ``transaction_context_class``: The :class:`~evm.vm.transaction_context.TransactionContext`
Expand All @@ -64,7 +60,6 @@ class for vm execution.
execution_context = None
state_root = None

block_class = None # type: Type[BaseBlock]
computation_class = None # type: Type[BaseComputation]
transaction_context_class = None # type: Type[BaseTransactionContext]
account_db_class = None # type: Type[BaseAccountDB]
Expand Down Expand Up @@ -217,20 +212,6 @@ def get_transaction_context_class(cls):
raise AttributeError("No `transaction_context_class` has been set for this State")
return cls.transaction_context_class

#
# Block class
#
@classmethod
def get_block_class(cls) -> Type['BaseBlock']:
"""
Return the class used for Blocks
TODO: this should move up to the VM
"""
if cls.block_class is None:
raise AttributeError("No `block_class_class` has been set for this VMState")
return cls.block_class

#
# Execution
#
Expand Down

0 comments on commit bb5b969

Please sign in to comment.