mirror of https://github.com/ConsenSys/mythril
# Conflicts: # mythril/laser/ethereum/taint_analysis.pypull/375/head
commit
7c247e15c1
@ -0,0 +1,60 @@ |
||||
import logging |
||||
from mythril.laser.ethereum.state import GlobalState, Environment, CalldataType |
||||
from mythril.laser.ethereum.cfg import Node, Edge, JumpType |
||||
from z3 import BitVec |
||||
|
||||
|
||||
class MessageCall: |
||||
|
||||
""" Represents a call value transaction """ |
||||
def __init__(self, callee_address): |
||||
""" |
||||
Constructor for Call transaction, sets up all symbolic parameters |
||||
:param callee_address: Address of the contract that will be called |
||||
""" |
||||
self.callee_address = callee_address |
||||
self.caller = BitVec("caller", 256) |
||||
self.gas_price = BitVec("gasprice", 256) |
||||
self.call_value = BitVec("callvalue", 256) |
||||
self.origin = BitVec("origin", 256) |
||||
|
||||
self.open_states = None |
||||
|
||||
@property |
||||
def has_ran(self): |
||||
return self.open_states is not None |
||||
|
||||
def run(self, open_world_states: list, evm): |
||||
""" Runs this transaction on the evm starting from the open world states """ |
||||
# Consume the open states |
||||
open_states = open_world_states[:] |
||||
del open_world_states[:] |
||||
|
||||
for open_world_state in open_states: |
||||
|
||||
# Initialize the execution environment |
||||
environment = Environment( |
||||
open_world_state[self.callee_address], |
||||
self.caller, |
||||
[], |
||||
self.gas_price, |
||||
self.call_value, |
||||
self.origin, |
||||
calldata_type=CalldataType.SYMBOLIC, |
||||
) |
||||
|
||||
new_node = Node(environment.active_account.contract_name) |
||||
evm.instructions_covered = [False for _ in environment.code.instruction_list] |
||||
|
||||
evm.nodes[new_node.uid] = new_node |
||||
if open_world_state.node: |
||||
evm.edges.append(Edge(open_world_state.node.uid, new_node.uid, edge_type=JumpType.Transaction, condition=None)) |
||||
|
||||
global_state = GlobalState(open_world_state.accounts, environment, new_node) |
||||
new_node.states.append(global_state) |
||||
|
||||
evm.work_list.append(global_state) |
||||
|
||||
evm.exec() |
||||
logging.info("Execution complete") |
||||
logging.info("Achieved {0:.3g}% coverage".format(evm.coverage)) |
Loading…
Reference in new issue