diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 3352877c1f..fcd6274b98 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -192,8 +192,16 @@ func opSmod(instr instruction, pc *uint64, env Environment, contract *Contract, } func opExp(instr instruction, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *Stack) { - x, y := stack.pop(), stack.pop() - stack.push(U256(x.Exp(x, y, Pow256))) + base, exponent := stack.pop(), stack.pop() + result := big.NewInt(1) + for exponent.Cmp(common.Big0) != 0 { + if exponent.Bit(0) == 1 { + U256(result.Mul(result, base)) + } + U256(base.Mul(base, base)) + exponent.Rsh(exponent, 1) + } + stack.push(result) } func opSignExtend(instr instruction, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *Stack) {