mirror of https://github.com/ConsenSys/mythril
blockchainethereumsmart-contractssoliditysecurityprogram-analysissecurity-analysissymbolic-execution
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
3.2 KiB
73 lines
3.2 KiB
from mythril.disassembler.disassembly import Disassembly
|
|
from mythril.laser.ethereum.cfg import Node
|
|
from mythril.laser.ethereum.state.environment import Environment
|
|
from mythril.laser.ethereum.state.machine_state import MachineState
|
|
from mythril.laser.ethereum.state.global_state import GlobalState
|
|
from mythril.laser.ethereum.state.world_state import WorldState
|
|
from mythril.laser.ethereum.instructions import Instruction
|
|
from mythril.laser.ethereum.transaction.transaction_models import MessageCallTransaction
|
|
from mythril.laser.ethereum.state.calldata import ConcreteCalldata
|
|
from mythril.laser.ethereum.svm import LaserEVM
|
|
from mythril.laser.smt import symbol_factory
|
|
|
|
# contract A {
|
|
# uint256 public val = 10;
|
|
# }
|
|
contract_init_code = "6080604052600a600055348015601457600080fd5b506084806100236000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633c6bb43614602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000548156fea265627a7a72315820d3cfe7a909450a953cbd7e47d8c17477f2609baa5208d043e965efec69d1ed9864736f6c634300050b0032"
|
|
contract_runtime_code = "6080604052348015600f57600080fd5b506004361060285760003560e01c80633c6bb43614602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000548156fea265627a7a72315820d3cfe7a909450a953cbd7e47d8c17477f2609baa5208d043e965efec69d1ed9864736f6c634300050b0032"
|
|
|
|
last_state = None
|
|
created_contract_account = None
|
|
|
|
|
|
def execute_create():
|
|
global last_state
|
|
global created_contract_account
|
|
if not last_state and not created_contract_account:
|
|
code_raw = []
|
|
for i in range(len(contract_init_code) // 2):
|
|
code_raw.append(int(contract_init_code[2 * i : 2 * (i + 1)], 16))
|
|
calldata = ConcreteCalldata(0, code_raw)
|
|
|
|
world_state = WorldState()
|
|
world_state.node = Node("Contract")
|
|
account = world_state.create_account(balance=1000000, address=101)
|
|
account.code = Disassembly("60a760006000f000")
|
|
environment = Environment(account, None, calldata, None, None, None)
|
|
og_state = GlobalState(
|
|
world_state, environment, world_state.node, MachineState(gas_limit=8000000)
|
|
)
|
|
og_state.transaction_stack.append(
|
|
(MessageCallTransaction(world_state=WorldState(), gas_limit=8000000), None)
|
|
)
|
|
|
|
laser = LaserEVM()
|
|
states = [og_state]
|
|
last_state = og_state
|
|
for state in states:
|
|
new_states, op_code = laser.execute_state(state)
|
|
last_state = state
|
|
if op_code == "STOP":
|
|
break
|
|
states.extend(new_states)
|
|
|
|
created_contract_address = last_state.mstate.stack[-1].value
|
|
created_contract_account = last_state.world_state.accounts[
|
|
created_contract_address
|
|
]
|
|
|
|
return last_state, created_contract_account
|
|
|
|
|
|
def test_create_has_code():
|
|
last_state, created_contract_account = execute_create()
|
|
assert created_contract_account.code.bytecode == contract_runtime_code
|
|
|
|
|
|
def test_create_has_storage():
|
|
last_state, created_contract_account = execute_create()
|
|
storage = created_contract_account.storage
|
|
# From contract, val = 10.
|
|
assert storage[symbol_factory.BitVecVal(0, 256)] == symbol_factory.BitVecVal(
|
|
10, 256
|
|
)
|
|
|