Forráskód Böngészése

Removed some VMEnv & Added VmType() to vm.Environment

obscuren 10 éve
szülő
commit
d52878c744
6 módosított fájl, 25 hozzáadás és 184 törlés
  1. 8 4
      cmd/mist/debugger.go
  2. 0 98
      cmd/utils/vm_env.go
  3. 1 0
      tests/helper/vm.go
  4. 2 0
      vm/environment.go
  5. 0 72
      xeth/vm_env.go
  6. 14 10
      xeth/xeth.go

+ 8 - 4
cmd/mist/debugger.go

@@ -29,6 +29,7 @@ import (
 
 	"github.com/ethereum/go-ethereum/cmd/utils"
 	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/ethutil"
 	"github.com/ethereum/go-ethereum/state"
 	"github.com/ethereum/go-ethereum/vm"
@@ -154,14 +155,17 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
 
 	block := self.lib.eth.ChainManager().CurrentBlock()
 
-	env := utils.NewEnv(self.lib.eth.ChainManager(), statedb, block, account.Address(), value)
+	msg := types.NewTransactionMessage(nil, value, gas, gasPrice, data)
+	env := core.NewEnv(statedb, self.lib.eth.ChainManager(), msg, block)
 
 	self.Logf("callsize %d", len(script))
 	go func() {
+		pgas := new(big.Int).Set(gas)
 		ret, err := env.Call(account, contract.Address(), data, gas, gasPrice, ethutil.Big0)
-		//ret, g, err := callerClosure.Call(evm, data)
-		tot := new(big.Int).Mul(env.Gas, gasPrice)
-		self.Logf("gas usage %v total price = %v (%v)", env.Gas, tot, ethutil.CurrencyToString(tot))
+
+		rgas := new(big.Int).Sub(pgas, gas)
+		tot := new(big.Int).Mul(rgas, gasPrice)
+		self.Logf("gas usage %v total price = %v (%v)", rgas, tot, ethutil.CurrencyToString(tot))
 		if err != nil {
 			self.Logln("exited with errors:", err)
 		} else {

+ 0 - 98
cmd/utils/vm_env.go

@@ -1,98 +0,0 @@
-/*
-	This file is part of go-ethereum
-
-	go-ethereum is free software: you can redistribute it and/or modify
-	it under the terms of the GNU General Public License as published by
-	the Free Software Foundation, either version 3 of the License, or
-	(at your option) any later version.
-
-	go-ethereum is distributed in the hope that it will be useful,
-	but WITHOUT ANY WARRANTY; without even the implied warranty of
-	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	GNU General Public License for more details.
-
-	You should have received a copy of the GNU General Public License
-	along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>.
-*/
-/**
- * @authors
- * 	Jeffrey Wilcke <i@jev.io>
- */
-package utils
-
-import (
-	"math/big"
-
-	"github.com/ethereum/go-ethereum/core"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/state"
-	"github.com/ethereum/go-ethereum/vm"
-)
-
-type VMEnv struct {
-	chain *core.ChainManager
-	state *state.StateDB
-	block *types.Block
-
-	transactor []byte
-	value      *big.Int
-
-	depth int
-	Gas   *big.Int
-}
-
-func NewEnv(chain *core.ChainManager, state *state.StateDB, block *types.Block, transactor []byte, value *big.Int) *VMEnv {
-	return &VMEnv{
-		chain:      chain,
-		state:      state,
-		block:      block,
-		transactor: transactor,
-		value:      value,
-	}
-}
-
-func (self *VMEnv) Origin() []byte        { return self.transactor }
-func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number() }
-func (self *VMEnv) PrevHash() []byte      { return self.block.ParentHash() }
-func (self *VMEnv) Coinbase() []byte      { return self.block.Coinbase() }
-func (self *VMEnv) Time() int64           { return self.block.Time() }
-func (self *VMEnv) Difficulty() *big.Int  { return self.block.Difficulty() }
-func (self *VMEnv) GasLimit() *big.Int    { return self.block.GasLimit() }
-func (self *VMEnv) Value() *big.Int       { return self.value }
-func (self *VMEnv) State() *state.StateDB { return self.state }
-func (self *VMEnv) Depth() int            { return self.depth }
-func (self *VMEnv) SetDepth(i int)        { self.depth = i }
-func (self *VMEnv) GetHash(n uint64) []byte {
-	if block := self.chain.GetBlockByNumber(n); block != nil {
-		return block.Hash()
-	}
-
-	return nil
-}
-func (self *VMEnv) AddLog(log state.Log) {
-	self.state.AddLog(log)
-}
-func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error {
-	return vm.Transfer(from, to, amount)
-}
-
-func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution {
-	return core.NewExecution(self, addr, data, gas, price, value)
-}
-
-func (self *VMEnv) Call(caller vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
-	exe := self.vm(addr, data, gas, price, value)
-	ret, err := exe.Call(addr, caller)
-	self.Gas = exe.Gas
-
-	return ret, err
-}
-func (self *VMEnv) CallCode(caller vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
-	exe := self.vm(caller.Address(), data, gas, price, value)
-	return exe.Call(addr, caller)
-}
-
-func (self *VMEnv) Create(caller vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ContextRef) {
-	exe := self.vm(addr, data, gas, price, value)
-	return exe.Create(caller)
-}

+ 1 - 0
tests/helper/vm.go

@@ -59,6 +59,7 @@ func (self *Env) Time() int64           { return self.time }
 func (self *Env) Difficulty() *big.Int  { return self.difficulty }
 func (self *Env) State() *state.StateDB { return self.state }
 func (self *Env) GasLimit() *big.Int    { return self.gasLimit }
+func (self *Env) VmType() vm.Type       { return vm.StdVmTy }
 func (self *Env) GetHash(n uint64) []byte {
 	return crypto.Sha3([]byte(big.NewInt(int64(n)).String()))
 }

+ 2 - 0
vm/environment.go

@@ -22,6 +22,8 @@ type Environment interface {
 	Transfer(from, to Account, amount *big.Int) error
 	AddLog(state.Log)
 
+	VmType() Type
+
 	Depth() int
 	SetDepth(i int)
 

+ 0 - 72
xeth/vm_env.go

@@ -1,72 +0,0 @@
-package xeth
-
-import (
-	"math/big"
-
-	"github.com/ethereum/go-ethereum/core"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/state"
-	"github.com/ethereum/go-ethereum/vm"
-)
-
-type VMEnv struct {
-	chain  *core.ChainManager
-	state  *state.StateDB
-	block  *types.Block
-	value  *big.Int
-	sender []byte
-
-	depth int
-}
-
-func NewEnv(chain *core.ChainManager, state *state.StateDB, block *types.Block, value *big.Int, sender []byte) *VMEnv {
-	return &VMEnv{
-		state:  state,
-		block:  block,
-		value:  value,
-		sender: sender,
-	}
-}
-
-func (self *VMEnv) Origin() []byte        { return self.sender }
-func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number() }
-func (self *VMEnv) PrevHash() []byte      { return self.block.ParentHash() }
-func (self *VMEnv) Coinbase() []byte      { return self.block.Coinbase() }
-func (self *VMEnv) Time() int64           { return self.block.Time() }
-func (self *VMEnv) Difficulty() *big.Int  { return self.block.Difficulty() }
-func (self *VMEnv) GasLimit() *big.Int    { return self.block.GasLimit() }
-func (self *VMEnv) Value() *big.Int       { return self.value }
-func (self *VMEnv) State() *state.StateDB { return self.state }
-func (self *VMEnv) Depth() int            { return self.depth }
-func (self *VMEnv) SetDepth(i int)        { self.depth = i }
-func (self *VMEnv) GetHash(n uint64) []byte {
-	if block := self.chain.GetBlockByNumber(n); block != nil {
-		return block.Hash()
-	}
-
-	return nil
-}
-func (self *VMEnv) AddLog(log state.Log) {
-	self.state.AddLog(log)
-}
-func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error {
-	return vm.Transfer(from, to, amount)
-}
-
-func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *core.Execution {
-	return core.NewExecution(self, addr, data, gas, price, value)
-}
-
-func (self *VMEnv) Call(me vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
-	exe := self.vm(addr, data, gas, price, value)
-	return exe.Call(addr, me)
-}
-func (self *VMEnv) CallCode(me vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
-	exe := self.vm(me.Address(), data, gas, price, value)
-	return exe.Call(addr, me)
-}
-
-func (self *VMEnv) Create(me vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ContextRef) {
-	exe := self.vm(addr, data, gas, price, value)
-	return exe.Create(me)
-}

+ 14 - 10
xeth/xeth.go

@@ -224,18 +224,22 @@ func (self *XEth) Call(toStr, valueStr, gasStr, gasPriceStr, dataStr string) (st
 	}
 
 	var (
-		statedb   = self.chainManager.TransState()
-		initiator = state.NewStateObject(self.eth.KeyManager().KeyPair().Address(), self.eth.Db())
-		block     = self.chainManager.CurrentBlock()
-		to        = statedb.GetOrNewStateObject(fromHex(toStr))
-		data      = fromHex(dataStr)
-		gas       = ethutil.Big(gasStr)
-		price     = ethutil.Big(gasPriceStr)
-		value     = ethutil.Big(valueStr)
+		statedb = self.chainManager.TransState()
+		key     = self.eth.KeyManager().KeyPair()
+		from    = state.NewStateObject(key.Address(), self.eth.Db())
+		block   = self.chainManager.CurrentBlock()
+		to      = statedb.GetOrNewStateObject(fromHex(toStr))
+		data    = fromHex(dataStr)
+		gas     = ethutil.Big(gasStr)
+		price   = ethutil.Big(gasPriceStr)
+		value   = ethutil.Big(valueStr)
 	)
 
-	vmenv := NewEnv(self.chainManager, statedb, block, value, initiator.Address())
-	res, err := vmenv.Call(initiator, to.Address(), data, gas, price, value)
+	msg := types.NewTransactionMessage(fromHex(toStr), value, gas, price, data)
+	msg.Sign(key.PrivateKey)
+	vmenv := core.NewEnv(statedb, self.chainManager, msg, block)
+
+	res, err := vmenv.Call(from, to.Address(), data, gas, price, value)
 	if err != nil {
 		return "", err
 	}