forked from cerc-io/plugeth
Fixed error for invalid transaction
This commit is contained in:
parent
6518da7c01
commit
c74c07eed1
@ -87,6 +87,24 @@ func IsNonceErr(err error) bool {
|
|||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type InvalidTxErr struct {
|
||||||
|
Message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err *InvalidTxErr) Error() string {
|
||||||
|
return err.Message
|
||||||
|
}
|
||||||
|
|
||||||
|
func InvalidTxError(err error) *InvalidTxErr {
|
||||||
|
return &InvalidTxErr{fmt.Sprintf("%v", err)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsInvalidTxErr(err error) bool {
|
||||||
|
_, ok := err.(*InvalidTxErr)
|
||||||
|
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
type OutOfGasErr struct {
|
type OutOfGasErr struct {
|
||||||
Message string
|
Message string
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package core
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/ethutil"
|
"github.com/ethereum/go-ethereum/ethutil"
|
||||||
"github.com/ethereum/go-ethereum/state"
|
"github.com/ethereum/go-ethereum/state"
|
||||||
@ -146,7 +145,7 @@ func (self *StateTransition) preCheck() (err error) {
|
|||||||
|
|
||||||
// Pre-pay gas / Buy gas of the coinbase account
|
// Pre-pay gas / Buy gas of the coinbase account
|
||||||
if err = self.BuyGas(); err != nil {
|
if err = self.BuyGas(); err != nil {
|
||||||
return err
|
return InvalidTxError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -167,15 +166,15 @@ func (self *StateTransition) TransitionState() (ret []byte, err error) {
|
|||||||
|
|
||||||
defer self.RefundGas()
|
defer self.RefundGas()
|
||||||
|
|
||||||
|
// Transaction gas
|
||||||
|
if err = self.UseGas(vm.GasTx); err != nil {
|
||||||
|
return nil, InvalidTxError(err)
|
||||||
|
}
|
||||||
|
|
||||||
// Increment the nonce for the next transaction
|
// Increment the nonce for the next transaction
|
||||||
self.state.SetNonce(sender.Address(), sender.Nonce()+1)
|
self.state.SetNonce(sender.Address(), sender.Nonce()+1)
|
||||||
//sender.Nonce += 1
|
//sender.Nonce += 1
|
||||||
|
|
||||||
// Transaction gas
|
|
||||||
if err = self.UseGas(vm.GasTx); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pay data gas
|
// Pay data gas
|
||||||
var dgas int64
|
var dgas int64
|
||||||
for _, byt := range self.data {
|
for _, byt := range self.data {
|
||||||
|
@ -167,6 +167,7 @@ func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state.
|
|||||||
// Set pre compiled contracts
|
// Set pre compiled contracts
|
||||||
vm.Precompiled = vm.PrecompiledContracts()
|
vm.Precompiled = vm.PrecompiledContracts()
|
||||||
|
|
||||||
|
snapshot := statedb.Copy()
|
||||||
coinbase := statedb.GetOrNewStateObject(caddr)
|
coinbase := statedb.GetOrNewStateObject(caddr)
|
||||||
coinbase.SetGasPool(ethutil.Big(env["currentGasLimit"]))
|
coinbase.SetGasPool(ethutil.Big(env["currentGasLimit"]))
|
||||||
|
|
||||||
@ -175,6 +176,9 @@ func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state.
|
|||||||
st := core.NewStateTransition(vmenv, message, coinbase)
|
st := core.NewStateTransition(vmenv, message, coinbase)
|
||||||
vmenv.origin = keyPair.Address()
|
vmenv.origin = keyPair.Address()
|
||||||
ret, err := st.TransitionState()
|
ret, err := st.TransitionState()
|
||||||
|
if core.IsNonceErr(err) || core.IsInvalidTxErr(err) {
|
||||||
|
statedb.Set(snapshot)
|
||||||
|
}
|
||||||
statedb.Update(vmenv.Gas)
|
statedb.Update(vmenv.Gas)
|
||||||
|
|
||||||
return ret, vmenv.logs, vmenv.Gas, err
|
return ret, vmenv.logs, vmenv.Gas, err
|
||||||
|
@ -79,10 +79,6 @@ func RunVmTest(p string, t *testing.T) {
|
|||||||
helper.CreateFileTests(t, p, &tests)
|
helper.CreateFileTests(t, p, &tests)
|
||||||
|
|
||||||
for name, test := range tests {
|
for name, test := range tests {
|
||||||
helper.Logger.SetLogLevel(4)
|
|
||||||
if name != "callcodeToNameRegistratorAddresTooBigRight" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
db, _ := ethdb.NewMemDatabase()
|
db, _ := ethdb.NewMemDatabase()
|
||||||
statedb := state.New(nil, db)
|
statedb := state.New(nil, db)
|
||||||
for addr, account := range test.Pre {
|
for addr, account := range test.Pre {
|
||||||
@ -161,7 +157,7 @@ func RunVmTest(p string, t *testing.T) {
|
|||||||
|
|
||||||
if !isVmTest {
|
if !isVmTest {
|
||||||
if !bytes.Equal(ethutil.Hex2Bytes(test.PostStateRoot), statedb.Root()) {
|
if !bytes.Equal(ethutil.Hex2Bytes(test.PostStateRoot), statedb.Root()) {
|
||||||
//t.Errorf("%s's : Post state root error. Expected %s, got %x", name, test.PostStateRoot, statedb.Root())
|
t.Errorf("%s's : Post state root error. Expected %s, got %x", name, test.PostStateRoot, statedb.Root())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user