Fixed bug in stack to expand beyond expectations. Fixed EQ and NOT opcode

This commit is contained in:
obscuren 2014-03-30 18:55:51 +02:00
parent 6625b6ffbd
commit 205e33bc83
3 changed files with 32 additions and 23 deletions

View File

@ -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
} }

View File

@ -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.

View File

@ -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)