@ -1243,33 +1243,28 @@ func TestAllowedTxSize(t *testing.T) {
account := crypto . PubkeyToAddress ( key . PublicKey )
account := crypto . PubkeyToAddress ( key . PublicKey )
testAddBalance ( pool , account , big . NewInt ( 1000000000 ) )
testAddBalance ( pool , account , big . NewInt ( 1000000000 ) )
// Compute maximal data size for transactions (lower bound).
// Find the maximum data length for the kind of transaction which will
//
// be generated in the pool.addRemoteSync calls below.
// It is assumed the fields in the transaction (except of the data) are:
const largeDataLength = txMaxSize - 200 // enough to have a 5 bytes RLP encoding of the data length number
// - nonce <= 32 bytes
txWithLargeData := pricedDataTransaction ( 0 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , largeDataLength )
// - gasTip <= 32 bytes
maxTxLengthWithoutData := txWithLargeData . Size ( ) - largeDataLength // 103 bytes
// - gasLimit <= 32 bytes
maxTxDataLength := txMaxSize - maxTxLengthWithoutData // 131072 - 103 = 130953 bytes
// - recipient == 20 bytes
// - value <= 32 bytes
// - signature == 65 bytes
// All those fields are summed up to at most 213 bytes.
baseSize := uint64 ( 213 )
dataSize := txMaxSize - baseSize
// Try adding a transaction with maximal allowed size
// Try adding a transaction with maximal allowed size
tx := pricedDataTransaction ( 0 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , dataSize )
tx := pricedDataTransaction ( 0 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , maxTxDataLength )
if err := pool . addRemoteSync ( tx ) ; err != nil {
if err := pool . addRemoteSync ( tx ) ; err != nil {
t . Fatalf ( "failed to add transaction of size %d, close to maximal: %v" , int ( tx . Size ( ) ) , err )
t . Fatalf ( "failed to add transaction of size %d, close to maximal: %v" , int ( tx . Size ( ) ) , err )
}
}
// Try adding a transaction with random allowed size
// Try adding a transaction with random allowed size
if err := pool . addRemoteSync ( pricedDataTransaction ( 1 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , uint64 ( rand . Intn ( int ( dataSize ) ) ) ) ) ; err != nil {
if err := pool . addRemoteSync ( pricedDataTransaction ( 1 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , uint64 ( rand . Intn ( int ( maxTxDataLength + 1 ) ) ) ) ) ; err != nil {
t . Fatalf ( "failed to add transaction of random allowed size: %v" , err )
t . Fatalf ( "failed to add transaction of random allowed size: %v" , err )
}
}
// Try adding a transaction of minimal not allowed siz e
// Try adding a transaction above maximum size by on e
if err := pool . addRemoteSync ( pricedDataTransaction ( 2 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , txMaxSize ) ) ; err == nil {
if err := pool . addRemoteSync ( pricedDataTransaction ( 2 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , maxTxDataLength + 1 ) ) ; err == nil {
t . Fatalf ( "expected rejection on slightly oversize transaction" )
t . Fatalf ( "expected rejection on slightly oversize transaction" )
}
}
// Try adding a transaction of random not allowed siz e
// Try adding a transaction above maximum size by more than on e
if err := pool . addRemoteSync ( pricedDataTransaction ( 2 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , dataSize + 1 + uint64 ( rand . Intn ( 10 * txMaxSize ) ) ) ) ; err == nil {
if err := pool . addRemoteSync ( pricedDataTransaction ( 2 , pool . currentHead . Load ( ) . GasLimit , big . NewInt ( 1 ) , key , maxTxDataLength + 1 + uint64 ( rand . Intn ( 10 * txMaxSize ) ) ) ) ; err == nil {
t . Fatalf ( "expected rejection on oversize transaction" )
t . Fatalf ( "expected rejection on oversize transaction" )
}
}
// Run some sanity checks on the pool internals
// Run some sanity checks on the pool internals