Fixed error for invalid transaction

This commit is contained in:
obscuren 2015-03-03 16:20:38 +01:00
parent 6518da7c01
commit c74c07eed1
4 changed files with 29 additions and 12 deletions

View File

@ -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
} }

View File

@ -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 {

View File

@ -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

View File

@ -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())
} }
} }