forked from cerc-io/plugeth
core: check negative value transactions. Closes #1109
This commit is contained in:
parent
a55f408c10
commit
c37389f19c
@ -750,7 +750,7 @@ out:
|
|||||||
|
|
||||||
func blockErr(block *types.Block, err error) {
|
func blockErr(block *types.Block, err error) {
|
||||||
h := block.Header()
|
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.Error).Infoln(err)
|
||||||
glog.V(logger.Debug).Infoln(block)
|
glog.V(logger.Debug).Infoln(block)
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ var (
|
|||||||
ErrInsufficientFunds = errors.New("Insufficient funds for gas * price + value")
|
ErrInsufficientFunds = errors.New("Insufficient funds for gas * price + value")
|
||||||
ErrIntrinsicGas = errors.New("Intrinsic gas too low")
|
ErrIntrinsicGas = errors.New("Intrinsic gas too low")
|
||||||
ErrGasLimit = errors.New("Exceeds block gas limit")
|
ErrGasLimit = errors.New("Exceeds block gas limit")
|
||||||
|
ErrNegativeValue = errors.New("Negative value")
|
||||||
)
|
)
|
||||||
|
|
||||||
const txPoolQueueSize = 50
|
const txPoolQueueSize = 50
|
||||||
@ -125,6 +126,10 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
|
|||||||
return ErrGasLimit
|
return ErrGasLimit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if tx.Amount.Cmp(common.Big0) < 0 {
|
||||||
|
return ErrNegativeValue
|
||||||
|
}
|
||||||
|
|
||||||
total := new(big.Int).Mul(tx.Price, tx.GasLimit)
|
total := new(big.Int).Mul(tx.Price, tx.GasLimit)
|
||||||
total.Add(total, tx.Value())
|
total.Add(total, tx.Value())
|
||||||
if pool.currentState().GetBalance(from).Cmp(total) < 0 {
|
if pool.currentState().GetBalance(from).Cmp(total) < 0 {
|
||||||
|
@ -138,3 +138,17 @@ func TestRemoveTx(t *testing.T) {
|
|||||||
t.Error("expected txs to be 0, got", len(pool.txs))
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -70,7 +70,6 @@ func (pm *ProtocolManager) processBlocks() error {
|
|||||||
// Try to inset the blocks, drop the originating peer if there's an error
|
// Try to inset the blocks, drop the originating peer if there's an error
|
||||||
index, err := pm.chainman.InsertChain(raw)
|
index, err := pm.chainman.InsertChain(raw)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.V(logger.Warn).Infof("Block insertion failed: %v", err)
|
|
||||||
pm.removePeer(blocks[index].OriginPeer)
|
pm.removePeer(blocks[index].OriginPeer)
|
||||||
pm.downloader.Cancel()
|
pm.downloader.Cancel()
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user