forked from cerc-io/plugeth
Fix core error forwarding, unify OOG VM err
This commit is contained in:
parent
9c3db1be1d
commit
0f04af5916
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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",
|
||||||
|
Loading…
Reference in New Issue
Block a user