Add multiple transactions to onchain analysis and fix suicide module

pull/666/head
Nikhil Parasaram 6 years ago
parent 47bf8a5ee8
commit fbdfddb01e
  1. 29
      mythril/analysis/modules/suicide.py
  2. 14
      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,15 +55,25 @@ 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 = state.world_state.transaction_sequence[0].caller creator = None
for transaction in state.world_state.transaction_sequence[1:]: if isinstance(
not_creator_constraints.append( state.world_state.transaction_sequence[0], ContractCreationTransaction
Not(Extract(159, 0, transaction.caller) == Extract(159, 0, creator)) ):
) creator = state.world_state.transaction_sequence[0].caller
not_creator_constraints.append( if creator is not None:
Not(Extract(159, 0, transaction.caller) == 0) for transaction in state.world_state.transaction_sequence[1:]:
) not_creator_constraints.append(
Not(Extract(159, 0, transaction.caller) == Extract(159, 0, creator))
)
not_creator_constraints.append(
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))
execute_message_call(self, 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)
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