Add multiple transactions to onchain analysis and fix suicide module

pull/666/head
Nikhil Parasaram 6 years ago
parent 47bf8a5ee8
commit fbdfddb01e
  1. 13
      mythril/analysis/modules/suicide.py
  2. 12
      mythril/laser/ethereum/svm.py

@ -3,6 +3,7 @@ from mythril.analysis.ops import *
from mythril.analysis.report import Issue from mythril.analysis.report import Issue
from mythril.analysis.swc_data import UNPROTECTED_SELFDESTRUCT from mythril.analysis.swc_data import UNPROTECTED_SELFDESTRUCT
from mythril.exceptions import UnsatError from mythril.exceptions import UnsatError
from mythril.laser.ethereum.transaction import ContractCreationTransaction
import logging import logging
@ -54,8 +55,13 @@ def _analyze_state(state, node):
description += "The remaining Ether is sent to: " + str(to) + "\n" description += "The remaining Ether is sent to: " + str(to) + "\n"
not_creator_constraints = [] not_creator_constraints = []
if len(state.world_state.transaction_sequence) > 1: if len(state.world_state.transaction_sequence) >= 1:
creator = None
if isinstance(
state.world_state.transaction_sequence[0], ContractCreationTransaction
):
creator = state.world_state.transaction_sequence[0].caller creator = state.world_state.transaction_sequence[0].caller
if creator is not None:
for transaction in state.world_state.transaction_sequence[1:]: for transaction in state.world_state.transaction_sequence[1:]:
not_creator_constraints.append( not_creator_constraints.append(
Not(Extract(159, 0, transaction.caller) == Extract(159, 0, creator)) Not(Extract(159, 0, transaction.caller) == Extract(159, 0, creator))
@ -63,6 +69,11 @@ def _analyze_state(state, node):
not_creator_constraints.append( not_creator_constraints.append(
Not(Extract(159, 0, transaction.caller) == 0) Not(Extract(159, 0, transaction.caller) == 0)
) )
else:
for transaction in state.world_state.transaction_sequence:
not_creator_constraints.append(
Not(Extract(159, 0, transaction.caller) == 0)
)
try: try:
model = solver.get_model(node.constraints + not_creator_constraints) model = solver.get_model(node.constraints + not_creator_constraints)

@ -84,7 +84,19 @@ class LaserEVM:
if main_address: if main_address:
logging.info("Starting message call transaction to {}".format(main_address)) logging.info("Starting message call transaction to {}".format(main_address))
for i in range(self.max_transaction_count):
initial_coverage = self._get_covered_instructions()
self.time = datetime.now()
logging.info(
"Starting message call transaction, iteration: {}".format(i)
)
execute_message_call(self, main_address) execute_message_call(self, main_address)
end_coverage = self._get_covered_instructions()
if end_coverage == initial_coverage:
break
elif creation_code: elif creation_code:
logging.info("Starting contract creation transaction") logging.info("Starting contract creation transaction")
created_account = execute_contract_creation( created_account = execute_contract_creation(

Loading…
Cancel
Save