瀏覽代碼

Validate transactions sender before adding to pool. Closes #272

obscuren 10 年之前
父節點
當前提交
cb382fa76b
共有 2 個文件被更改,包括 23 次插入7 次删除
  1. 13 7
      core/transaction_pool.go
  2. 10 0
      core/transaction_pool_test.go

+ 13 - 7
core/transaction_pool.go

@@ -1,6 +1,7 @@
 package core
 
 import (
+	"errors"
 	"fmt"
 
 	"github.com/ethereum/go-ethereum/core/types"
@@ -9,7 +10,11 @@ import (
 	"github.com/ethereum/go-ethereum/logger"
 )
 
-var txplogger = logger.NewLogger("TXP")
+var (
+	txplogger = logger.NewLogger("TXP")
+
+	ErrInvalidSender = errors.New("Invalid sender")
+)
 
 const txPoolQueueSize = 50
 
@@ -60,22 +65,23 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
 		return fmt.Errorf("Invalid recipient. len = %d", len(tx.To()))
 	}
 
+	// Validate curve param
 	v, _, _ := tx.Curve()
 	if v > 28 || v < 27 {
 		return fmt.Errorf("tx.v != (28 || 27) => %v", v)
 	}
 
+	// Validate sender address
+	senderAddr := tx.From()
+	if senderAddr == nil || len(senderAddr) != 20 {
+		return ErrInvalidSender
+	}
+
 	/* XXX this kind of validation needs to happen elsewhere in the gui when sending txs.
 	   Other clients should do their own validation. Value transfer could throw error
 	   but doesn't necessarily invalidate the tx. Gas can still be payed for and miner
 	   can still be rewarded for their inclusion and processing.
-	// Get the sender
-	senderAddr := tx.From()
-	if senderAddr == nil {
-		return fmt.Errorf("invalid sender")
-	}
 	sender := pool.stateQuery.GetAccount(senderAddr)
-
 	totAmount := new(big.Int).Set(tx.Value())
 	// Make sure there's enough in the sender's account. Having insufficient
 	// funds won't invalidate this transaction but simple ignores it.

+ 10 - 0
core/transaction_pool_test.go

@@ -85,3 +85,13 @@ func TestRemoveInvalid(t *testing.T) {
 		t.Error("expected pool size to be 1, is", pool.Size())
 	}
 }
+
+func TestInvalidSender(t *testing.T) {
+	pool, _ := setup()
+	tx := new(types.Transaction)
+	tx.V = 28
+	err := pool.ValidateTransaction(tx)
+	if err != ErrInvalidSender {
+		t.Error("expected %v, got %v", ErrInvalidSender, err)
+	}
+}