Skip to content

Commit cb382fa

Browse files
committed
Validate transactions sender before adding to pool. Closes #272
1 parent 0dfe511 commit cb382fa

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

core/transaction_pool.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package core
22

33
import (
4+
"errors"
45
"fmt"
56

67
"github.com/ethereum/go-ethereum/core/types"
@@ -9,7 +10,11 @@ import (
910
"github.com/ethereum/go-ethereum/logger"
1011
)
1112

12-
var txplogger = logger.NewLogger("TXP")
13+
var (
14+
txplogger = logger.NewLogger("TXP")
15+
16+
ErrInvalidSender = errors.New("Invalid sender")
17+
)
1318

1419
const txPoolQueueSize = 50
1520

@@ -60,22 +65,23 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
6065
return fmt.Errorf("Invalid recipient. len = %d", len(tx.To()))
6166
}
6267

68+
// Validate curve param
6369
v, _, _ := tx.Curve()
6470
if v > 28 || v < 27 {
6571
return fmt.Errorf("tx.v != (28 || 27) => %v", v)
6672
}
6773

74+
// Validate sender address
75+
senderAddr := tx.From()
76+
if senderAddr == nil || len(senderAddr) != 20 {
77+
return ErrInvalidSender
78+
}
79+
6880
/* XXX this kind of validation needs to happen elsewhere in the gui when sending txs.
6981
Other clients should do their own validation. Value transfer could throw error
7082
but doesn't necessarily invalidate the tx. Gas can still be payed for and miner
7183
can still be rewarded for their inclusion and processing.
72-
// Get the sender
73-
senderAddr := tx.From()
74-
if senderAddr == nil {
75-
return fmt.Errorf("invalid sender")
76-
}
7784
sender := pool.stateQuery.GetAccount(senderAddr)
78-
7985
totAmount := new(big.Int).Set(tx.Value())
8086
// Make sure there's enough in the sender's account. Having insufficient
8187
// funds won't invalidate this transaction but simple ignores it.

core/transaction_pool_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,13 @@ func TestRemoveInvalid(t *testing.T) {
8585
t.Error("expected pool size to be 1, is", pool.Size())
8686
}
8787
}
88+
89+
func TestInvalidSender(t *testing.T) {
90+
pool, _ := setup()
91+
tx := new(types.Transaction)
92+
tx.V = 28
93+
err := pool.ValidateTransaction(tx)
94+
if err != ErrInvalidSender {
95+
t.Error("expected %v, got %v", ErrInvalidSender, err)
96+
}
97+
}

0 commit comments

Comments
 (0)