Skip to content

Commit

Permalink
Only assign VMState._chaindb in __init__ + Mutable VMState
Browse files Browse the repository at this point in the history
  • Loading branch information
hwwhww committed Jan 9, 2018
1 parent 558bdb4 commit 81b4b1a
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 41 deletions.
12 changes: 3 additions & 9 deletions evm/vm/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,26 +96,21 @@ def apply_transaction(self, transaction):
Apply the transaction to the vm in the current block.
"""
if self.is_stateless:
computation, block, trie_data = self.state.apply_transaction(
computation, block, trie_data = self.get_state_class().apply_transaction(
self.state,
transaction,
self.block,
is_stateless=True,
witness_db=self.chaindb,
)
self.block = block

# Update chaindb
# TODO: Modify Chain.apply_transaction to update the local vm state before
# returning the computation object.
self.chaindb.db.wrapped_db.kv_store.update(
computation.vm_state.chaindb.db.wrapped_db.kv_store,
)

# Persist changed transaction and receipt key-values to self.chaindb.
for key, value in trie_data.items():
self.chaindb.db[key] = value
else:
computation, _, _ = self.state.apply_transaction(
computation, _, _ = self.get_state_class().apply_transaction(
self.state,
transaction,
self.block,
Expand Down Expand Up @@ -270,7 +265,6 @@ def create_block(
transaction=transaction,
block=block,
is_stateless=True,
witness_db=witness_db,
)

if not computation.is_error:
Expand Down
1 change: 0 additions & 1 deletion evm/vm/forks/frontier/headers.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ def configure_frontier_header(vm, **header_params):
setattr(vm.block.header, field_name, value)

if 'timestamp' in header_params and vm.block.header.block_number > 0:
# TODO: replace vm.chaindb with vm.state.db?
parent_header = vm.get_parent_header(vm.block.header, vm.chaindb)
vm.block.header.difficulty = compute_frontier_difficulty(
parent_header,
Expand Down
23 changes: 6 additions & 17 deletions evm/vm_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ def gas_limit(self):
#
# chaindb
#
@property
def chaindb(self):
return self._chaindb
# @property
# def chaindb(self):
# return self._chaindb

def set_chaindb(self, db):
self._chaindb = db
Expand Down Expand Up @@ -205,37 +205,26 @@ def apply_transaction(
vm_state,
transaction,
block,
is_stateless=True,
witness_db=None):
is_stateless=True):
"""
Apply transaction to the given block
:param vm_state: the VMState object
:param transaction: the transaction need to be applied
:param block: the block which the transaction applies on
:param is_stateless: if is_stateless, call VMState.add_transactionto set block
:param witness_db: for stateless mode, use witness_db as chaindb
:type vm_state: VMState
:type transaction: Transaction
:type block: Block
:type is_stateless: bool
:type witness_db: BaseChainDB
:return: the computation, applied block, and the trie_data
:rtype: (Computation, Block, dict[bytes, bytes])
"""
if is_stateless:
# Update block in this level.
assert witness_db is not None

# Don't change the given vm_state, block, and witness_db
vm_state = copy.deepcopy(vm_state)
# Don't modify the given block
block = copy.deepcopy(block)
witness_db = copy.deepcopy(witness_db)

vm_state.set_chaindb(witness_db)
cls.block_header = block.header

vm_state.block_header = block.header
computation, block_header = cls.execute_transaction(vm_state, transaction)

# Set block.
Expand Down
19 changes: 5 additions & 14 deletions tests/core/vm/test_vm_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811

# Don't change these variables
vm = chain.get_vm()
vm._is_stateless = False # Only for testing
chaindb = copy.deepcopy(vm.chaindb)
block0 = copy.deepcopy(vm.block)
prev_block_hash = chain.get_canonical_block_by_number(0).hash
Expand All @@ -74,6 +73,7 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811
# The first transaction
chain1 = copy.deepcopy(chain)
vm_example = chain1.get_vm()
vm_example._is_stateless = False # Only for testing
recipient1 = decode_hex('0x1111111111111111111111111111111111111111')
amount = 100
from_ = chain.funded_address
Expand Down Expand Up @@ -119,18 +119,16 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811
vm_state1,
tx1,
block1,
witness_db=chaindb1,
)
access_logs1 = computation.vm_state.access_logs

# Check if prev_headers hasn't been changed
assert parent_header.hash == prev_headers[0].hash

for key, value in enumerate(access_logs1.writes):
chaindb1.db[key] = value
# Make sure that block1 hasn't been changed
assert block1.header.state_root == initial_state_root

vm_state1 = FrontierVMState(
chaindb=BaseChainDB(MemoryDB()),
chaindb=chaindb1,
block_header=block.header,
prev_headers=prev_headers,
receipts=computation.vm_state.receipts,
Expand All @@ -139,7 +137,6 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811
vm_state1,
tx2,
block,
witness_db=computation.vm_state.chaindb,
)
access_logs2 = computation.vm_state.access_logs
post_vm_state = computation.vm_state
Expand All @@ -158,12 +155,8 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811
assert block.header.transaction_root == result_block.header.transaction_root
assert block.header.receipt_root == result_block.header.receipt_root

# Make sure that block1 hasn't been changed
assert block1.header.state_root == initial_state_root

# Make sure that vm_state1 hasn't been changed
assert post_vm_state.block_header.state_root == result_block.header.state_root
assert post_vm_state.block_header.state_root != vm_state1.block_header.state_root

# (3) Testing using witness as db data
# Witness_db
Expand All @@ -187,7 +180,6 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811
vm_state2,
tx1,
block2,
witness_db=witness_db,
)

# Update witness_db
Expand All @@ -196,7 +188,7 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811

# Apply the second transaction
vm_state2 = FrontierVMState(
chaindb=BaseChainDB(MemoryDB()),
chaindb=witness_db,
block_header=block.header,
prev_headers=prev_headers,
receipts=computation.vm_state.receipts,
Expand All @@ -205,7 +197,6 @@ def test_apply_transaction(chain_without_block_validation): # noqa: F811
vm_state2,
tx2,
block,
witness_db=witness_db,
)

# After applying
Expand Down

0 comments on commit 81b4b1a

Please sign in to comment.