aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/gas_table.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2017-08-16 17:39:31 +0800
committerGitHub <noreply@github.com>2017-08-16 17:39:31 +0800
commit76069eef38082089d2eaf99661a80e1a953bf271 (patch)
tree62f21e54348e436ea7e9f387101266d848b0b36d /core/vm/gas_table.go
parent30402430427854b61e9836850d6163554c4c667d (diff)
parent3df7142b3e2804aa7ccf88cc0c2663861ebfa3b9 (diff)
downloaddexon-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.go27
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
}