Quellcode durchsuchen

core: check negative value transactions. Closes #1109

obscuren vor 10 Jahren
Ursprung
Commit
c37389f19c
4 geänderte Dateien mit 20 neuen und 2 gelöschten Zeilen
  1. 1 1
      core/chain_manager.go
  2. 5 0
      core/transaction_pool.go
  3. 14 0
      core/transaction_pool_test.go
  4. 0 1
      eth/sync.go

+ 1 - 1
core/chain_manager.go

@@ -750,7 +750,7 @@ out:
 
 func blockErr(block *types.Block, err error) {
 	h := block.Header()
-	glog.V(logger.Error).Infof("INVALID block #%v (%x)\n", h.Number, h.Hash().Bytes())
+	glog.V(logger.Error).Infof("Bad block #%v (%x)\n", h.Number, h.Hash().Bytes())
 	glog.V(logger.Error).Infoln(err)
 	glog.V(logger.Debug).Infoln(block)
 }

+ 5 - 0
core/transaction_pool.go

@@ -25,6 +25,7 @@ var (
 	ErrInsufficientFunds  = errors.New("Insufficient funds for gas * price + value")
 	ErrIntrinsicGas       = errors.New("Intrinsic gas too low")
 	ErrGasLimit           = errors.New("Exceeds block gas limit")
+	ErrNegativeValue      = errors.New("Negative value")
 )
 
 const txPoolQueueSize = 50
@@ -125,6 +126,10 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
 		return ErrGasLimit
 	}
 
+	if tx.Amount.Cmp(common.Big0) < 0 {
+		return ErrNegativeValue
+	}
+
 	total := new(big.Int).Mul(tx.Price, tx.GasLimit)
 	total.Add(total, tx.Value())
 	if pool.currentState().GetBalance(from).Cmp(total) < 0 {

+ 14 - 0
core/transaction_pool_test.go

@@ -138,3 +138,17 @@ func TestRemoveTx(t *testing.T) {
 		t.Error("expected txs to be 0, got", len(pool.txs))
 	}
 }
+
+func TestNegativeValue(t *testing.T) {
+	pool, key := setupTxPool()
+
+	tx := transaction()
+	tx.Value().Set(big.NewInt(-1))
+	tx.SignECDSA(key)
+	from, _ := tx.From()
+	pool.currentState().AddBalance(from, big.NewInt(1))
+	err := pool.Add(tx)
+	if err != ErrNegativeValue {
+		t.Error("expected", ErrNegativeValue, "got", err)
+	}
+}

+ 0 - 1
eth/sync.go

@@ -70,7 +70,6 @@ func (pm *ProtocolManager) processBlocks() error {
 		// Try to inset the blocks, drop the originating peer if there's an error
 		index, err := pm.chainman.InsertChain(raw)
 		if err != nil {
-			glog.V(logger.Warn).Infof("Block insertion failed: %v", err)
 			pm.removePeer(blocks[index].OriginPeer)
 			pm.downloader.Cancel()
 			return err