Merge pull request #1395 from Gustav-Simonsson/fix_core_errors_in_apply_txs

Fix core errors in apply txs
This commit is contained in:
Jeffrey Wilcke 2015-07-06 01:51:14 -07:00
commit 46e7c8512e
7 changed files with 10 additions and 54 deletions

View File

@ -9,6 +9,7 @@ import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger"
@ -72,7 +73,7 @@ func (self *BlockProcessor) ApplyTransaction(coinbase *state.StateObject, stated
cb := statedb.GetStateObject(coinbase.Address()) cb := statedb.GetStateObject(coinbase.Address())
_, gas, err := ApplyMessage(NewEnv(statedb, self.bc, tx, header), tx, cb) _, gas, err := ApplyMessage(NewEnv(statedb, self.bc, tx, header), tx, cb)
if err != nil && (IsNonceErr(err) || state.IsGasLimitErr(err) || IsInvalidTxErr(err)) { if err != nil && err != vm.OutOfGasError {
return nil, nil, err return nil, nil, err
} }
@ -118,7 +119,7 @@ func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, state
statedb.StartRecord(tx.Hash(), block.Hash(), i) statedb.StartRecord(tx.Hash(), block.Hash(), i)
receipt, txGas, err := self.ApplyTransaction(coinbase, statedb, header, tx, totalUsedGas, transientProcess) receipt, txGas, err := self.ApplyTransaction(coinbase, statedb, header, tx, totalUsedGas, transientProcess)
if err != nil && (IsNonceErr(err) || state.IsGasLimitErr(err) || IsInvalidTxErr(err)) { if err != nil && err != vm.OutOfGasError {
return nil, err return nil, err
} }

View File

@ -30,7 +30,6 @@ func ParentError(hash common.Hash) error {
func IsParentErr(err error) bool { func IsParentErr(err error) bool {
_, ok := err.(*ParentErr) _, ok := err.(*ParentErr)
return ok return ok
} }
@ -48,7 +47,6 @@ func UncleError(format string, v ...interface{}) error {
func IsUncleErr(err error) bool { func IsUncleErr(err error) bool {
_, ok := err.(*UncleErr) _, ok := err.(*UncleErr)
return ok return ok
} }
@ -67,7 +65,6 @@ func ValidationError(format string, v ...interface{}) *ValidationErr {
func IsValidationErr(err error) bool { func IsValidationErr(err error) bool {
_, ok := err.(*ValidationErr) _, ok := err.(*ValidationErr)
return ok return ok
} }
@ -86,7 +83,6 @@ func NonceError(is, exp uint64) *NonceErr {
func IsNonceErr(err error) bool { func IsNonceErr(err error) bool {
_, ok := err.(*NonceErr) _, ok := err.(*NonceErr)
return ok return ok
} }
@ -121,24 +117,6 @@ func InvalidTxError(err error) *InvalidTxErr {
func IsInvalidTxErr(err error) bool { func IsInvalidTxErr(err error) bool {
_, ok := err.(*InvalidTxErr) _, ok := err.(*InvalidTxErr)
return ok
}
type OutOfGasErr struct {
Message string
}
func OutOfGasError() *OutOfGasErr {
return &OutOfGasErr{Message: "Out of gas"}
}
func (self *OutOfGasErr) Error() string {
return self.Message
}
func IsOutOfGasErr(err error) bool {
_, ok := err.(*OutOfGasErr)
return ok return ok
} }

View File

@ -53,7 +53,7 @@ func (self *Execution) exec(contextAddr *common.Address, code []byte, caller vm.
if env.Depth() > int(params.CallCreateDepth.Int64()) { if env.Depth() > int(params.CallCreateDepth.Int64()) {
caller.ReturnGas(self.Gas, self.price) caller.ReturnGas(self.Gas, self.price)
return nil, vm.DepthError{} return nil, vm.DepthError
} }
vsnapshot := env.State().Copy() vsnapshot := env.State().Copy()

View File

@ -122,7 +122,7 @@ func (self *StateTransition) To() *state.StateObject {
func (self *StateTransition) UseGas(amount *big.Int) error { func (self *StateTransition) UseGas(amount *big.Int) error {
if self.gas.Cmp(amount) < 0 { if self.gas.Cmp(amount) < 0 {
return OutOfGasError() return vm.OutOfGasError
} }
self.gas.Sub(self.gas, amount) self.gas.Sub(self.gas, amount)

View File

@ -1,21 +1,14 @@
package vm package vm
import ( import (
"errors"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params"
) )
type OutOfGasError struct{} var OutOfGasError = errors.New("Out of gas")
var DepthError = fmt.Errorf("Max call depth exceeded (%d)", params.CallCreateDepth)
func (self OutOfGasError) Error() string {
return "Out Of Gas"
}
func IsOOGErr(err error) bool {
_, ok := err.(OutOfGasError)
return ok
}
type StackError struct { type StackError struct {
req, has int req, has int
@ -33,14 +26,3 @@ func IsStack(err error) bool {
_, ok := err.(StackError) _, ok := err.(StackError)
return ok return ok
} }
type DepthError struct{}
func (self DepthError) Error() string {
return fmt.Sprintf("Max call depth exceeded (%d)", params.CallCreateDepth)
}
func IsDepthErr(err error) bool {
_, ok := err.(DepthError)
return ok
}

View File

@ -116,7 +116,7 @@ func (self *Vm) Run(context *Context, input []byte) (ret []byte, err error) {
context.UseGas(context.Gas) context.UseGas(context.Gas)
return context.Return(nil), OutOfGasError{} return context.Return(nil), OutOfGasError
} }
// Resize the memory calculated previously // Resize the memory calculated previously
mem.Resize(newMemSize.Uint64()) mem.Resize(newMemSize.Uint64())
@ -789,7 +789,7 @@ func (self *Vm) RunPrecompiled(p *PrecompiledAccount, input []byte, context *Con
return context.Return(ret), nil return context.Return(ret), nil
} else { } else {
return nil, OutOfGasError{} return nil, OutOfGasError
} }
} }

View File

@ -20,11 +20,6 @@ var (
BlockSkipTests = []string{ BlockSkipTests = []string{
"SimpleTx3", "SimpleTx3",
// these panic in block_processor.go:84 , see https://github.com/ethereum/go-ethereum/issues/1384
"TRANSCT_rvalue_TooShort",
"TRANSCT_rvalue_TooLarge",
"TRANSCT_svalue_TooLarge",
// TODO: check why these fail // TODO: check why these fail
"BLOCK__RandomByteAtTheEnd", "BLOCK__RandomByteAtTheEnd",
"TRANSCT__RandomByteAtTheEnd", "TRANSCT__RandomByteAtTheEnd",