Variable packing in Blockchain / Solidity - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When working with blockchain, how we store variables can affect how fast our code runs.
We want to see how packing variables together changes the work the program does.
Analyze the time complexity of the following code snippet.
struct Data {
uint128 a;
uint128 b;
}
function storeData(Data[] memory dataList) public {
for (uint i = 0; i < dataList.length; i++) {
// store each packed data item
}
}
This code stores a list of data items where two 128-bit numbers are packed together in one struct.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Loop over each element in the dataList array.
- How many times: Once for each item in the input list (n times).
As the number of data items grows, the loop runs more times, doing more work.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 loop steps |
| 100 | 100 loop steps |
| 1000 | 1000 loop steps |
Pattern observation: The work grows directly with the number of items.
Time Complexity: O(n)
This means the time to run grows in a straight line as the input size grows.
[X] Wrong: "Packing variables makes the loop run faster and changes time complexity."
[OK] Correct: Packing reduces storage size but the loop still runs once per item, so time grows the same way.
Understanding how variable packing affects performance shows you know both storage and execution costs, a useful skill in blockchain development.
"What if the dataList contained nested arrays inside each item? How would the time complexity change?"
Practice
What is the main benefit of variable packing in blockchain smart contracts?
Solution
Step 1: Understand variable packing purpose
Variable packing groups smaller variables to use less storage space.Step 2: Connect storage saving to gas fees
Less storage means lower gas fees because blockchain charges for storage.Final Answer:
It reduces storage space and lowers gas fees. -> Option AQuick Check:
Variable packing = saves space and gas [OK]
- Thinking it increases variable count
- Assuming it speeds up all code execution
- Believing it encrypts data automatically
Which of the following Solidity variable declarations best uses variable packing?
uint8 a; uint16 b; uint32 c;
Solution
Step 1: Order variables from smallest to largest
Variable packing works best when smaller variables come first to fill storage slots efficiently.Step 2: Check given orders
Declare asuint8 a; uint16 b; uint32 c;in this order. orders variables from uint8 (smallest) to uint32 (largest), maximizing packing.Final Answer:
Declare as uint8 a; uint16 b; uint32 c; in this order. -> Option CQuick Check:
Smallest to largest order = best packing [OK]
- Placing largest variables first wastes space
- Using all uint256 wastes storage
- Mixing order without size consideration
Consider this Solidity struct packed into one storage slot:
struct Data {
uint8 x;
uint16 y;
uint8 z;
}
Data d = Data(1, 300, 2);What is the total storage size used by d?
Solution
Step 1: Calculate bits for each variable
uint8 = 8 bits, uint16 = 16 bits, uint8 = 8 bits; total = 8+16+8 = 32 bits.Step 2: Understand Solidity storage slot size
Solidity packs variables into 256-bit slots, but here total variables use only 32 bits, so storage used is 32 bits.Final Answer:
32 bits (4 bytes) -> Option DQuick Check:
8+16+8 = 32 bits used [OK]
- Assuming full 256 bits always used
- Adding bytes instead of bits incorrectly
- Confusing variable sizes
Identify the error in this Solidity contract snippet related to variable packing:
contract Example {
uint256 a;
uint8 b;
uint16 c;
}Why is this not optimized for variable packing?
Solution
Step 1: Check variable order for packing
Variable packing requires ordering from smallest to largest to fill storage slots efficiently.Step 2: Analyze given order
Here, uint256 a is first (largest), then smaller uint8 and uint16, which wastes space.Final Answer:
Variables are not ordered from smallest to largest size. -> Option AQuick Check:
Order smallest to largest for packing [OK]
- Thinking uint256 can't be packed
- Believing all must be uint8
- Ignoring variable order importance
You want to store these variables in a Solidity contract efficiently:
bool isActive; uint8 count; uint256 total; uint16 code;
Which variable order best uses variable packing to minimize storage slots?
Solution
Step 1: Order variables from smallest to largest size
bool (1 bit), uint8 (8 bits), uint16 (16 bits), uint256 (256 bits) is the correct size order.Step 2: Check options for this order
bool isActive; uint8 count; uint16 code; uint256 total;lists variables in this order, maximizing packing into fewer storage slots.Final Answer:
bool isActive; uint8 count; uint16 code; uint256 total; -> Option BQuick Check:
Smallest to largest order = best packing [OK]
- Placing uint256 first wastes slots
- Ignoring bool size as smallest
- Mixing order without size logic
