diff options
author | Martin Holst Swende <martin@swende.se> | 2018-08-12 20:47:03 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2018-09-18 18:08:32 +0800 |
commit | caa2c23a38141911a570ba098a940b4fdbf0aa88 (patch) | |
tree | df85df9790ac43a17d16b08538eb6c629efb7af7 /core/vm/gas_table.go | |
parent | 58374e28d95c03d8b0e6d9035c0fb92fad3e865e (diff) | |
download | go-tangerine-caa2c23a38141911a570ba098a940b4fdbf0aa88.tar go-tangerine-caa2c23a38141911a570ba098a940b4fdbf0aa88.tar.gz go-tangerine-caa2c23a38141911a570ba098a940b4fdbf0aa88.tar.bz2 go-tangerine-caa2c23a38141911a570ba098a940b4fdbf0aa88.tar.lz go-tangerine-caa2c23a38141911a570ba098a940b4fdbf0aa88.tar.xz go-tangerine-caa2c23a38141911a570ba098a940b4fdbf0aa88.tar.zst go-tangerine-caa2c23a38141911a570ba098a940b4fdbf0aa88.zip |
core,state: finish implementing Eip 1283
Diffstat (limited to 'core/vm/gas_table.go')
-rw-r--r-- | core/vm/gas_table.go | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index aee6d6f6d..77250978d 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -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) } } |