12
12
import time
13
13
from ethereum .slogging import get_logger
14
14
from rlp .utils import encode_hex , ascii_chr
15
- from ethereum .utils import to_string
15
+ from ethereum .utils import to_string , encode_int , zpad
16
16
17
17
log_log = get_logger ('eth.vm.log' )
18
18
log_vm_exit = get_logger ('eth.vm.exit' )
@@ -435,7 +435,7 @@ def vm_execute(ext, msg, code):
435
435
return vm_exception ('OUT OF GAS' )
436
436
compustate .gas -= gascost
437
437
ext .add_refund (refund ) # adds neg gascost as a refund if below zero
438
- ext .set_storage_data (msg .to , s0 , s1 )
438
+ ext .set_storage_data (msg .to , s0 , zpad ( encode_int ( s1 ), 32 ) )
439
439
elif op == 'JUMP' :
440
440
compustate .pc = stk .pop ()
441
441
opnew = processed_code [compustate .pc ][0 ] if \
@@ -456,6 +456,37 @@ def vm_execute(ext, msg, code):
456
456
stk .append (len (mem ))
457
457
elif op == 'GAS' :
458
458
stk .append (compustate .gas ) # AFTER subtracting cost 1
459
+ elif 0xe0 <= opcode < 0xef :
460
+ if not ext .post_metropolis_hardfork ():
461
+ return vm_exception ('OPCODE RANGE INACTIVE' , opcode = opcode )
462
+ if op == 'SLOADBYTES' :
463
+ key , mstart , msize = stk .pop (), stk .pop (), stk .pop ()
464
+ bytez = map (ord , ext .get_storage_bytes (msg .to , key ))
465
+ if not mem_extend (mem , compustate , op , mstart , min (msize , mstart + len (bytez ))):
466
+ return vm_exception ('OOG EXTENDING MEMORY' )
467
+ for i in range (min (msize , len (bytez ))):
468
+ mem [mstart + i ] = bytez [i ]
469
+ stk .append (ext .get_storage_data (msg .to , stk .pop ()))
470
+ elif op == 'SSTOREBYTES' :
471
+ key , mstart , msize = stk .pop (), stk .pop (), stk .pop ()
472
+ if not mem_extend (mem , compustate , op , mstart , min (msize , mstart + len (bytez ))):
473
+ return vm_exception ('OOG EXTENDING MEMORY' )
474
+ prev_adjbyte_count = len (ext .get_storage_data (msg .to , key ))
475
+ if prev_adjbyte_count >= 0 :
476
+ prev_adjbyte_count += 32
477
+ post_adjbyte_count = msize + (32 if msize else 0 )
478
+ gas_cost = opcodes .GSTORAGEBASE + opcodes .GSTORAGEBYTESTORAGE * \
479
+ (post_adjbyte_count - prev_adjbyte_count ) + opcodes .GSTORAGEBYTECHANGE * post_adjbyte_count
480
+ gas_payment = max (opcodes .GSTORAGEMIN , gas_cost )
481
+ refund = gas_payment - gas_cost
482
+ if compustate .gas < gas_payment :
483
+ return vm_exception ('OUT OF GAS' )
484
+ compustate .gas -= gas_payment
485
+ data = '' .join (map (chr , mem [mstart : mstart + msize ]))
486
+ ext .set_storage_data (msg .to , data )
487
+ ext .add_refund (refund )
488
+ elif op == 'SSIZE' :
489
+ stk .append (len (ext .get_storage_bytes (msg .to , stk .pop ())))
459
490
elif op [:4 ] == 'PUSH' :
460
491
pushnum = int (op [4 :])
461
492
compustate .pc += pushnum
0 commit comments