From 840a6378e51ab68228b4ec8a74f799fb37e67afb Mon Sep 17 00:00:00 2001 From: iFA88 Date: Fri, 24 Mar 2017 23:19:37 +0100 Subject: [PATCH 1/9] trace transactions --- ethereum/config.py | 2 + ethereum/processblock.py | 11 +- ethereum/tester.py | 45 +++++-- ethereum/testutils.py | 2 +- ethereum/trace.py | 23 ++++ ethereum/vm.py | 271 ++++++++++++++++++++++++++++++--------- 6 files changed, 280 insertions(+), 74 deletions(-) create mode 100644 ethereum/trace.py diff --git a/ethereum/config.py b/ethereum/config.py index 7e0967ee2..17f4fedfc 100644 --- a/ethereum/config.py +++ b/ethereum/config.py @@ -66,6 +66,8 @@ # Anti-DoS fork ANTI_DOS_FORK_BLKNUM=2457000, CLEARING_FORK_BLKNUM=2 ** 98, + # Trace + TRACE_TRANSACTIONS=True ) assert default_config['NEPHEW_REWARD'] == \ default_config['BLOCK_REWARD'] // 32 diff --git a/ethereum/processblock.py b/ethereum/processblock.py index d688b4e09..91dfb8768 100644 --- a/ethereum/processblock.py +++ b/ethereum/processblock.py @@ -8,6 +8,7 @@ from ethereum import specials from ethereum import bloom from ethereum import vm as vm +from ethereum.trace import Trace from ethereum.exceptions import InvalidNonce, InsufficientStartGas, UnsignedTransaction, \ BlockGasLimitReached, InsufficientBalance, VerificationFailed from ethereum.utils import safe_ord, normalize_address, mk_contract_address, \ @@ -17,11 +18,12 @@ sys.setrecursionlimit(100000) -from ethereum.slogging import get_logger +from ethereum.slogging import get_logger, configure log_tx = get_logger('eth.pb.tx') log_msg = get_logger('eth.pb.msg') log_state = get_logger('eth.pb.msg.state') + TT255 = 2 ** 255 TT256 = 2 ** 256 TT256M1 = 2 ** 256 - 1 @@ -163,7 +165,7 @@ def rp(what, actual, target): block.delta_balance(tx.sender, -tx.startgas * tx.gasprice) message_gas = tx.startgas - intrinsic_gas message_data = vm.CallData([safe_ord(x) for x in tx.data], 0, len(tx.data)) - message = vm.Message(tx.sender, tx.to, tx.value, message_gas, message_data, code_address=tx.to) + message = vm.Message(tx.hash, tx.sender, tx.to, tx.value, message_gas, message_data, code_address=tx.to) # MESSAGE ext = VMExt(block, tx) @@ -282,7 +284,7 @@ def _apply_msg(ext, msg, code): if msg.code_address in specials.specials: res, gas, dat = specials.specials[msg.code_address](ext, msg) else: - res, gas, dat = vm.vm_execute(ext, msg, code) + res, gas, dat, trc = vm.vm_execute(ext, msg, code) # gas = int(gas) # assert utils.is_numeric(gas) if trace_msg: @@ -299,6 +301,9 @@ def _apply_msg(ext, msg, code): if res == 0: log_msg.debug('REVERTING') ext._block.revert(snapshot) + + if trc: + Trace.addTrace(msg.hash, trc) return res, gas, dat diff --git a/ethereum/tester.py b/ethereum/tester.py index c8485e5ad..76eebdcf9 100644 --- a/ethereum/tester.py +++ b/ethereum/tester.py @@ -8,9 +8,10 @@ import rlp from rlp.utils import ascii_chr -from ethereum import blocks, db, opcodes, processblock, transactions +from ethereum import blocks, db, opcodes, transactions, processblock from ethereum.abi import ContractTranslator from ethereum.config import Env +from ethereum.trace import Trace from ethereum.slogging import LogRecorder from ethereum._solidity import get_solidity from ethereum.utils import to_string, sha3, privtoaddr, int_to_addr @@ -32,13 +33,38 @@ gas_limit = GAS_LIMIT gas_price = GAS_PRICE -accounts = [] -keys = [] +accounts = [ + u"6e5fd1741e45c966a76a077af9132627c07b0dc1".decode('hex'), + u"ef057953c56855f16e658bf8fd0d2e300961fc1f".decode('hex'), + u"2c284ef5a0d50dda177bd8c9fdf20610f6fdac09".decode('hex'), + u"bd3c601b59f46cc59be3446ba29c66b9182a70b6".decode('hex'), + u"e6e6033428cfc58af1585c26a823916c8120ca73".decode('hex'), + u"e2c628c146a9d40c9ed4c5c3e29cd0a609f7c6f1".decode('hex'), + u"3e2ff0583a5dec1bd3ac0f7b8d26fa96b759fe92".decode('hex'), + u"2827a89f78d70c422452528634cfe522b5c668c6".decode('hex'), + u"f56ae85523c6f4773954fe0b25ba1f52e1183689".decode('hex'), + u"7703aCa0f4ee937C3073ec80c7608B6f7cE2426B".decode('hex'), + u"153ee6aD2e7e665b8a07ff37d93271d6E5FDc6d4".decode('hex') +] +keys = [ + u"0af37c53fdc5b97bf1f84d30e84f09c84f733e467a3b26c1ce6c5d448f9d7cec".decode('hex'), + u"0d5c1bd818a4086f28314415cb375a937593efab66f8f7d2903bf2a13ed35070".decode('hex'), + u"17029bda254fdf118125741e80d2d43e8ac1ffa8cca20c51683bc0735c802e5b".decode('hex'), + u"8d2fd08f91550712ec0db96bdbb849ec88a560e200c58f05954827b2593cf9e7".decode('hex'), + u"803ae2f3b0030390092910e0f1e8ec15dbc975d6422ab2274b175c74eed589fb".decode('hex'), + u"0c71a0e6e4bf22677a5750c123aaf988270e1c4025f80d82b7a18f2efe295cbf".decode('hex'), + u"9ca1d29731e6302e3e7d7f0ebaf2b4fa48d7b7fd4f5c82f59b3983b0a2160d7e".decode('hex'), + u"e2631c2443b12abdfc5e70e3b7643f2d340eb49c6102c66835d0c7286903b009".decode('hex'), + u"f7a590340d042a107ec3c9e82f81d2301ecc5b79f959f7a09d3c7fb7ab7f1024".decode('hex'), + u"9e256901c752616c231904281333e5dd11fa48fdfd7ffac3515923b1fe60a28e".decode('hex'), + u"b10ec925fccdaf155fa0b56bd55cf6ce3cc8927b304c0a563476529d925755d5".decode('hex') +] + languages = {} -for account_number in range(10): - keys.append(sha3(to_string(account_number))) - accounts.append(privtoaddr(keys[-1])) +#for account_number in range(10): +# keys.append(sha3(to_string(account_number))) +# accounts.append(privtoaddr(keys[-1])) k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 = keys[:10] a0, a1, a2, a3, a4, a5, a6, a7, a8, a9 = accounts[:10] @@ -157,13 +183,13 @@ def kall(self, *args, **kwargs): class state(object): - def __init__(self, num_accounts=len(keys)): self.temp_data_dir = tempfile.mkdtemp() self.db = db.EphemDB() self.env = Env(self.db) + self.trace = Trace(self.db) self.last_tx = None - + initial_balances = {} for i in range(num_accounts): @@ -186,6 +212,9 @@ def __init__(self, num_accounts=len(keys)): def __del__(self): shutil.rmtree(self.temp_data_dir) + def getTrace(self, tx_hash): + return self.trace.getTrace(tx_hash); + def contract(self, sourcecode, sender=DEFAULT_KEY, endowment=0, # pylint: disable=too-many-arguments language='serpent', libraries=None, path=None, constructor_call=None, **kwargs): diff --git a/ethereum/testutils.py b/ethereum/testutils.py index c0888d5a6..b28427749 100644 --- a/ethereum/testutils.py +++ b/ethereum/testutils.py @@ -220,7 +220,7 @@ def blkhash(n): time_pre = time.time() if profiler: profiler.enable() - success, gas_remained, output = vm.vm_execute(ext, msg, code) + success, gas_remained, output, trc = vm.vm_execute(ext, msg, code) if profiler: profiler.disable() pb.apply_msg = orig_apply_msg diff --git a/ethereum/trace.py b/ethereum/trace.py new file mode 100644 index 000000000..ee4bd0079 --- /dev/null +++ b/ethereum/trace.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from ethereum.config import Env +from ethereum.db import BaseDB +from ethereum import config + + +class Trace(object): + def __init__(self, db): + assert isinstance(db, BaseDB) + self.db = db + self.transactions = {} + self.enabled = config.default_config['TRACE_TRANSACTIONS'] + def getTrace(self, tx_hash): + if not self.enabled: raise Exception('Trace transaction is disabled!') + if tx_hash in self.transactions: + return self.transactions[tx_hash] + else: + raise Exception('Transaction not found!') + def addTrace(self, tx_hash, tx_trace): + if self.enabled: + tx_hash = tx_hash.encode('hex') + if tx_hash.lower()[:2] != "0x": tx_hash = "0x"+tx_hash + self.transactions[tx_hash] = tx_trace diff --git a/ethereum/vm.py b/ethereum/vm.py index 6f88973aa..876f73b1a 100644 --- a/ethereum/vm.py +++ b/ethereum/vm.py @@ -5,12 +5,13 @@ # ###################################### import sys import copy +import json from ethereum import utils from ethereum import opcodes from ethereum.slogging import get_logger from rlp.utils import ascii_chr -from ethereum.utils import encode_hex from ethereum.utils import to_string +from ethereum import config if sys.version_info.major == 2: from repoze.lru import lru_cache @@ -28,7 +29,6 @@ TT256M1 = 2 ** 256 - 1 TT255 = 2 ** 255 - class CallData(object): def __init__(self, parent_memory, offset=0, size=None): @@ -58,8 +58,9 @@ def extract_copy(self, mem, memstart, datastart, size): class Message(object): - def __init__(self, sender, to, value, gas, data, depth=0, + def __init__(self, hash, sender, to, value, gas, data, depth=0, code_address=None, is_create=False, transfers_value=True): + self.hash = hash self.sender = sender self.to = to self.value = value @@ -167,7 +168,7 @@ def peaceful_exit(cause, gas, data, **kargs): def vm_execute(ext, msg, code): # precompute trace flag # if we trace vm, we're in slow mode anyway - trace_vm = log_vm_op.is_active('trace') + trace_vm = log_vm_op.is_active('trace') or config.default_config["TRACE_TRANSACTIONS"] compustate = Compustate(gas=msg.gas) stk = compustate.stack @@ -179,29 +180,60 @@ def vm_execute(ext, msg, code): op = None steps = 0 _prevop = None # for trace only - - while 1: + traceData = None + + if trace_vm: + from ethereum.utils import encode_int256, int_to_bytes, bytearray_to_bytestr + def long_to_evm(data): + return encode_int256(data).encode('hex')[-64:] + def int_byteslen(data): + return len(int_to_bytes(data)) + def split_mem(data): + text = bytemem_to_hex(data) + return [text[i*64:(i+1)*64] for i in range(0,len(text)//64)] + def bytemem_to_hex(data): + return bytearray_to_bytestr(data).encode('hex') + traceData = { + "gas":compustate.gas, + "returnValue":"", + "structLogs":[] + } + err = "" + data = None + gas = None + while err == "": # stack size limit error if compustate.pc >= codelen: - return peaceful_exit('CODE OUT OF RANGE', compustate.gas, []) + err = "CODE OUT OF RANGE" + gas = compustate.gas + data = [] + peaceful_exit('CODE OUT OF RANGE', compustate.gas, []) + break op, in_args, out_args, fee, opcode, pushval = \ processed_code[compustate.pc] # out of gas error if fee > compustate.gas: - return vm_exception('OUT OF GAS') + err = "OUT OF GAS" + vm_exception('OUT OF GAS') + break + #return vm_exception('OUT OF GAS') # empty stack error if in_args > len(compustate.stack): - return vm_exception('INSUFFICIENT STACK', + err = "INSUFFICIENT STACK" + vm_exception('INSUFFICIENT STACK', op=op, needed=to_string(in_args), available=to_string(len(compustate.stack))) + break if len(compustate.stack) - in_args + out_args > 1024: - return vm_exception('STACK SIZE LIMIT EXCEEDED', + err = "STACK SIZE LIMIT EXCEEDED" + vm_exception('STACK SIZE LIMIT EXCEEDED', op=op, pre_height=to_string(len(compustate.stack))) + break # Apply operation compustate.gas -= fee @@ -214,43 +246,40 @@ def vm_execute(ext, msg, code): i.e. tracing can not be activated by activating a sub like 'eth.vm.op.stack' """ - trace_data = {} - trace_data['stack'] = list(map(to_string, list(compustate.stack))) - if _prevop in ('MLOAD', 'MSTORE', 'MSTORE8', 'SHA3', 'CALL', - 'CALLCODE', 'CREATE', 'CALLDATACOPY', 'CODECOPY', - 'EXTCODECOPY'): - if len(compustate.memory) < 1024: - trace_data['memory'] = \ - b''.join([encode_hex(ascii_chr(x)) for x - in compustate.memory]) - else: - trace_data['sha3memory'] = \ - encode_hex(utils.sha3(''.join([ascii_chr(x) for - x in compustate.memory]))) + trace_data = { "error": None, "gasCost":fee, "memory": None, "stack":[], "storage":{} } + trace_data['stack'] = list(map(long_to_evm, list(compustate.stack))) + trace_data['memory'] = split_mem(compustate.memory) if _prevop in ('SSTORE', 'SLOAD') or steps == 0: trace_data['storage'] = ext.log_storage(msg.to) trace_data['gas'] = to_string(compustate.gas + fee) - trace_data['inst'] = opcode trace_data['pc'] = to_string(compustate.pc - 1) if steps == 0: - trace_data['depth'] = msg.depth - trace_data['address'] = msg.to + trace_data['depth'] = msg.depth+1 + else: + trace_data["depth"] = traceData["structLogs"][-1]["depth"] trace_data['op'] = op trace_data['steps'] = steps if op[:4] == 'PUSH': - trace_data['pushvalue'] = pushval - log_vm_op.trace('vm', **trace_data) + trace_data['op'] = "PUSH"+str(int_byteslen(pushval)) steps += 1 _prevop = op # Invalid operation if op == 'INVALID': - return vm_exception('INVALID OP', opcode=opcode) + err = "INVALID OP" + vm_exception('INVALID OP', opcode=opcode) + if trace_vm: traceData["structLogs"].append(trace_data) + break # Valid operations if opcode < 0x10: if op == 'STOP': - return peaceful_exit('STOP', compustate.gas, []) + err = "STOP" + gas = compustate.gas + data = [] + peaceful_exit('STOP', compustate.gas, []) + if trace_vm: traceData["structLogs"].append(trace_data) + break elif op == 'ADD': stk.append((stk.pop() + stk.pop()) & TT256M1) elif op == 'SUB': @@ -285,7 +314,10 @@ def vm_execute(ext, msg, code): expfee = nbytes * opcodes.GEXPONENTBYTE if compustate.gas < expfee: compustate.gas = 0 - return vm_exception('OOG EXPONENT') + err = "OOG EXPONENT" + vm_exception('OOG EXPONENT') + if trace_vm: traceData["structLogs"].append(trace_data) + break compustate.gas -= expfee stk.append(pow(base, exponent, TT256)) elif op == 'SIGNEXTEND': @@ -332,9 +364,15 @@ def vm_execute(ext, msg, code): s0, s1 = stk.pop(), stk.pop() compustate.gas -= opcodes.GSHA3WORD * (utils.ceil32(s1) // 32) if compustate.gas < 0: - return vm_exception('OOG PAYING FOR SHA3') + err = "OOG PAYING FOR SHA3" + vm_exception('OOG PAYING FOR SHA3') + if trace_vm: traceData["structLogs"].append(trace_data) + break if not mem_extend(mem, compustate, op, s0, s1): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break data = b''.join(map(ascii_chr, mem[s0: s0 + s1])) stk.append(utils.big_endian_to_int(utils.sha3(data))) elif op == 'ADDRESS': @@ -343,7 +381,10 @@ def vm_execute(ext, msg, code): # EIP150: Increase the gas cost of BALANCE to 400 if ext.post_anti_dos_hardfork: if not eat_gas(compustate, opcodes.BALANCE_SUPPLEMENTAL_GAS): - return vm_exception("OUT OF GAS") + err = "OUT OF GAS" + vm_exception("OUT OF GAS") + if trace_vm: traceData["structLogs"].append(trace_data) + break addr = utils.coerce_addr_to_hex(stk.pop() % 2 ** 160) stk.append(ext.get_balance(addr)) elif op == 'ORIGIN': @@ -359,18 +400,30 @@ def vm_execute(ext, msg, code): elif op == 'CALLDATACOPY': mstart, dstart, size = stk.pop(), stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, mstart, size): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break if not data_copy(compustate, size): - return vm_exception('OOG COPY DATA') + err = "OOG COPY DATA" + vm_exception('OOG COPY DATA') + if trace_vm: traceData["structLogs"].append(trace_data) + break msg.data.extract_copy(mem, mstart, dstart, size) elif op == 'CODESIZE': stk.append(len(processed_code)) elif op == 'CODECOPY': start, s1, size = stk.pop(), stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, start, size): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break if not data_copy(compustate, size): - return vm_exception('OOG COPY DATA') + err = "OOG COPY DATA" + vm_exception('OOG COPY DATA') + if trace_vm: traceData["structLogs"].append(trace_data) + break for i in range(size): if s1 + i < len(processed_code): mem[start + i] = processed_code[s1 + i][4] @@ -382,22 +435,33 @@ def vm_execute(ext, msg, code): # EIP150: Increase the gas cost of EXTCODESIZE to 700 if ext.post_anti_dos_hardfork: if not eat_gas(compustate, opcodes.EXTCODELOAD_SUPPLEMENTAL_GAS): - return vm_exception("OUT OF GAS") + err = "OUT OF GAS" + vm_exception("OUT OF GAS") + if trace_vm: traceData["structLogs"].append(trace_data) + break addr = utils.coerce_addr_to_hex(stk.pop() % 2 ** 160) stk.append(len(ext.get_code(addr) or b'')) elif op == 'EXTCODECOPY': # EIP150: Increase the base gas cost of EXTCODECOPY to 700 if ext.post_anti_dos_hardfork: if not eat_gas(compustate, opcodes.EXTCODELOAD_SUPPLEMENTAL_GAS): - return vm_exception("OUT OF GAS") + err = "OUT OF GAS" + vm_exception("OUT OF GAS") + if trace_vm: traceData["structLogs"].append(trace_data) + break addr = utils.coerce_addr_to_hex(stk.pop() % 2 ** 160) start, s2, size = stk.pop(), stk.pop(), stk.pop() extcode = ext.get_code(addr) or b'' assert utils.is_string(extcode) if not mem_extend(mem, compustate, op, start, size): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break if not data_copy(compustate, size): - return vm_exception('OOG COPY DATA') + vm_exception('OOG COPY DATA') + if trace_vm: traceData["structLogs"].append(trace_data) + break for i in range(size): if s2 + i < len(extcode): mem[start + i] = utils.safe_ord(extcode[s2 + i]) @@ -422,13 +486,19 @@ def vm_execute(ext, msg, code): elif op == 'MLOAD': s0 = stk.pop() if not mem_extend(mem, compustate, op, s0, 32): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break data = b''.join(map(ascii_chr, mem[s0: s0 + 32])) stk.append(utils.big_endian_to_int(data)) elif op == 'MSTORE': s0, s1 = stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, s0, 32): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break v = s1 for i in range(31, -1, -1): mem[s0 + i] = v % 256 @@ -436,13 +506,19 @@ def vm_execute(ext, msg, code): elif op == 'MSTORE8': s0, s1 = stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, s0, 1): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break mem[s0] = s1 % 256 elif op == 'SLOAD': # EIP150: Increase the gas cost of SLOAD to 200 if ext.post_anti_dos_hardfork: if not eat_gas(compustate, opcodes.SLOAD_SUPPLEMENTAL_GAS): - return vm_exception("OUT OF GAS") + err = "OUT OF GAS" + vm_exception("OUT OF GAS") + if trace_vm: traceData["structLogs"].append(trace_data) + break stk.append(ext.get_storage_data(msg.to, stk.pop())) elif op == 'SSTORE': s0, s1 = stk.pop(), stk.pop() @@ -453,7 +529,10 @@ def vm_execute(ext, msg, code): gascost = opcodes.GSTORAGEADD if s1 else opcodes.GSTORAGEMOD refund = 0 if compustate.gas < gascost: - return vm_exception('OUT OF GAS') + err = "OUT OF GAS" + vm_exception('OUT OF GAS') + if trace_vm: traceData["structLogs"].append(trace_data) + break compustate.gas -= gascost ext.add_refund(refund) # adds neg gascost as a refund if below zero ext.set_storage_data(msg.to, s0, s1) @@ -462,7 +541,10 @@ def vm_execute(ext, msg, code): opnew = processed_code[compustate.pc][0] if \ compustate.pc < len(processed_code) else 'STOP' if opnew != 'JUMPDEST': - return vm_exception('BAD JUMPDEST') + err = "JUMPDEST" + vm_exception('BAD JUMPDEST') + if trace_vm: traceData["structLogs"].append(trace_data) + break elif op == 'JUMPI': s0, s1 = stk.pop(), stk.pop() if s1: @@ -470,7 +552,10 @@ def vm_execute(ext, msg, code): opnew = processed_code[compustate.pc][0] if \ compustate.pc < len(processed_code) else 'STOP' if opnew != 'JUMPDEST': - return vm_exception('BAD JUMPDEST') + err = "BAD JUMPDEST" + vm_exception('BAD JUMPDEST') + if trace_vm: traceData["structLogs"].append(trace_data) + break elif op == 'PC': stk.append(compustate.pc - 1) elif op == 'MSIZE': @@ -508,7 +593,10 @@ def vm_execute(ext, msg, code): topics = [stk.pop() for x in range(depth)] compustate.gas -= msz * opcodes.GLOGBYTE if not mem_extend(mem, compustate, op, mstart, msz): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break data = b''.join(map(ascii_chr, mem[mstart: mstart + msz])) ext.log(msg.to, topics, data) log_log.trace('LOG', to=msg.to, topics=topics, data=list(map(utils.safe_ord, data))) @@ -517,7 +605,10 @@ def vm_execute(ext, msg, code): elif op == 'CREATE': value, mstart, msz = stk.pop(), stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, mstart, msz): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break if ext.get_balance(msg.to) >= value and msg.depth < 1024: cd = CallData(mem, mstart, msz) ingas = compustate.gas @@ -541,7 +632,10 @@ def vm_execute(ext, msg, code): stk.pop(), stk.pop(), stk.pop(), stk.pop(), stk.pop(), stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, meminstart, meminsz) or \ not mem_extend(mem, compustate, op, memoutstart, memoutsz): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break to = utils.encode_int(to) to = ((b'\x00' * (32 - len(to))) + to)[12:] extra_gas = (not ext.account_exists(to)) * opcodes.GCALLNEWACCOUNT + \ @@ -554,11 +648,17 @@ def vm_execute(ext, msg, code): # the maximum allowed amount, call with all but one 64th of the # maximum allowed amount of gas if compustate.gas < extra_gas: - return vm_exception('OUT OF GAS', needed=extra_gas) + err = "OUT OF GAS" + vm_exception('OUT OF GAS', needed=extra_gas) + if trace_vm: traceData["structLogs"].append(trace_data) + break gas = min(gas, max_call_gas(compustate.gas - extra_gas)) else: if compustate.gas < gas + extra_gas: - return vm_exception('OUT OF GAS', needed=gas + extra_gas) + err = "OUT OF GAS" + vm_exception('OUT OF GAS', needed=gas + extra_gas) + if trace_vm: traceData["structLogs"].append(trace_data) + break submsg_gas = gas + opcodes.GSTIPEND * (value > 0) if ext.get_balance(msg.to) >= value and msg.depth < 1024: @@ -587,7 +687,10 @@ def vm_execute(ext, msg, code): value = 0 if not mem_extend(mem, compustate, op, meminstart, meminsz) or \ not mem_extend(mem, compustate, op, memoutstart, memoutsz): - return vm_exception('OOG EXTENDING MEMORY') + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break extra_gas = (value > 0) * opcodes.GCALLVALUETRANSFER + \ ext.post_anti_dos_hardfork * opcodes.CALL_SUPPLEMENTAL_GAS # ^ EIP150 Increase the gas cost of CALLCODE, DELEGATECALL to 700 @@ -597,11 +700,17 @@ def vm_execute(ext, msg, code): # the maximum allowed amount, call with all but one 64th of the # maximum allowed amount of gas if compustate.gas < extra_gas: - return vm_exception('OUT OF GAS', needed=extra_gas) + err = "OUT OF GAS" + vm_exception('OUT OF GAS', needed=extra_gas) + if trace_vm: traceData["structLogs"].append(trace_data) + break; gas = min(gas, max_call_gas(compustate.gas - extra_gas)) else: if compustate.gas < gas + extra_gas: - return vm_exception('OUT OF GAS', needed=gas + extra_gas) + err = "OUT OF GAS" + vm_exception('OUT OF GAS', needed=gas + extra_gas) + if trace_vm: traceData["structLogs"].append(trace_data) + break submsg_gas = gas + opcodes.GSTIPEND * (value > 0) if ext.get_balance(msg.to) >= value and msg.depth < 1024: @@ -613,7 +722,10 @@ def vm_execute(ext, msg, code): call_msg = Message(msg.sender, msg.to, msg.value, submsg_gas, cd, msg.depth + 1, code_address=to, transfers_value=False) elif op == 'DELEGATECALL': - return vm_exception('OPCODE INACTIVE') + err = "OPCODE INACTIVE" + vm_exception('OPCODE INACTIVE') + if trace_vm: traceData["structLogs"].append(trace_data) + break else: call_msg = Message(msg.to, msg.to, value, submsg_gas, cd, msg.depth + 1, code_address=to) @@ -631,8 +743,18 @@ def vm_execute(ext, msg, code): elif op == 'RETURN': s0, s1 = stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, s0, s1): - return vm_exception('OOG EXTENDING MEMORY') - return peaceful_exit('RETURN', compustate.gas, mem[s0: s0 + s1]) + err = "OOG EXTENDING MEMORY" + vm_exception('OOG EXTENDING MEMORY') + if trace_vm: traceData["structLogs"].append(trace_data) + break + err = "RETURN" + gas = compustate.gas + data = mem[s0: s0 + s1] + peaceful_exit('RETURN', compustate.gas, mem[s0: s0 + s1]) + if trace_vm: + traceData["returnValue"] = bytemem_to_hex(mem[s0: s0 + s1]) + traceData["structLogs"].append(trace_data) + break elif op == 'SUICIDE': to = utils.encode_int(stk.pop()) to = ((b'\x00' * (32 - len(to))) + to)[12:] @@ -644,20 +766,45 @@ def vm_execute(ext, msg, code): # ^ EIP150(1c) If SUICIDE hits a newly created account, it # triggers an additional gas cost of 25000 (similar to CALLs) if not eat_gas(compustate, extra_gas): - return vm_exception("OUT OF GAS") + err = "OUT OF GAS" + vm_exception("OUT OF GAS") + if trace_vm: traceData["structLogs"].append(trace_data) + break xfer = ext.get_balance(msg.to) ext.set_balance(to, ext.get_balance(to) + xfer) ext.set_balance(msg.to, 0) ext.add_suicide(msg.to) # print('suiciding %s %s %d' % (msg.to, to, xfer)) - return 1, compustate.gas, [] + err = "SUICIDE" + if trace_vm: traceData["structLogs"].append(trace_data) + break + #1, compustate.gas, [] # this is slow! # for a in stk: # assert is_numeric(a), (op, stk) # assert a >= 0 and a < 2**256, (a, op, stk) + # insert sub log + if trace_vm: traceData["structLogs"].append(trace_data) + + if trace_vm: + traceData["gas"] = gas + if not err in [ "RETURN", "CODE OUT OF RANGE", "STOP", "SUICIDE" ]: + # insert error + if len(traceData["structLogs"]): + # if we have + traceData["structLogs"][-1]["error"] = err + retData = { "data":json.dumps(traceData) } + log_vm_op.trace('vm', **retData) + + if err in [ "RETURN", "CODE OUT OF RANGE", "STOP" ]: + return 1, gas, data, traceData + elif err in [ "SUICIDE" ]: + return 1, compustate.gas, [], traceData + else: + return 0, 0, [], traceData class VmExtBase(): From a2e46221f175e975ba42cfbb57b488858623740f Mon Sep 17 00:00:00 2001 From: iFA88 Date: Sat, 25 Mar 2017 17:37:20 +0100 Subject: [PATCH 2/9] Trace transaction implented --- ethereum/processblock.py | 29 +++++---- ethereum/tester.py | 6 +- ethereum/trace.py | 12 ++-- ethereum/vm.py | 125 +++++++++++++++++---------------------- 4 files changed, 75 insertions(+), 97 deletions(-) diff --git a/ethereum/processblock.py b/ethereum/processblock.py index 91dfb8768..6e7dc071a 100644 --- a/ethereum/processblock.py +++ b/ethereum/processblock.py @@ -18,7 +18,7 @@ sys.setrecursionlimit(100000) -from ethereum.slogging import get_logger, configure +from ethereum.slogging import get_logger log_tx = get_logger('eth.pb.tx') log_msg = get_logger('eth.pb.msg') log_state = get_logger('eth.pb.msg.state') @@ -165,15 +165,17 @@ def rp(what, actual, target): block.delta_balance(tx.sender, -tx.startgas * tx.gasprice) message_gas = tx.startgas - intrinsic_gas message_data = vm.CallData([safe_ord(x) for x in tx.data], 0, len(tx.data)) - message = vm.Message(tx.hash, tx.sender, tx.to, tx.value, message_gas, message_data, code_address=tx.to) + message = vm.Message(tx.sender, tx.to, tx.value, message_gas, message_data, code_address=tx.to) # MESSAGE ext = VMExt(block, tx) if tx.to and tx.to != CREATE_CONTRACT_ADDRESS: - result, gas_remained, data = apply_msg(ext, message) + result, gas_remained, data, trc = apply_msg(ext, message) + #We receive bytesarray for data log_tx.debug('_res_', result=result, gas_remained=gas_remained, data=lazy_safe_encode(data)) else: # CREATE - result, gas_remained, data = create_contract(ext, message) + result, gas_remained, data, trc = create_contract(ext, message) + #We receive address for data assert utils.is_numeric(gas_remained) log_tx.debug('_create_', result=result, gas_remained=gas_remained, data=lazy_safe_encode(data)) @@ -186,6 +188,7 @@ def rp(what, actual, target): log_tx.debug('TX FAILED', reason='out of gas', startgas=tx.startgas, gas_remained=gas_remained) block.gas_used += tx.startgas + gas_used = tx.startgas block.delta_balance(block.coinbase, tx.gasprice * tx.startgas) output = b'' success = 0 @@ -216,6 +219,9 @@ def rp(what, actual, target): block.del_account(s) block.add_transaction_to_list(tx) block.logs = [] + if trc: + tr = Trace() + tr.addTrace(tx.hash.encode('hex'), { "returnValue":output, "gas":gas_used, "structLogs":trc }) return success, output @@ -302,10 +308,7 @@ def _apply_msg(ext, msg, code): log_msg.debug('REVERTING') ext._block.revert(snapshot) - if trc: - Trace.addTrace(msg.hash, trc) - - return res, gas, dat + return res, gas, dat, trc def create_contract(ext, msg): @@ -337,12 +340,12 @@ def create_contract(ext, msg): # assert not ext.get_code(msg.to) msg.data = vm.CallData([], 0, 0) snapshot = ext._block.snapshot() - res, gas, dat = _apply_msg(ext, msg, code) + res, gas, dat, trc = _apply_msg(ext, msg, code) assert utils.is_numeric(gas) if res: if not len(dat): - return 1, gas, msg.to + return 1, gas, msg.to, trc gcost = len(dat) * opcodes.GCONTRACTBYTE if gas >= gcost: gas -= gcost @@ -351,8 +354,8 @@ def create_contract(ext, msg): log_msg.debug('CONTRACT CREATION OOG', have=gas, want=gcost, block_number=ext._block.number) if ext._block.number >= ext._block.config['HOMESTEAD_FORK_BLKNUM']: ext._block.revert(snapshot) - return 0, 0, b'' + return 0, 0, b'', trc ext._block.set_code(msg.to, b''.join(map(ascii_chr, dat))) - return 1, gas, msg.to + return 1, gas, msg.to, trc else: - return 0, gas, b'' + return 0, gas, b'', trc diff --git a/ethereum/tester.py b/ethereum/tester.py index 76eebdcf9..6ecca6acb 100644 --- a/ethereum/tester.py +++ b/ethereum/tester.py @@ -11,10 +11,10 @@ from ethereum import blocks, db, opcodes, transactions, processblock from ethereum.abi import ContractTranslator from ethereum.config import Env -from ethereum.trace import Trace from ethereum.slogging import LogRecorder from ethereum._solidity import get_solidity from ethereum.utils import to_string, sha3, privtoaddr, int_to_addr +from ethereum.trace import Trace TRACE_LVL_MAP = [ ':info', @@ -187,7 +187,6 @@ def __init__(self, num_accounts=len(keys)): self.temp_data_dir = tempfile.mkdtemp() self.db = db.EphemDB() self.env = Env(self.db) - self.trace = Trace(self.db) self.last_tx = None initial_balances = {} @@ -212,9 +211,6 @@ def __init__(self, num_accounts=len(keys)): def __del__(self): shutil.rmtree(self.temp_data_dir) - def getTrace(self, tx_hash): - return self.trace.getTrace(tx_hash); - def contract(self, sourcecode, sender=DEFAULT_KEY, endowment=0, # pylint: disable=too-many-arguments language='serpent', libraries=None, path=None, constructor_call=None, **kwargs): diff --git a/ethereum/trace.py b/ethereum/trace.py index ee4bd0079..7a97d1340 100644 --- a/ethereum/trace.py +++ b/ethereum/trace.py @@ -1,15 +1,12 @@ # -*- coding: utf-8 -*- from ethereum.config import Env -from ethereum.db import BaseDB from ethereum import config - class Trace(object): - def __init__(self, db): - assert isinstance(db, BaseDB) - self.db = db - self.transactions = {} - self.enabled = config.default_config['TRACE_TRANSACTIONS'] + transactions = {} + enabled = None + def __init__(self): + self.enabled = config.default_config['TRACE_TRANSACTIONS'] def getTrace(self, tx_hash): if not self.enabled: raise Exception('Trace transaction is disabled!') if tx_hash in self.transactions: @@ -18,6 +15,5 @@ def getTrace(self, tx_hash): raise Exception('Transaction not found!') def addTrace(self, tx_hash, tx_trace): if self.enabled: - tx_hash = tx_hash.encode('hex') if tx_hash.lower()[:2] != "0x": tx_hash = "0x"+tx_hash self.transactions[tx_hash] = tx_trace diff --git a/ethereum/vm.py b/ethereum/vm.py index 876f73b1a..24a6d65c9 100644 --- a/ethereum/vm.py +++ b/ethereum/vm.py @@ -11,7 +11,7 @@ from ethereum.slogging import get_logger from rlp.utils import ascii_chr from ethereum.utils import to_string -from ethereum import config +from ethereum.trace import Trace if sys.version_info.major == 2: from repoze.lru import lru_cache @@ -58,9 +58,8 @@ def extract_copy(self, mem, memstart, datastart, size): class Message(object): - def __init__(self, hash, sender, to, value, gas, data, depth=0, + def __init__(self, sender, to, value, gas, data, depth=0, code_address=None, is_create=False, transfers_value=True): - self.hash = hash self.sender = sender self.to = to self.value = value @@ -168,7 +167,7 @@ def peaceful_exit(cause, gas, data, **kargs): def vm_execute(ext, msg, code): # precompute trace flag # if we trace vm, we're in slow mode anyway - trace_vm = log_vm_op.is_active('trace') or config.default_config["TRACE_TRANSACTIONS"] + trace_vm = log_vm_op.is_active('trace') or Trace.enabled compustate = Compustate(gas=msg.gas) stk = compustate.stack @@ -178,10 +177,10 @@ def vm_execute(ext, msg, code): codelen = len(processed_code) op = None + ret = [] steps = 0 _prevop = None # for trace only - traceData = None - + traceData = [] if trace_vm: from ethereum.utils import encode_int256, int_to_bytes, bytearray_to_bytestr def long_to_evm(data): @@ -193,11 +192,6 @@ def split_mem(data): return [text[i*64:(i+1)*64] for i in range(0,len(text)//64)] def bytemem_to_hex(data): return bytearray_to_bytestr(data).encode('hex') - traceData = { - "gas":compustate.gas, - "returnValue":"", - "structLogs":[] - } err = "" data = None gas = None @@ -212,7 +206,6 @@ def bytemem_to_hex(data): op, in_args, out_args, fee, opcode, pushval = \ processed_code[compustate.pc] - # out of gas error if fee > compustate.gas: err = "OUT OF GAS" @@ -238,7 +231,6 @@ def bytemem_to_hex(data): # Apply operation compustate.gas -= fee compustate.pc += 1 - if trace_vm: """ This diverges from normal logging, as we use the logging namespace @@ -253,24 +245,19 @@ def bytemem_to_hex(data): trace_data['storage'] = ext.log_storage(msg.to) trace_data['gas'] = to_string(compustate.gas + fee) trace_data['pc'] = to_string(compustate.pc - 1) - if steps == 0: - trace_data['depth'] = msg.depth+1 - else: - trace_data["depth"] = traceData["structLogs"][-1]["depth"] + trace_data['depth'] = msg.depth+1 trace_data['op'] = op trace_data['steps'] = steps if op[:4] == 'PUSH': trace_data['op'] = "PUSH"+str(int_byteslen(pushval)) steps += 1 _prevop = op - # Invalid operation if op == 'INVALID': err = "INVALID OP" vm_exception('INVALID OP', opcode=opcode) - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break - # Valid operations if opcode < 0x10: if op == 'STOP': @@ -278,7 +265,7 @@ def bytemem_to_hex(data): gas = compustate.gas data = [] peaceful_exit('STOP', compustate.gas, []) - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break elif op == 'ADD': stk.append((stk.pop() + stk.pop()) & TT256M1) @@ -316,7 +303,7 @@ def bytemem_to_hex(data): compustate.gas = 0 err = "OOG EXPONENT" vm_exception('OOG EXPONENT') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break compustate.gas -= expfee stk.append(pow(base, exponent, TT256)) @@ -366,12 +353,12 @@ def bytemem_to_hex(data): if compustate.gas < 0: err = "OOG PAYING FOR SHA3" vm_exception('OOG PAYING FOR SHA3') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break if not mem_extend(mem, compustate, op, s0, s1): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break data = b''.join(map(ascii_chr, mem[s0: s0 + s1])) stk.append(utils.big_endian_to_int(utils.sha3(data))) @@ -383,7 +370,7 @@ def bytemem_to_hex(data): if not eat_gas(compustate, opcodes.BALANCE_SUPPLEMENTAL_GAS): err = "OUT OF GAS" vm_exception("OUT OF GAS") - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break addr = utils.coerce_addr_to_hex(stk.pop() % 2 ** 160) stk.append(ext.get_balance(addr)) @@ -402,12 +389,12 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, mstart, size): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break if not data_copy(compustate, size): err = "OOG COPY DATA" vm_exception('OOG COPY DATA') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break msg.data.extract_copy(mem, mstart, dstart, size) elif op == 'CODESIZE': @@ -417,12 +404,12 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, start, size): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break if not data_copy(compustate, size): err = "OOG COPY DATA" vm_exception('OOG COPY DATA') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break for i in range(size): if s1 + i < len(processed_code): @@ -437,7 +424,7 @@ def bytemem_to_hex(data): if not eat_gas(compustate, opcodes.EXTCODELOAD_SUPPLEMENTAL_GAS): err = "OUT OF GAS" vm_exception("OUT OF GAS") - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break addr = utils.coerce_addr_to_hex(stk.pop() % 2 ** 160) stk.append(len(ext.get_code(addr) or b'')) @@ -447,7 +434,7 @@ def bytemem_to_hex(data): if not eat_gas(compustate, opcodes.EXTCODELOAD_SUPPLEMENTAL_GAS): err = "OUT OF GAS" vm_exception("OUT OF GAS") - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break addr = utils.coerce_addr_to_hex(stk.pop() % 2 ** 160) start, s2, size = stk.pop(), stk.pop(), stk.pop() @@ -456,11 +443,11 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, start, size): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break if not data_copy(compustate, size): vm_exception('OOG COPY DATA') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break for i in range(size): if s2 + i < len(extcode): @@ -488,7 +475,7 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, s0, 32): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break data = b''.join(map(ascii_chr, mem[s0: s0 + 32])) stk.append(utils.big_endian_to_int(data)) @@ -497,7 +484,7 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, s0, 32): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break v = s1 for i in range(31, -1, -1): @@ -508,7 +495,7 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, s0, 1): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break mem[s0] = s1 % 256 elif op == 'SLOAD': @@ -517,7 +504,7 @@ def bytemem_to_hex(data): if not eat_gas(compustate, opcodes.SLOAD_SUPPLEMENTAL_GAS): err = "OUT OF GAS" vm_exception("OUT OF GAS") - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break stk.append(ext.get_storage_data(msg.to, stk.pop())) elif op == 'SSTORE': @@ -531,7 +518,7 @@ def bytemem_to_hex(data): if compustate.gas < gascost: err = "OUT OF GAS" vm_exception('OUT OF GAS') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break compustate.gas -= gascost ext.add_refund(refund) # adds neg gascost as a refund if below zero @@ -543,7 +530,7 @@ def bytemem_to_hex(data): if opnew != 'JUMPDEST': err = "JUMPDEST" vm_exception('BAD JUMPDEST') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break elif op == 'JUMPI': s0, s1 = stk.pop(), stk.pop() @@ -554,7 +541,7 @@ def bytemem_to_hex(data): if opnew != 'JUMPDEST': err = "BAD JUMPDEST" vm_exception('BAD JUMPDEST') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break elif op == 'PC': stk.append(compustate.pc - 1) @@ -595,7 +582,7 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, mstart, msz): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break data = b''.join(map(ascii_chr, mem[mstart: mstart + msz])) ext.log(msg.to, topics, data) @@ -607,7 +594,7 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, mstart, msz): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break if ext.get_balance(msg.to) >= value and msg.depth < 1024: cd = CallData(mem, mstart, msz) @@ -627,14 +614,14 @@ def bytemem_to_hex(data): compustate.gas -= ingas else: stk.append(0) - elif op == 'CALL': + elif op == "CALL": gas, to, value, meminstart, meminsz, memoutstart, memoutsz = \ stk.pop(), stk.pop(), stk.pop(), stk.pop(), stk.pop(), stk.pop(), stk.pop() if not mem_extend(mem, compustate, op, meminstart, meminsz) or \ not mem_extend(mem, compustate, op, memoutstart, memoutsz): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break to = utils.encode_int(to) to = ((b'\x00' * (32 - len(to))) + to)[12:] @@ -650,14 +637,14 @@ def bytemem_to_hex(data): if compustate.gas < extra_gas: err = "OUT OF GAS" vm_exception('OUT OF GAS', needed=extra_gas) - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break gas = min(gas, max_call_gas(compustate.gas - extra_gas)) else: if compustate.gas < gas + extra_gas: err = "OUT OF GAS" vm_exception('OUT OF GAS', needed=gas + extra_gas) - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break submsg_gas = gas + opcodes.GSTIPEND * (value > 0) @@ -666,7 +653,8 @@ def bytemem_to_hex(data): cd = CallData(mem, meminstart, meminsz) call_msg = Message(msg.to, to, value, submsg_gas, cd, msg.depth + 1, code_address=to) - result, gas, data = ext.msg(call_msg) + result, gas, data, trace = ext.msg(call_msg) + if trace_vm: traceData.extend(trace) if result == 0: stk.append(0) else: @@ -689,7 +677,7 @@ def bytemem_to_hex(data): not mem_extend(mem, compustate, op, memoutstart, memoutsz): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break extra_gas = (value > 0) * opcodes.GCALLVALUETRANSFER + \ ext.post_anti_dos_hardfork * opcodes.CALL_SUPPLEMENTAL_GAS @@ -702,14 +690,14 @@ def bytemem_to_hex(data): if compustate.gas < extra_gas: err = "OUT OF GAS" vm_exception('OUT OF GAS', needed=extra_gas) - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break; gas = min(gas, max_call_gas(compustate.gas - extra_gas)) else: if compustate.gas < gas + extra_gas: err = "OUT OF GAS" vm_exception('OUT OF GAS', needed=gas + extra_gas) - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break submsg_gas = gas + opcodes.GSTIPEND * (value > 0) @@ -724,12 +712,13 @@ def bytemem_to_hex(data): elif op == 'DELEGATECALL': err = "OPCODE INACTIVE" vm_exception('OPCODE INACTIVE') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break else: call_msg = Message(msg.to, msg.to, value, submsg_gas, cd, msg.depth + 1, code_address=to) - result, gas, data = ext.msg(call_msg) + result, gas, data, trace = ext.msg(call_msg) + if trace_vm: traceData.extend(trace) if result == 0: stk.append(0) else: @@ -745,15 +734,13 @@ def bytemem_to_hex(data): if not mem_extend(mem, compustate, op, s0, s1): err = "OOG EXTENDING MEMORY" vm_exception('OOG EXTENDING MEMORY') - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break err = "RETURN" gas = compustate.gas - data = mem[s0: s0 + s1] - peaceful_exit('RETURN', compustate.gas, mem[s0: s0 + s1]) - if trace_vm: - traceData["returnValue"] = bytemem_to_hex(mem[s0: s0 + s1]) - traceData["structLogs"].append(trace_data) + ret = mem[s0: s0 + s1] + peaceful_exit('RETURN', compustate.gas, ret) + if trace_vm: traceData.append(trace_data) break elif op == 'SUICIDE': to = utils.encode_int(stk.pop()) @@ -768,7 +755,7 @@ def bytemem_to_hex(data): if not eat_gas(compustate, extra_gas): err = "OUT OF GAS" vm_exception("OUT OF GAS") - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break xfer = ext.get_balance(msg.to) @@ -777,7 +764,7 @@ def bytemem_to_hex(data): ext.add_suicide(msg.to) # print('suiciding %s %s %d' % (msg.to, to, xfer)) err = "SUICIDE" - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) break #1, compustate.gas, [] @@ -787,24 +774,20 @@ def bytemem_to_hex(data): # assert a >= 0 and a < 2**256, (a, op, stk) # insert sub log - if trace_vm: traceData["structLogs"].append(trace_data) + if trace_vm: traceData.append(trace_data) if trace_vm: - traceData["gas"] = gas if not err in [ "RETURN", "CODE OUT OF RANGE", "STOP", "SUICIDE" ]: # insert error - if len(traceData["structLogs"]): - # if we have - traceData["structLogs"][-1]["error"] = err - retData = { "data":json.dumps(traceData) } - log_vm_op.trace('vm', **retData) - + traceData[-1]["error"] = err + if log_vm_op.is_active('trace'): + log_vm_op.trace('vm', **traceData) if err in [ "RETURN", "CODE OUT OF RANGE", "STOP" ]: - return 1, gas, data, traceData + return 1, gas, ret, traceData elif err in [ "SUICIDE" ]: - return 1, compustate.gas, [], traceData + return 1, compustate.gas, ret, traceData else: - return 0, 0, [], traceData + return 0, 0, ret, traceData class VmExtBase(): From 595249c9d6becc5dc52a015c8db5fe55ae2fe395 Mon Sep 17 00:00:00 2001 From: iFA88 Date: Sat, 25 Mar 2017 17:48:02 +0100 Subject: [PATCH 3/9] TransactionFailed raise now returns tx hash as exception --- ethereum/tester.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/tester.py b/ethereum/tester.py index 6ecca6acb..8c4552c73 100644 --- a/ethereum/tester.py +++ b/ethereum/tester.py @@ -318,7 +318,7 @@ def _send(self, sender, to, value, evmdata='', funid=None, abi=None, # pylint: (success, output) = processblock.apply_transaction(self.block, transaction) if not success: - raise TransactionFailed() + raise TransactionFailed(transaction.hash.ecnode('hex')) out = { 'output': output, From 5718cad764dcaace74bc48055f2d01f412e66ac4 Mon Sep 17 00:00:00 2001 From: iFA88 Date: Mon, 27 Mar 2017 16:59:39 +0200 Subject: [PATCH 4/9] debug_storageAtRange parameters fix --- ethereum/processblock.py | 8 ++++++-- ethereum/trace.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ethereum/processblock.py b/ethereum/processblock.py index 6e7dc071a..578c3d6e3 100644 --- a/ethereum/processblock.py +++ b/ethereum/processblock.py @@ -169,6 +169,9 @@ def rp(what, actual, target): # MESSAGE ext = VMExt(block, tx) + tr = Trace() + if tr.enabled: + oldStorage = ext.get_storage(tx.to) if tx.to and tx.to != CREATE_CONTRACT_ADDRESS: result, gas_remained, data, trc = apply_msg(ext, message) #We receive bytesarray for data @@ -219,9 +222,9 @@ def rp(what, actual, target): block.del_account(s) block.add_transaction_to_list(tx) block.logs = [] - if trc: - tr = Trace() + if trc and tr.enabled: tr.addTrace(tx.hash.encode('hex'), { "returnValue":output, "gas":gas_used, "structLogs":trc }) + tr.addStorage(ext.block_number, tx.hash.encode('hex'), oldStorage); return success, output @@ -238,6 +241,7 @@ def __init__(self, block, tx): self.get_nonce = block.get_nonce self.set_nonce = block.set_nonce self.set_storage_data = block.set_storage_data + self.get_storage = block.get_storage self.get_storage_data = block.get_storage_data self.log_storage = lambda x: block.account_to_dict(x)['storage'] self.add_suicide = lambda x: block.suicides.append(x) diff --git a/ethereum/trace.py b/ethereum/trace.py index 7a97d1340..14256c254 100644 --- a/ethereum/trace.py +++ b/ethereum/trace.py @@ -3,17 +3,45 @@ from ethereum import config class Trace(object): + storages = {} transactions = {} enabled = None def __init__(self): self.enabled = config.default_config['TRACE_TRANSACTIONS'] + def getTrace(self, tx_hash): if not self.enabled: raise Exception('Trace transaction is disabled!') if tx_hash in self.transactions: return self.transactions[tx_hash] else: raise Exception('Transaction not found!') + def addTrace(self, tx_hash, tx_trace): if self.enabled: if tx_hash.lower()[:2] != "0x": tx_hash = "0x"+tx_hash self.transactions[tx_hash] = tx_trace + return True + return False + + def addStorage(self, block_num, tx_hash, storage): + if self.enabled: + str = {} + storage = storage.to_dict() + for a in storage: + str[a.encode('hex')] = storage[a].encode('hex') + if not block_num in self.storages: self.storages[block_num] = [] + tmp = [tx_hash in i for i in self.storages[block_num]] + if (True in tmp): + self.storages[block_num][tmp.index(True)] = str + else: + self.storages[block_num].append({ tx_hash:str }) + return True + return False + + def getStorage(self, block_num, tx_num, stor_start, stor_end, limit): + # stor_start, stor_end, limit not yet implemented + if self.enabled: + if not block_num in self.storages: raise Exception('Block not found!') + if not tx_num in self.storages[block_num]: raise Exception('TX not found!') + return { "complete": True, "storage": self.storages[block_num][tx_num] } + raise Exception('Trace is disabled!') From 16635781312009c8067b31929fcaae35fa28e5cc Mon Sep 17 00:00:00 2001 From: iFA88 Date: Mon, 27 Mar 2017 17:28:15 +0200 Subject: [PATCH 5/9] do --- ethereum/config.py | 4 ++-- ethereum/tester.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ethereum/config.py b/ethereum/config.py index 17f4fedfc..2896bc869 100644 --- a/ethereum/config.py +++ b/ethereum/config.py @@ -9,7 +9,7 @@ # Genesis block difficulty GENESIS_DIFFICULTY=131072, # Genesis block gas limit - GENESIS_GAS_LIMIT=3141592, + GENESIS_GAS_LIMIT=4712388, # Genesis block prevhash, coinbase, nonce GENESIS_PREVHASH=b'\x00' * 32, GENESIS_COINBASE=b'\x00' * 20, @@ -67,7 +67,7 @@ ANTI_DOS_FORK_BLKNUM=2457000, CLEARING_FORK_BLKNUM=2 ** 98, # Trace - TRACE_TRANSACTIONS=True + TRACE_TRANSACTIONS=False ) assert default_config['NEPHEW_REWARD'] == \ default_config['BLOCK_REWARD'] // 32 diff --git a/ethereum/tester.py b/ethereum/tester.py index 8c4552c73..0925c9ae4 100644 --- a/ethereum/tester.py +++ b/ethereum/tester.py @@ -25,8 +25,8 @@ 'eth.vm.storage:trace,eth.vm.memory:trace' ] -GAS_LIMIT = 3141592 -GAS_PRICE = 1 +GAS_LIMIT = 4712388 +GAS_PRICE = 20000000000 # pylint: disable=invalid-name From 75ea43243a595fa2454517b1e7637e3cb3f14951 Mon Sep 17 00:00:00 2001 From: iFA88 Date: Tue, 28 Mar 2017 11:38:26 +0200 Subject: [PATCH 6/9] encode typo --- ethereum/config.py | 2 +- ethereum/tester.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ethereum/config.py b/ethereum/config.py index 2896bc869..58866d0b9 100644 --- a/ethereum/config.py +++ b/ethereum/config.py @@ -67,7 +67,7 @@ ANTI_DOS_FORK_BLKNUM=2457000, CLEARING_FORK_BLKNUM=2 ** 98, # Trace - TRACE_TRANSACTIONS=False + TRACE_TRANSACTIONS=True ) assert default_config['NEPHEW_REWARD'] == \ default_config['BLOCK_REWARD'] // 32 diff --git a/ethereum/tester.py b/ethereum/tester.py index 0925c9ae4..c3e4a79dc 100644 --- a/ethereum/tester.py +++ b/ethereum/tester.py @@ -25,7 +25,7 @@ 'eth.vm.storage:trace,eth.vm.memory:trace' ] -GAS_LIMIT = 4712388 +GAS_LIMIT = 90000 GAS_PRICE = 20000000000 # pylint: disable=invalid-name @@ -318,7 +318,7 @@ def _send(self, sender, to, value, evmdata='', funid=None, abi=None, # pylint: (success, output) = processblock.apply_transaction(self.block, transaction) if not success: - raise TransactionFailed(transaction.hash.ecnode('hex')) + raise TransactionFailed(transaction.hash.encode('hex')) out = { 'output': output, From 97283a989347234b0af21661da275d3d22dd8bb6 Mon Sep 17 00:00:00 2001 From: iFA88 Date: Tue, 28 Mar 2017 17:16:04 +0200 Subject: [PATCH 7/9] VM CALL trace bug fixed, trace gas amounts fixed --- ethereum/processblock.py | 2 ++ ethereum/trace.py | 8 +++++++- ethereum/vm.py | 15 ++++++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ethereum/processblock.py b/ethereum/processblock.py index 578c3d6e3..d13ded873 100644 --- a/ethereum/processblock.py +++ b/ethereum/processblock.py @@ -223,6 +223,8 @@ def rp(what, actual, target): block.add_transaction_to_list(tx) block.logs = [] if trc and tr.enabled: + print '-'*30 + print trc tr.addTrace(tx.hash.encode('hex'), { "returnValue":output, "gas":gas_used, "structLogs":trc }) tr.addStorage(ext.block_number, tx.hash.encode('hex'), oldStorage); return success, output diff --git a/ethereum/trace.py b/ethereum/trace.py index 14256c254..82a6e06fd 100644 --- a/ethereum/trace.py +++ b/ethereum/trace.py @@ -19,7 +19,13 @@ def getTrace(self, tx_hash): def addTrace(self, tx_hash, tx_trace): if self.enabled: if tx_hash.lower()[:2] != "0x": tx_hash = "0x"+tx_hash - self.transactions[tx_hash] = tx_trace + if tx_hash in self.transactions: + # extend! + self.transactions[tx_hash]["structLogs"].extend(tx_trace["structLogs"]) + self.transactions[tx_hash]["returnValue"] = tx_trace["returnValue"] + self.transactions[tx_hash]["gas"] = tx_trace["gas"] + else: + self.transactions[tx_hash] = tx_trace return True return False diff --git a/ethereum/vm.py b/ethereum/vm.py index 24a6d65c9..76721fa6a 100644 --- a/ethereum/vm.py +++ b/ethereum/vm.py @@ -195,6 +195,7 @@ def bytemem_to_hex(data): err = "" data = None gas = None + trace_extend = None while err == "": # stack size limit error if compustate.pc >= codelen: @@ -654,7 +655,7 @@ def bytemem_to_hex(data): call_msg = Message(msg.to, to, value, submsg_gas, cd, msg.depth + 1, code_address=to) result, gas, data, trace = ext.msg(call_msg) - if trace_vm: traceData.extend(trace) + if trace_vm: trace_extend = trace if result == 0: stk.append(0) else: @@ -718,7 +719,7 @@ def bytemem_to_hex(data): call_msg = Message(msg.to, msg.to, value, submsg_gas, cd, msg.depth + 1, code_address=to) result, gas, data, trace = ext.msg(call_msg) - if trace_vm: traceData.extend(trace) + if trace_vm: trace_extend = trace if result == 0: stk.append(0) else: @@ -774,7 +775,15 @@ def bytemem_to_hex(data): # assert a >= 0 and a < 2**256, (a, op, stk) # insert sub log - if trace_vm: traceData.append(trace_data) + if trace_vm: + traceData.append(trace_data) + if trace_extend: + print '-'*200 + print traceData + traceData.append(trace_extend) + print '-'*200 + print traceData + trace_exted = None if trace_vm: if not err in [ "RETURN", "CODE OUT OF RANGE", "STOP", "SUICIDE" ]: From 1b6853a6d746910385fbb16d5582485cc7489a90 Mon Sep 17 00:00:00 2001 From: iFA88 Date: Wed, 29 Mar 2017 21:26:00 +0200 Subject: [PATCH 8/9] etc --- ethereum/processblock.py | 2 -- ethereum/tester.py | 8 ++++++-- ethereum/trace.py | 4 ++-- ethereum/vm.py | 27 +++++++++++++++------------ 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/ethereum/processblock.py b/ethereum/processblock.py index d13ded873..578c3d6e3 100644 --- a/ethereum/processblock.py +++ b/ethereum/processblock.py @@ -223,8 +223,6 @@ def rp(what, actual, target): block.add_transaction_to_list(tx) block.logs = [] if trc and tr.enabled: - print '-'*30 - print trc tr.addTrace(tx.hash.encode('hex'), { "returnValue":output, "gas":gas_used, "structLogs":trc }) tr.addStorage(ext.block_number, tx.hash.encode('hex'), oldStorage); return success, output diff --git a/ethereum/tester.py b/ethereum/tester.py index c3e4a79dc..80acd792b 100644 --- a/ethereum/tester.py +++ b/ethereum/tester.py @@ -34,6 +34,7 @@ gas_price = GAS_PRICE accounts = [ + u"ac7bebd558c734fe105d09167860b230fb0a218d".decode('hex'), u"6e5fd1741e45c966a76a077af9132627c07b0dc1".decode('hex'), u"ef057953c56855f16e658bf8fd0d2e300961fc1f".decode('hex'), u"2c284ef5a0d50dda177bd8c9fdf20610f6fdac09".decode('hex'), @@ -44,9 +45,11 @@ u"2827a89f78d70c422452528634cfe522b5c668c6".decode('hex'), u"f56ae85523c6f4773954fe0b25ba1f52e1183689".decode('hex'), u"7703aCa0f4ee937C3073ec80c7608B6f7cE2426B".decode('hex'), - u"153ee6aD2e7e665b8a07ff37d93271d6E5FDc6d4".decode('hex') + u"153ee6aD2e7e665b8a07ff37d93271d6E5FDc6d4".decode('hex'), + u"4fe1ead95d882580561b704938ecbd5cb9450ab6".decode('hex'), ] keys = [ + u"43df74be7858da13bb08c1289fe488b9843c555538dd1638203725b18a19863e".decode('hex'), u"0af37c53fdc5b97bf1f84d30e84f09c84f733e467a3b26c1ce6c5d448f9d7cec".decode('hex'), u"0d5c1bd818a4086f28314415cb375a937593efab66f8f7d2903bf2a13ed35070".decode('hex'), u"17029bda254fdf118125741e80d2d43e8ac1ffa8cca20c51683bc0735c802e5b".decode('hex'), @@ -57,7 +60,8 @@ u"e2631c2443b12abdfc5e70e3b7643f2d340eb49c6102c66835d0c7286903b009".decode('hex'), u"f7a590340d042a107ec3c9e82f81d2301ecc5b79f959f7a09d3c7fb7ab7f1024".decode('hex'), u"9e256901c752616c231904281333e5dd11fa48fdfd7ffac3515923b1fe60a28e".decode('hex'), - u"b10ec925fccdaf155fa0b56bd55cf6ce3cc8927b304c0a563476529d925755d5".decode('hex') + u"b10ec925fccdaf155fa0b56bd55cf6ce3cc8927b304c0a563476529d925755d5".decode('hex'), + u"71c52b034f6405fbabb6ad5e91997dd2ea1f43d48502e10dd47d5a4a8a02cbdf".decode('hex'), ] languages = {} diff --git a/ethereum/trace.py b/ethereum/trace.py index 82a6e06fd..8530f6204 100644 --- a/ethereum/trace.py +++ b/ethereum/trace.py @@ -44,10 +44,10 @@ def addStorage(self, block_num, tx_hash, storage): return True return False - def getStorage(self, block_num, tx_num, stor_start, stor_end, limit): + def getStorage(self, block_num, tx_num, contract_address, stor_start, stor_end, limit): # stor_start, stor_end, limit not yet implemented if self.enabled: if not block_num in self.storages: raise Exception('Block not found!') - if not tx_num in self.storages[block_num]: raise Exception('TX not found!') + if tx_num >= len(self.storages[block_num]): raise Exception('TX not found!') return { "complete": True, "storage": self.storages[block_num][tx_num] } raise Exception('Trace is disabled!') diff --git a/ethereum/vm.py b/ethereum/vm.py index 76721fa6a..5c2709560 100644 --- a/ethereum/vm.py +++ b/ethereum/vm.py @@ -239,16 +239,16 @@ def bytemem_to_hex(data): i.e. tracing can not be activated by activating a sub like 'eth.vm.op.stack' """ - trace_data = { "error": None, "gasCost":fee, "memory": None, "stack":[], "storage":{} } + trace_data = { "error": None, "gasCost":long(fee), "memory": None, "stack":[], "storage":{} } trace_data['stack'] = list(map(long_to_evm, list(compustate.stack))) trace_data['memory'] = split_mem(compustate.memory) if _prevop in ('SSTORE', 'SLOAD') or steps == 0: trace_data['storage'] = ext.log_storage(msg.to) - trace_data['gas'] = to_string(compustate.gas + fee) - trace_data['pc'] = to_string(compustate.pc - 1) + trace_data['gas'] = compustate.gas + fee + trace_data['pc'] = compustate.pc - 1 trace_data['depth'] = msg.depth+1 trace_data['op'] = op - trace_data['steps'] = steps + #trace_data['steps'] = steps if op[:4] == 'PUSH': trace_data['op'] = "PUSH"+str(int_byteslen(pushval)) steps += 1 @@ -655,7 +655,10 @@ def bytemem_to_hex(data): call_msg = Message(msg.to, to, value, submsg_gas, cd, msg.depth + 1, code_address=to) result, gas, data, trace = ext.msg(call_msg) - if trace_vm: trace_extend = trace + if trace_vm: + trace_extend = trace + trace_data["gasCost"] = submsg_gas - gas + trace_data["gas"] -= trace_data["gasCost"] if result == 0: stk.append(0) else: @@ -719,7 +722,10 @@ def bytemem_to_hex(data): call_msg = Message(msg.to, msg.to, value, submsg_gas, cd, msg.depth + 1, code_address=to) result, gas, data, trace = ext.msg(call_msg) - if trace_vm: trace_extend = trace + if trace_vm: + trace_extend = trace + trace_data["gasCost"] = submsg_gas - gas + trace_data["gas"] -= trace_data["gasCost"] if result == 0: stk.append(0) else: @@ -778,12 +784,9 @@ def bytemem_to_hex(data): if trace_vm: traceData.append(trace_data) if trace_extend: - print '-'*200 - print traceData - traceData.append(trace_extend) - print '-'*200 - print traceData - trace_exted = None + for a in trace_extend: + traceData.append(a) + trace_extend = None if trace_vm: if not err in [ "RETURN", "CODE OUT OF RANGE", "STOP", "SUICIDE" ]: From 8ad4aa020498aad5725342ecb57738a48566922e Mon Sep 17 00:00:00 2001 From: iFA Date: Thu, 24 Aug 2017 11:42:35 +0200 Subject: [PATCH 9/9] Add files via upload --- ethereum/config.py | 2 +- ethereum/tester.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ethereum/config.py b/ethereum/config.py index 58866d0b9..a52f91938 100644 --- a/ethereum/config.py +++ b/ethereum/config.py @@ -9,7 +9,7 @@ # Genesis block difficulty GENESIS_DIFFICULTY=131072, # Genesis block gas limit - GENESIS_GAS_LIMIT=4712388, + GENESIS_GAS_LIMIT=8000000, #4712388, # Genesis block prevhash, coinbase, nonce GENESIS_PREVHASH=b'\x00' * 32, GENESIS_COINBASE=b'\x00' * 20, diff --git a/ethereum/tester.py b/ethereum/tester.py index 80acd792b..b6238cc0f 100644 --- a/ethereum/tester.py +++ b/ethereum/tester.py @@ -25,7 +25,7 @@ 'eth.vm.storage:trace,eth.vm.memory:trace' ] -GAS_LIMIT = 90000 +GAS_LIMIT = 8000000 GAS_PRICE = 20000000000 # pylint: disable=invalid-name