diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-08-16 17:39:31 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-16 17:39:31 +0800 |
commit | 76069eef38082089d2eaf99661a80e1a953bf271 (patch) | |
tree | 62f21e54348e436ea7e9f387101266d848b0b36d /core/vm/gas_table.go | |
parent | 30402430427854b61e9836850d6163554c4c667d (diff) | |
parent | 3df7142b3e2804aa7ccf88cc0c2663861ebfa3b9 (diff) | |
download | dexon-76069eef38082089d2eaf99661a80e1a953bf271.tar dexon-76069eef38082089d2eaf99661a80e1a953bf271.tar.gz dexon-76069eef38082089d2eaf99661a80e1a953bf271.tar.bz2 dexon-76069eef38082089d2eaf99661a80e1a953bf271.tar.lz dexon-76069eef38082089d2eaf99661a80e1a953bf271.tar.xz dexon-76069eef38082089d2eaf99661a80e1a953bf271.tar.zst dexon-76069eef38082089d2eaf99661a80e1a953bf271.zip |
Merge pull request #14978 from karalabe/metropolis-staticcall
core/vm: implement metropolis static call opcode
Diffstat (limited to 'core/vm/gas_table.go')
-rw-r--r-- | core/vm/gas_table.go | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 761ca4450..8a6c2741d 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -423,6 +423,33 @@ func gasDelegateCall(gt params.GasTable, evm *EVM, contract *Contract, stack *St return gas, nil } +func gasStaticCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + var overflow bool + if gas, overflow = math.SafeAdd(gas, gt.Calls); overflow { + return 0, errGasUintOverflow + } + + cg, err := callGas(gt, contract.Gas, gas, stack.Back(0)) + if err != nil { + return 0, err + } + // Replace the stack item with the new gas calculation. This means that + // either the original item is left on the stack or the item is replaced by: + // (availableGas - gas) * 63 / 64 + // We replace the stack item so that it's available when the opCall instruction is + // called. + stack.data[stack.len()-1] = new(big.Int).SetUint64(cg) + + if gas, overflow = math.SafeAdd(gas, cg); overflow { + return 0, errGasUintOverflow + } + return gas, nil +} + func gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return GasFastestStep, nil } |