mirror of https://github.com/status-im/op-geth.git
Fixed bug in stack to expand beyond expectations. Fixed EQ and NOT opcode
This commit is contained in:
parent
6625b6ffbd
commit
205e33bc83
|
@ -173,21 +173,25 @@ func NewStack() *Stack {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *Stack) Pop() *big.Int {
|
func (st *Stack) Pop() *big.Int {
|
||||||
str := st.data[0]
|
str := st.data[len(st.data)-1]
|
||||||
st.data = st.data[1:]
|
|
||||||
|
copy(st.data[:len(st.data)-1], st.data[:len(st.data)-1])
|
||||||
|
st.data = st.data[:len(st.data)-1]
|
||||||
|
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *Stack) Popn() (*big.Int, *big.Int) {
|
func (st *Stack) Popn() (*big.Int, *big.Int) {
|
||||||
ints := st.data[:2]
|
ints := st.data[len(st.data)-2:]
|
||||||
st.data = st.data[2:]
|
|
||||||
|
copy(st.data[:len(st.data)-2], st.data[:len(st.data)-2])
|
||||||
|
st.data = st.data[:len(st.data)-2]
|
||||||
|
|
||||||
return ints[0], ints[1]
|
return ints[0], ints[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *Stack) Peek() *big.Int {
|
func (st *Stack) Peek() *big.Int {
|
||||||
str := st.data[0]
|
str := st.data[len(st.data)-1]
|
||||||
|
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package ethchain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "bytes"
|
_ "bytes"
|
||||||
_ "fmt"
|
"fmt"
|
||||||
"github.com/ethereum/eth-go/ethutil"
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
_ "github.com/obscuren/secp256k1-go"
|
_ "github.com/obscuren/secp256k1-go"
|
||||||
_ "math"
|
_ "math"
|
||||||
|
@ -213,10 +213,17 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
||||||
} else {
|
} else {
|
||||||
stack.Push(ethutil.BigFalse)
|
stack.Push(ethutil.BigFalse)
|
||||||
}
|
}
|
||||||
case oNOT:
|
case oEQ:
|
||||||
x, y := stack.Popn()
|
x, y := stack.Popn()
|
||||||
// x != y
|
// x == y
|
||||||
if x.Cmp(y) != 0 {
|
if x.Cmp(y) == 0 {
|
||||||
|
stack.Push(ethutil.BigTrue)
|
||||||
|
} else {
|
||||||
|
stack.Push(ethutil.BigFalse)
|
||||||
|
}
|
||||||
|
case oNOT:
|
||||||
|
x := stack.Pop()
|
||||||
|
if x.Cmp(ethutil.BigFalse) == 0 {
|
||||||
stack.Push(ethutil.BigTrue)
|
stack.Push(ethutil.BigTrue)
|
||||||
} else {
|
} else {
|
||||||
stack.Push(ethutil.BigFalse)
|
stack.Push(ethutil.BigFalse)
|
||||||
|
@ -300,8 +307,8 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
||||||
case oJUMP:
|
case oJUMP:
|
||||||
pc = stack.Pop()
|
pc = stack.Pop()
|
||||||
case oJUMPI:
|
case oJUMPI:
|
||||||
pos, cond := stack.Popn()
|
cond, pos := stack.Popn()
|
||||||
if cond.Cmp(big.NewInt(0)) > 0 {
|
if cond.Cmp(ethutil.BigTrue) == 0 {
|
||||||
pc = pos
|
pc = pos
|
||||||
}
|
}
|
||||||
case oPC:
|
case oPC:
|
||||||
|
@ -314,6 +321,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
||||||
retSize, retOffset := stack.Popn()
|
retSize, retOffset := stack.Popn()
|
||||||
// Pop input size and offset
|
// Pop input size and offset
|
||||||
inSize, inOffset := stack.Popn()
|
inSize, inOffset := stack.Popn()
|
||||||
|
fmt.Println(inSize, inOffset)
|
||||||
// Get the arguments from the memory
|
// Get the arguments from the memory
|
||||||
args := mem.Get(inOffset.Int64(), inSize.Int64())
|
args := mem.Get(inOffset.Int64(), inSize.Int64())
|
||||||
// Pop gas and value of the stack.
|
// Pop gas and value of the stack.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package ethchain
|
package ethchain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
_ "bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/ethereum/eth-go/ethdb"
|
"github.com/ethereum/eth-go/ethdb"
|
||||||
"github.com/ethereum/eth-go/ethutil"
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
|
@ -11,6 +11,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
func TestRun3(t *testing.T) {
|
func TestRun3(t *testing.T) {
|
||||||
ethutil.ReadConfig("")
|
ethutil.ReadConfig("")
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ func TestRun3(t *testing.T) {
|
||||||
if bytes.Compare(ret, exp) != 0 {
|
if bytes.Compare(ret, exp) != 0 {
|
||||||
t.Errorf("expected return value to be %v, got %v", exp, ret)
|
t.Errorf("expected return value to be %v, got %v", exp, ret)
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
func TestRun4(t *testing.T) {
|
func TestRun4(t *testing.T) {
|
||||||
ethutil.ReadConfig("")
|
ethutil.ReadConfig("")
|
||||||
|
@ -81,17 +82,13 @@ func TestRun4(t *testing.T) {
|
||||||
db, _ := ethdb.NewMemDatabase()
|
db, _ := ethdb.NewMemDatabase()
|
||||||
state := NewState(ethutil.NewTrie(db, ""))
|
state := NewState(ethutil.NewTrie(db, ""))
|
||||||
|
|
||||||
mutan.Compile(strings.NewReader(`
|
|
||||||
a = 1337
|
|
||||||
c = 1
|
|
||||||
store[0] = 50
|
|
||||||
d = store[0]
|
|
||||||
`), false)
|
|
||||||
|
|
||||||
asm, err := mutan.Compile(strings.NewReader(`
|
asm, err := mutan.Compile(strings.NewReader(`
|
||||||
a = 3 + 3
|
a = 10
|
||||||
store[1000] = a
|
b = 10
|
||||||
store[1000]
|
if a == b {
|
||||||
|
b = 1000
|
||||||
|
c = 10
|
||||||
|
}
|
||||||
`), false)
|
`), false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
|
|
Loading…
Reference in New Issue