|
| 1 | +From 935ad2c371da8405bb85922b9941d35b3dc68ceb Mon Sep 17 00:00:00 2001 |
| 2 | +From: Steven Czabaniuk <steven@solana.com> |
| 3 | +Date: Wed, 29 Sep 2021 15:43:36 -0500 |
| 4 | +Subject: [PATCH] feat: double PACKET_DATA_SIZE |
| 5 | + |
| 6 | +Try blind double of PACKET_DATA_SIZE; this double things across the |
| 7 | +board and is not a permanent solution. |
| 8 | +--- |
| 9 | + rpc/src/rpc.rs | 16 +++++++++++----- |
| 10 | + sdk/src/packet.rs | 3 ++- |
| 11 | + web3.js/src/transaction.ts | 4 +++- |
| 12 | + 3 files changed, 16 insertions(+), 7 deletions(-) |
| 13 | + |
| 14 | +diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs |
| 15 | +index 987980cb53..607681728c 100644 |
| 16 | +--- a/rpc/src/rpc.rs |
| 17 | ++++ b/rpc/src/rpc.rs |
| 18 | +@@ -4177,8 +4177,11 @@ pub mod rpc_obsolete_v1_7 { |
| 19 | + } |
| 20 | + } |
| 21 | + |
| 22 | +-const MAX_BASE58_SIZE: usize = 1683; // Golden, bump if PACKET_DATA_SIZE changes |
| 23 | +-const MAX_BASE64_SIZE: usize = 1644; // Golden, bump if PACKET_DATA_SIZE changes |
| 24 | ++// These values need to be updated if PACKET_DATA_SIZE changes. The correct values can |
| 25 | ++// be found by hand or by simply encoding `PACKET_DATA_SIZE` bytes and checking length. |
| 26 | ++// `test_max_encoded_tx_goldens` ensures these values are correct. |
| 27 | ++const MAX_BASE58_SIZE: usize = 3365; |
| 28 | ++const MAX_BASE64_SIZE: usize = 3288; |
| 29 | + fn decode_and_deserialize<T>( |
| 30 | + encoded: String, |
| 31 | + encoding: UiTransactionEncoding, |
| 32 | +@@ -7961,7 +7964,7 @@ pub mod tests { |
| 33 | + } |
| 34 | + |
| 35 | + #[test] |
| 36 | +- fn test_worst_case_encoded_tx_goldens() { |
| 37 | ++ fn test_max_encoded_tx_goldens() { |
| 38 | + let ff_tx = vec![0xffu8; PACKET_DATA_SIZE]; |
| 39 | + let tx58 = bs58::encode(&ff_tx).into_string(); |
| 40 | + assert_eq!(tx58.len(), MAX_BASE58_SIZE); |
| 41 | +@@ -7971,8 +7974,11 @@ pub mod tests { |
| 42 | + |
| 43 | + #[test] |
| 44 | + fn test_decode_and_deserialize_too_large_payloads_fail() { |
| 45 | +- // +2 because +1 still fits in base64 encoded worst-case |
| 46 | +- let too_big = PACKET_DATA_SIZE + 2; |
| 47 | ++ // 4 base64 digits are generated from groups of 3 bytes; however, those 4 digits |
| 48 | ++ // are generated even if the group only has 1 or 2 bytes. |
| 49 | ++ // So, we need 4 - (PACKET_DATA_SIZE % 3) extra bytes to ensure we'll spill over |
| 50 | ++ let extra_bytes = 4 - (PACKET_DATA_SIZE % 3); |
| 51 | ++ let too_big = PACKET_DATA_SIZE + extra_bytes; |
| 52 | + let tx_ser = vec![0xffu8; too_big]; |
| 53 | + let tx58 = bs58::encode(&tx_ser).into_string(); |
| 54 | + let tx58_len = tx58.len(); |
| 55 | +diff --git a/sdk/src/packet.rs b/sdk/src/packet.rs |
| 56 | +index efea219043..473a92ecfe 100644 |
| 57 | +--- a/sdk/src/packet.rs |
| 58 | ++++ b/sdk/src/packet.rs |
| 59 | +@@ -12,7 +12,8 @@ use { |
| 60 | + /// 1280 is IPv6 minimum MTU |
| 61 | + /// 40 bytes is the size of the IPv6 header |
| 62 | + /// 8 bytes is the size of the fragment header |
| 63 | +-pub const PACKET_DATA_SIZE: usize = 1280 - 40 - 8; |
| 64 | ++/// Double the minimum to support larger than MTU transactions |
| 65 | ++pub const PACKET_DATA_SIZE: usize = 2 * (1280 - 40 - 8); |
| 66 | + |
| 67 | + bitflags! { |
| 68 | + #[repr(C)] |
| 69 | +diff --git a/web3.js/src/transaction.ts b/web3.js/src/transaction.ts |
| 70 | +index 5466464f5a..5b71b9dc39 100644 |
| 71 | +--- a/web3.js/src/transaction.ts |
| 72 | ++++ b/web3.js/src/transaction.ts |
| 73 | +@@ -29,8 +29,10 @@ const DEFAULT_SIGNATURE = Buffer.alloc(64).fill(0); |
| 74 | + * 1280 is IPv6 minimum MTU |
| 75 | + * 40 bytes is the size of the IPv6 header |
| 76 | + * 8 bytes is the size of the fragment header |
| 77 | ++ * |
| 78 | ++ * Double the minimum to support larger than MTU transactions |
| 79 | + */ |
| 80 | +-export const PACKET_DATA_SIZE = 1280 - 40 - 8; |
| 81 | ++export const PACKET_DATA_SIZE = 2464; |
| 82 | + |
| 83 | + const SIGNATURE_LENGTH = 64; |
| 84 | + |
| 85 | +-- |
| 86 | +2.32.0 (Apple Git-132) |
| 87 | + |
0 commit comments