Storage#
These are very important opcodes because they manipulate storage, which is very expensive.
Storage Load#
Load a word from storage given by a key and put it on the stack.
def sload(evm): 
    key = evm.stack.pop().value
    warm, value = evm.storage.load(key)
    evm.stack.push(value)
    evm.gas_dec(2100) # 100 if warm
    evm.pc += 1
Storage Store#
Get the key and the word that will be stored from the stack and store in storage.
def sstore(evm): 
    key, value = evm.stack.pop(), evm.stack.pop()
    warm, old_value = evm.storage.store(key, value)
    base_dynamic_gas = 0
    if value != old_value:
        if old_value == 0:
            base_dynamic_gas = 20000
        else:
            base_dynamic_gas = 2900
    access_cost = 100 if warm else 2100
    evm.gas_dec(base_dynamic_gas + access_cost)
    evm.pc += 1
    # TODO: do refunds