|
|
|
@ -17,11 +17,9 @@ |
|
|
|
|
package vm |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"bytes" |
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
|
"github.com/ethereum/go-ethereum/common/math" |
|
|
|
|
"github.com/ethereum/go-ethereum/params" |
|
|
|
|
"math/big" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// memoryGasCosts calculates the quadratic gas for memory expansion. It does so
|
|
|
|
@ -117,7 +115,7 @@ func gasReturnDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack * |
|
|
|
|
return gas, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func gasSStoreOld(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { |
|
|
|
|
func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { |
|
|
|
|
var ( |
|
|
|
|
y, x = stack.Back(1), stack.Back(0) |
|
|
|
|
val = evm.StateDB.GetState(contract.Address(), common.BigToHash(x)) |
|
|
|
@ -139,10 +137,11 @@ func gasSStoreOld(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { |
|
|
|
|
// gasSStoreEip1283 calculates SSTORE gas cost according to EIP-1283
|
|
|
|
|
func gasSStoreEip1283(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { |
|
|
|
|
var ( |
|
|
|
|
y, x = stack.Back(1), stack.Back(0) |
|
|
|
|
current = evm.StateDB.GetState(contract.Address(), common.BigToHash(x)) |
|
|
|
|
y, x = stack.Back(1), stack.Back(0) |
|
|
|
|
current = evm.StateDB.GetState(contract.Address(), common.BigToHash(x)) |
|
|
|
|
) |
|
|
|
|
//1. If current value equals new value (this is a no-op), 200 gas is deducted.
|
|
|
|
|
//2. If current value does not equal new value
|
|
|
|
@ -161,33 +160,31 @@ func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, m |
|
|
|
|
// 1. current == new
|
|
|
|
|
return 200, nil |
|
|
|
|
} |
|
|
|
|
// Todo, get this value
|
|
|
|
|
original := common.Hash{} |
|
|
|
|
|
|
|
|
|
original := evm.StateDB.GetStateOriginal(contract.Address(), common.BigToHash(x)) |
|
|
|
|
// 2
|
|
|
|
|
if original == current { // 2.1
|
|
|
|
|
if original == (common.Hash{}){ // 2.1.1
|
|
|
|
|
if original == (common.Hash{}) { // 2.1.1
|
|
|
|
|
return 20000, nil |
|
|
|
|
} |
|
|
|
|
// 2.1.2
|
|
|
|
|
if new == (common.Hash{}){ |
|
|
|
|
if new == (common.Hash{}) { |
|
|
|
|
evm.StateDB.AddRefund(15000) |
|
|
|
|
} |
|
|
|
|
return 5000, nil |
|
|
|
|
} |
|
|
|
|
// 2.2
|
|
|
|
|
if original != (common.Hash{}){ // 2.2.1
|
|
|
|
|
if current == (common.Hash{}){ // 2.2.1.1
|
|
|
|
|
if original != (common.Hash{}) { // 2.2.1
|
|
|
|
|
if current == (common.Hash{}) { // 2.2.1.1
|
|
|
|
|
evm.StateDB.SubRefund(15000) |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
// 2.2.1.2
|
|
|
|
|
evm.StateDB.AddRefund(15000) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if original == new { // 2.2.2
|
|
|
|
|
if original == (common.Hash{}){ |
|
|
|
|
if original == (common.Hash{}) { |
|
|
|
|
evm.StateDB.AddRefund(19800) |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
evm.StateDB.AddRefund(4800) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|