aboutsummaryrefslogtreecommitdiffstats
path: root/vm
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-03-17 01:42:18 +0800
committerobscuren <geffobscura@gmail.com>2015-03-17 01:42:18 +0800
commit91b0b14845750c81466880f5f877fe3fcbd03b09 (patch)
treef765fe3f66891a566e836ea748747ddab31bca85 /vm
parentbfcd2cf132c2f1e5c1afe6d71e3d9d9dcee5017b (diff)
downloaddexon-91b0b14845750c81466880f5f877fe3fcbd03b09.tar
dexon-91b0b14845750c81466880f5f877fe3fcbd03b09.tar.gz
dexon-91b0b14845750c81466880f5f877fe3fcbd03b09.tar.bz2
dexon-91b0b14845750c81466880f5f877fe3fcbd03b09.tar.lz
dexon-91b0b14845750c81466880f5f877fe3fcbd03b09.tar.xz
dexon-91b0b14845750c81466880f5f877fe3fcbd03b09.tar.zst
dexon-91b0b14845750c81466880f5f877fe3fcbd03b09.zip
converted vm
Diffstat (limited to 'vm')
-rw-r--r--vm/context.go8
-rw-r--r--vm/environment.go12
-rw-r--r--vm/vm.go49
3 files changed, 36 insertions, 33 deletions
diff --git a/vm/context.go b/vm/context.go
index 6edde0824..93a0102d4 100644
--- a/vm/context.go
+++ b/vm/context.go
@@ -9,7 +9,7 @@ import (
type ContextRef interface {
ReturnGas(*big.Int, *big.Int)
- Address() []byte
+ Address() common.Address
SetCode([]byte)
}
@@ -18,7 +18,7 @@ type Context struct {
self ContextRef
Code []byte
- CodeAddr []byte
+ CodeAddr common.Address
value, Gas, UsedGas, Price *big.Int
@@ -100,7 +100,7 @@ func (c *Context) ReturnGas(gas, price *big.Int) {
/*
* Set / Get
*/
-func (c *Context) Address() []byte {
+func (c *Context) Address() common.Address {
return c.self.Address()
}
@@ -108,7 +108,7 @@ func (self *Context) SetCode(code []byte) {
self.Code = code
}
-func (self *Context) SetCallCode(addr, code []byte) {
+func (self *Context) SetCallCode(addr common.Address, code []byte) {
self.Code = code
self.CodeAddr = addr
}
diff --git a/vm/environment.go b/vm/environment.go
index 83faaa23e..a53411b23 100644
--- a/vm/environment.go
+++ b/vm/environment.go
@@ -12,7 +12,7 @@ import (
type Environment interface {
State() *state.StateDB
- Origin() []byte
+ Origin() common.Address
BlockNumber() *big.Int
GetHash(n uint64) []byte
Coinbase() []byte
@@ -27,9 +27,9 @@ type Environment interface {
Depth() int
SetDepth(i int)
- Call(me ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
- CallCode(me ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error)
- Create(me ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, ContextRef)
+ Call(me ContextRef, addr common.Address, data []byte, gas, price, value *big.Int) ([]byte, error)
+ CallCode(me ContextRef, addr common.Address, data []byte, gas, price, value *big.Int) ([]byte, error)
+ Create(me ContextRef, data []byte, gas, price, value *big.Int) ([]byte, error, ContextRef)
}
type Account interface {
@@ -53,13 +53,13 @@ func Transfer(from, to Account, amount *big.Int) error {
}
type Log struct {
- address []byte
+ address common.Address
topics [][]byte
data []byte
log uint64
}
-func (self *Log) Address() []byte {
+func (self *Log) Address() common.Address {
return self.address
}
diff --git a/vm/vm.go b/vm/vm.go
index 4d9e88e1a..5043babcd 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -4,8 +4,8 @@ import (
"fmt"
"math/big"
- "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/state"
)
@@ -44,7 +44,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
price = context.Price
)
- self.Printf("(%d) (%x) %x (code=%d) gas: %v (d) %x", self.env.Depth(), caller.Address()[:4], context.Address(), len(code), context.Gas, callData).Endl()
+ self.Printf("(%d) (%x) %x (code=%d) gas: %v (d) %x", self.env.Depth(), caller.Address().Bytes()[:4], context.Address(), len(code), context.Gas, callData).Endl()
if self.Recoverable {
// Recover from any require exception
@@ -62,7 +62,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
}()
}
- if p := Precompiled[string(context.CodeAddr)]; p != nil {
+ if p := Precompiled[context.CodeAddr.Str()]; p != nil {
return self.RunPrecompiled(p, callData, context)
}
@@ -394,11 +394,11 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
self.Printf(" => (%v) %x", size, data)
// 0x30 range
case ADDRESS:
- stack.push(common.BigD(context.Address()))
+ stack.push(common.Bytes2Big(context.Address().Bytes()))
self.Printf(" => %x", context.Address())
case BALANCE:
- addr := stack.pop().Bytes()
+ addr := common.BigToAddress(stack.pop())
balance := statedb.GetBalance(addr)
stack.push(balance)
@@ -407,12 +407,12 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
case ORIGIN:
origin := self.env.Origin()
- stack.push(common.BigD(origin))
+ stack.push(origin.Big())
self.Printf(" => %x", origin)
case CALLER:
caller := context.caller.Address()
- stack.push(common.BigD(caller))
+ stack.push(common.Bytes2Big(caller.Bytes()))
self.Printf(" => %x", caller)
case CALLVALUE:
@@ -464,7 +464,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
case CODESIZE, EXTCODESIZE:
var code []byte
if op == EXTCODESIZE {
- addr := stack.pop().Bytes()
+ addr := common.BigToAddress(stack.pop())
code = statedb.GetCode(addr)
} else {
@@ -478,7 +478,8 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
case CODECOPY, EXTCODECOPY:
var code []byte
if op == EXTCODECOPY {
- code = statedb.GetCode(stack.pop().Bytes())
+ addr := common.BigToAddress(stack.pop())
+ code = statedb.GetCode(addr)
} else {
code = context.Code
}
@@ -593,16 +594,18 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
self.Printf(" => [%v] 0x%x", off, val)
case SLOAD:
- loc := stack.pop()
- val := common.BigD(statedb.GetState(context.Address(), loc.Bytes()))
+ loc := common.BigToHash(stack.pop())
+ val := common.Bytes2Big(statedb.GetState(context.Address(), loc))
stack.push(val)
- self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
+ self.Printf(" {0x%x : 0x%x}", loc, val.Bytes())
case SSTORE:
- loc, val := stack.pop(), stack.pop()
- statedb.SetState(context.Address(), loc.Bytes(), val)
+ loc := common.BigToHash(stack.pop())
+ val := stack.pop()
+
+ statedb.SetState(context.Address(), loc, val)
- self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
+ self.Printf(" {0x%x : 0x%x}", loc, val.Bytes())
case JUMP:
jump(pc, stack.pop())
@@ -635,12 +638,12 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
offset, size = stack.pop(), stack.pop()
input = mem.Get(offset.Int64(), size.Int64())
gas = new(big.Int).Set(context.Gas)
- addr []byte
+ addr common.Address
)
self.Endl()
context.UseGas(context.Gas)
- ret, suberr, ref := self.env.Create(context, nil, input, gas, price, value)
+ ret, suberr, ref := self.env.Create(context, input, gas, price, value)
if suberr != nil {
stack.push(common.BigFalse)
@@ -655,7 +658,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
}
addr = ref.Address()
- stack.push(common.BigD(addr))
+ stack.push(addr.Big())
}
@@ -669,7 +672,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
// pop return size and offset
retOffset, retSize := stack.pop(), stack.pop()
- address := common.Address(addr.Bytes())
+ address := common.BigToAddress(addr)
self.Printf(" => %x", address).Endl()
// Get the arguments from the memory
@@ -707,10 +710,10 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
return context.Return(ret), nil
case SUICIDE:
- receiver := statedb.GetOrNewStateObject(stack.pop().Bytes())
+ receiver := statedb.GetOrNewStateObject(common.BigToAddress(stack.pop()))
balance := statedb.GetBalance(context.Address())
- self.Printf(" => (%x) %v", receiver.Address()[:4], balance)
+ self.Printf(" => (%x) %v", receiver.Address().Bytes()[:4], balance)
receiver.AddBalance(balance)
@@ -770,7 +773,7 @@ func (self *Vm) calculateGasAndSize(context *Context, caller ContextRef, op OpCo
var g *big.Int
y, x := stack.data[stack.len()-2], stack.data[stack.len()-1]
- val := statedb.GetState(context.Address(), x.Bytes())
+ val := statedb.GetState(context.Address(), common.BigToHash(x))
if len(val) == 0 && len(y.Bytes()) > 0 {
// 0 => non 0
g = GasStorageAdd
@@ -822,7 +825,7 @@ func (self *Vm) calculateGasAndSize(context *Context, caller ContextRef, op OpCo
gas.Add(gas, stack.data[stack.len()-1])
if op == CALL {
- if self.env.State().GetStateObject(stack.data[stack.len()-2].Bytes()) == nil {
+ if self.env.State().GetStateObject(common.BigToAddress(stack.data[stack.len()-2])) == nil {
gas.Add(gas, GasCallNewAccount)
}
}