aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/blocks.go1
-rw-r--r--core/vm/disasm.go21
-rw-r--r--core/vm/memory.go8
-rw-r--r--core/vm/vm.go18
4 files changed, 27 insertions, 21 deletions
diff --git a/core/blocks.go b/core/blocks.go
index b26e8f6ee..d09242a07 100644
--- a/core/blocks.go
+++ b/core/blocks.go
@@ -4,4 +4,5 @@ import "github.com/ethereum/go-ethereum/common"
var badHashes = []common.Hash{
common.HexToHash("f269c503aed286caaa0d114d6a5320e70abbc2febe37953207e76a2873f2ba79"),
+ common.HexToHash("38f5bbbffd74804820ffa4bab0cd540e9de229725afb98c1a7e57936f4a714bc"),
}
diff --git a/core/vm/disasm.go b/core/vm/disasm.go
new file mode 100644
index 000000000..858ee684a
--- /dev/null
+++ b/core/vm/disasm.go
@@ -0,0 +1,21 @@
+package vm
+
+import "fmt"
+
+func Disasm(code []byte) []string {
+ var out []string
+ for pc := uint64(0); pc < uint64(len(code)); pc++ {
+ op := OpCode(code[pc])
+ out = append(out, op.String())
+
+ switch op {
+ case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
+ a := uint64(op) - uint64(PUSH1) + 1
+ out = append(out, fmt.Sprintf("0x%x", code[pc+1:pc+1+a]))
+
+ pc += a
+ }
+ }
+
+ return out
+}
diff --git a/core/vm/memory.go b/core/vm/memory.go
index d20aa9591..ea2ee80fb 100644
--- a/core/vm/memory.go
+++ b/core/vm/memory.go
@@ -1,10 +1,6 @@
package vm
-import (
- "fmt"
-
- "github.com/ethereum/go-ethereum/common"
-)
+import "fmt"
type Memory struct {
store []byte
@@ -24,7 +20,7 @@ func (m *Memory) Set(offset, size uint64, value []byte) {
// It's possible the offset is greater than 0 and size equals 0. This is because
// the calcMemSize (common.go) could potentially return 0 when size is zero (NO-OP)
if size > 0 {
- copy(m.store[offset:offset+size], common.RightPadBytes(value, int(size)))
+ copy(m.store[offset:offset+size], value)
}
}
diff --git a/core/vm/vm.go b/core/vm/vm.go
index 35fa19d03..6db99bdcc 100644
--- a/core/vm/vm.go
+++ b/core/vm/vm.go
@@ -128,7 +128,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
mem.Resize(newMemSize.Uint64())
switch op {
- // 0x20 range
case ADD:
x, y := stack.pop(), stack.pop()
self.Printf(" %v + %v", y, x)
@@ -142,7 +141,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
stack.push(base)
case SUB:
x, y := stack.pop(), stack.pop()
- self.Printf(" %v - %v", y, x)
+ self.Printf(" %v - %v", x, y)
base.Sub(x, y)
@@ -268,9 +267,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
}
case NOT:
stack.push(U256(new(big.Int).Not(stack.pop())))
- //base.Sub(Pow256, stack.pop()).Sub(base, common.Big1)
- //base = U256(base)
- //stack.push(base)
case LT:
x, y := stack.pop(), stack.pop()
self.Printf(" %v < %v", x, y)
@@ -329,7 +325,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
stack.push(common.BigTrue)
}
- // 0x10 range
case AND:
x, y := stack.pop(), stack.pop()
self.Printf(" %v & %v", y, x)
@@ -390,7 +385,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
stack.push(base)
- // 0x20 range
case SHA3:
offset, size := stack.pop(), stack.pop()
data := crypto.Sha3(mem.Get(offset.Int64(), size.Int64()))
@@ -398,7 +392,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
stack.push(common.BigD(data))
self.Printf(" => (%v) %x", size, data)
- // 0x30 range
case ADDRESS:
stack.push(common.Bytes2Big(context.Address().Bytes()))
@@ -486,7 +479,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
self.Printf(" => %x", context.Price)
- // 0x40 range
case BLOCKHASH:
num := stack.pop()
@@ -527,7 +519,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
stack.push(self.env.GasLimit())
- // 0x50 range
case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
a := big.NewInt(int64(op - PUSH1 + 1))
byts := getData(code, new(big.Int).Add(pc, big.NewInt(1)), a)
@@ -553,12 +544,11 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
topics := make([]common.Hash, n)
mStart, mSize := stack.pop(), stack.pop()
for i := 0; i < n; i++ {
- topics[i] = common.BigToHash(stack.pop()) //common.LeftPadBytes(stack.pop().Bytes(), 32)
+ topics[i] = common.BigToHash(stack.pop())
}
data := mem.Get(mStart.Int64(), mSize.Int64())
log := state.NewLog(context.Address(), topics, data, self.env.BlockNumber().Uint64())
- //log := &Log{context.Address(), topics, data, self.env.BlockNumber().Uint64()}
self.env.AddLog(log)
self.Printf(" => %v", log)
@@ -568,7 +558,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
stack.push(val)
self.Printf(" => 0x%x", val.Bytes())
- case MSTORE: // Store the value at stack top-1 in to memory at location stack top
+ case MSTORE:
// pop value of the stack
mStart, val := stack.pop(), stack.pop()
mem.Set(mStart.Uint64(), 32, common.BigToBytes(val, 256))
@@ -614,7 +604,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
case JUMPDEST:
case PC:
- //stack.push(big.NewInt(int64(pc)))
stack.push(pc)
case MSIZE:
stack.push(big.NewInt(int64(mem.Len())))
@@ -622,7 +611,6 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
stack.push(context.Gas)
self.Printf(" => %x", context.Gas)
- // 0x60 range
case CREATE:
var (