Skip to content

Commit

Permalink
Discard transaction with invalid gas limit (0xPolygon#349)
Browse files Browse the repository at this point in the history
* Discard transaction with invalid gas limit

* Fix ErrBlockLimitExceeded error message

* Make default header configurable in txpool_test
  • Loading branch information
0xAleksaOpacic authored Jan 21, 2022
1 parent 75acfdb commit 828d4ba
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 81 deletions.
38 changes: 0 additions & 38 deletions e2e/txpool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -408,44 +408,6 @@ func TestTxPool_StressAddition(t *testing.T) {
}
}

func TestInvalidTransactionRecover(t *testing.T) {
// Test scenario :
// Send a transaction with gasLimit > block gas limit.
// -> The transaction should not be applied, and the nonce should not be incremented.
senderKey, senderAddress := tests.GenerateKeyAndAddr(t)
_, receiverAddress := tests.GenerateKeyAndAddr(t)

server := framework.NewTestServers(t, 1, func(config *framework.TestServerConfig) {
config.SetConsensus(framework.ConsensusDev)
config.SetSeal(true)
config.Premine(senderAddress, framework.EthToWei(100))
})[0]
client := server.JSONRPC()

tx, err := signer.SignTx(&types.Transaction{
Nonce: 0,
GasPrice: big.NewInt(10000),
Gas: 5000000000,
To: &receiverAddress,
Value: oneEth,
V: big.NewInt(1),
From: senderAddress,
}, senderKey)
assert.NoError(t, err, "failed to sign transaction")

// send tx
_, err = server.JSONRPC().Eth().SendRawTransaction(tx.MarshalRLP())
assert.NoError(t, err)

balance, err := client.Eth().GetBalance(web3.Address(receiverAddress), web3.Latest)
assert.NoError(t, err, "failed to retrieve receiver account balance")
assert.Equal(t, framework.EthToWei(0).String(), balance.String())

nextNonce, err := client.Eth().GetNonce(web3.Address(tx.From), web3.Latest)
assert.NoError(t, err)
assert.Equal(t, uint64(0), nextNonce)
}

func TestTxPool_RecoverableError(t *testing.T) {
// Test scenario :
//
Expand Down
17 changes: 16 additions & 1 deletion txpool/mock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,25 @@ import (
/* MOCK */

type defaultMockStore struct {
DefaultHeader *types.Header
}

func NewDefaultMockStore(header *types.Header) defaultMockStore {
var defaultHeader = &types.Header{
GasLimit: 4712388,
}

if header != nil {
defaultHeader = header
}

return defaultMockStore{
defaultHeader,
}
}

func (m defaultMockStore) Header() *types.Header {
return &types.Header{}
return m.DefaultHeader
}

func (m defaultMockStore) GetNonce(types.Hash, types.Address) uint64 {
Expand Down
8 changes: 8 additions & 0 deletions txpool/txpool.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const (
// errors
var (
ErrIntrinsicGas = errors.New("intrinsic gas too low")
ErrBlockLimitExceeded = errors.New("exceeds block gas limit")
ErrNegativeValue = errors.New("negative value")
ErrNonEncryptedTx = errors.New("non-encrypted transaction")
ErrInvalidSender = errors.New("invalid sender")
Expand Down Expand Up @@ -549,6 +550,13 @@ func (p *TxPool) validateTx(tx *types.Transaction) error {
return ErrIntrinsicGas
}

// Grab the block gas limit for the latest block
latestBlockGasLimit := p.store.Header().GasLimit

if tx.Gas > latestBlockGasLimit {
return ErrBlockLimitExceeded
}

return nil
}

Expand Down
Loading

0 comments on commit 828d4ba

Please sign in to comment.