Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 1872a28

Browse files
committed
Implemented most of RETURNDATACOPY and RETURNDATASIZE
1 parent f6bc14c commit 1872a28

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

ethereum/vm.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ def __init__(self, **kwargs):
8585
self.stack = []
8686
self.pc = 0
8787
self.gas = 0
88+
self.last_returned = bytearray()
8889
for kw in kwargs:
8990
setattr(self, kw, kwargs[kw])
9091

@@ -381,16 +382,27 @@ def vm_execute(ext, msg, code):
381382
elif op == 'CODESIZE':
382383
stk.append(len(processed_code))
383384
elif op == 'CODECOPY':
384-
start, s1, size = stk.pop(), stk.pop(), stk.pop()
385-
if not mem_extend(mem, compustate, op, start, size):
385+
mstart, dstart, size = stk.pop(), stk.pop(), stk.pop()
386+
if not mem_extend(mem, compustate, op, mstart, size):
386387
return vm_exception('OOG EXTENDING MEMORY')
387388
if not data_copy(compustate, size):
388389
return vm_exception('OOG COPY DATA')
389390
for i in range(size):
390-
if s1 + i < len(processed_code):
391-
mem[start + i] = processed_code[s1 + i][4]
391+
if dstart + i < len(processed_code):
392+
mem[mstart + i] = processed_code[dstart + i][4]
392393
else:
393-
mem[start + i] = 0
394+
mem[mstart + i] = 0
395+
elif op == 'RETURNDATACOPY':
396+
mstart, dstart, size = stk.pop(), stk.pop(), stk.pop()
397+
if not mem_extend(mem, compustate, op, mstart, size):
398+
return vm_exception('OOG EXTENDING MEMORY')
399+
if not data_copy(compustate, size):
400+
return vm_exception('OOG COPY DATA')
401+
if dstart + size > len(compustate.last_returned):
402+
return vm_exception('RETURNDATACOPY out of range')
403+
mem[mstart: mstart + size] = compustate.last_returned
404+
elif op == 'RETURNDATASIZE':
405+
stk.append(len(compustate.last_returned))
394406
elif op == 'GASPRICE':
395407
stk.append(ext.tx_gasprice)
396408
elif op == 'EXTCODESIZE':
@@ -614,6 +626,7 @@ def vm_execute(ext, msg, code):
614626
for i in range(min(len(data), memoutsz)):
615627
mem[memoutstart + i] = data[i]
616628
compustate.gas += gas
629+
compustate.last_returned = bytearray(data)
617630
elif op == 'RETURN':
618631
s0, s1 = stk.pop(), stk.pop()
619632
if not mem_extend(mem, compustate, op, s0, s1):

0 commit comments

Comments
 (0)