diff --git a/core/chain_manager.go b/core/chain_manager.go index 2b86bb79418d55a7a7a73d9be983f1882c13a1f9..ec479db25ca2f1a325d39155e9281410b60ba7ef 100644 --- a/core/chain_manager.go +++ b/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) } diff --git a/core/transaction_pool.go b/core/transaction_pool.go index e68f7406ae27147959d0771f164cb341a25d0745..c896488d1e59e96ff699b0eaf69e0768ea7adad7 100644 --- a/core/transaction_pool.go +++ b/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 { diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go index 49224be5bb063583114db4b21118694af525c8eb..d6ea4a2a9b80b67dcd75a920b589f5b2f9c9767b 100644 --- a/core/transaction_pool_test.go +++ b/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) + } +} diff --git a/eth/sync.go b/eth/sync.go index d93f83a78361391e76f4f5fbebc15c64c0ca66dc..cf549f852cd4ca9cfa56432a02227bc2e88ae22b 100644 --- a/eth/sync.go +++ b/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