Bird
Raised Fist0
Blockchain / Solidityprogramming~20 mins

Variable packing in Blockchain / Solidity - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Master of Variable Packing
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of Solidity variable packing in storage
Consider the following Solidity contract snippet. What will be the value of slot0 after deployment?

contract Test {
    uint128 a = 1;
    uint128 b = 2;
    uint256 slot0;

    function readSlot0() public view returns (uint256) {
        assembly {
            slot0 := sload(0)
        }
    }
}
Blockchain / Solidity
contract Test {
    uint128 a = 1;
    uint128 b = 2;
    uint256 slot0;

    function readSlot0() public view returns (uint256) {
        assembly {
            slot0 := sload(0)
        }
    }
}
A0x0000000000000000000000000000000000000000000000000000000100000002
B0x0000000000000000000000000000000000000000000000000000000200000001
C0x0000000000000000000000000000000000000000000000000000000000000002
D0x0000000000000000000000000000000000000000000000000000000000000003
Attempts:
2 left
💡 Hint
Remember that two uint128 variables fit into one 256-bit storage slot, with the first declared variable occupying the lower bits.
🧠 Conceptual
intermediate
1:30remaining
Understanding variable packing order in Solidity
In Solidity, which of the following statements about variable packing in storage is correct?
AVariables are packed in the order they are declared, starting from the highest bits of the slot.
BVariables of different types cannot be packed together in the same storage slot.
CVariables are packed randomly in storage slots to optimize gas usage.
DVariables are packed in the order they are declared, starting from the lowest bits of the slot.
Attempts:
2 left
💡 Hint
Think about how Solidity stores smaller variables in a 256-bit slot.
Predict Output
advanced
2:30remaining
Output of packed struct storage in Solidity
Given the following Solidity contract, what is the value returned by readSlot0() after deployment?

contract Test {
    struct Data {
        uint64 x;
        uint64 y;
        uint128 z;
    }

    Data public data = Data(1, 2, 3);

    function readSlot0() public view returns (uint256) {
        assembly {
            let val := sload(0)
            mstore(0x0, val)
            return(0x0, 32)
        }
    }
}
Blockchain / Solidity
contract Test {
    struct Data {
        uint64 x;
        uint64 y;
        uint128 z;
    }

    Data public data = Data(1, 2, 3);

    function readSlot0() public view returns (uint256) {
        assembly {
            let val := sload(0)
            mstore(0x0, val)
            return(0x0, 32)
        }
    }
}
A0x000000000000000300000000000000020000000000000001
B0x000000000000000000000000000000030000000200000001
C0x00000000000000000000000000000000000000020000000103
D0x0000000000000000000000000000000000000000000000000000000000000006
Attempts:
2 left
💡 Hint
Remember the order and size of struct members and how they pack into a 256-bit slot.
🔧 Debug
advanced
2:00remaining
Identify the error in variable packing usage
A developer tries to pack variables in Solidity as follows:

contract Test {
    uint8 a = 1;
    uint256 b = 2;
    uint8 c = 3;
}

What is the main issue with this variable packing approach?
AVariables 'a' and 'c' cannot be packed because they are not declared consecutively without a larger type in between.
BVariables 'a' and 'c' will be packed together in the same slot, but 'b' will occupy a new slot, causing inefficient packing.
CThe compiler will throw a syntax error because uint8 and uint256 cannot be declared in the same contract.
DAll variables will be packed into a single 256-bit slot, causing overflow.
Attempts:
2 left
💡 Hint
Think about how Solidity packs variables and the effect of a large variable between smaller ones.
🚀 Application
expert
3:00remaining
Calculate total storage slots used by packed variables
Consider this Solidity contract:

contract Test {
    uint128 a;
    uint64 b;
    uint64 c;
    uint256 d;
    uint8 e;
    uint8 f;
    uint16 g;
}

How many 256-bit storage slots will these variables occupy in total?
A2
B4
C3
D5
Attempts:
2 left
💡 Hint
Group variables by their declaration order and sizes to see how they fit into 256-bit slots.

Practice

(1/5)
1.

What is the main benefit of variable packing in blockchain smart contracts?

easy
A. It reduces storage space and lowers gas fees.
B. It increases the number of variables allowed.
C. It makes the code run faster on all blockchains.
D. It automatically encrypts stored data.

Solution

  1. Step 1: Understand variable packing purpose

    Variable packing groups smaller variables to use less storage space.
  2. Step 2: Connect storage saving to gas fees

    Less storage means lower gas fees because blockchain charges for storage.
  3. Final Answer:

    It reduces storage space and lowers gas fees. -> Option A
  4. Quick Check:

    Variable packing = saves space and gas [OK]
Hint: Variable packing saves storage and gas fees [OK]
Common Mistakes:
  • Thinking it increases variable count
  • Assuming it speeds up all code execution
  • Believing it encrypts data automatically
2.

Which of the following Solidity variable declarations best uses variable packing?

uint8 a;
uint16 b;
uint32 c;
easy
A. Declare all as uint256 for best packing.
B. Declare as uint32 c; uint16 b; uint8 a; in this order.
C. Declare as uint8 a; uint16 b; uint32 c; in this order.
D. Declare as uint16 b; uint8 a; uint32 c; in this order.

Solution

  1. Step 1: Order variables from smallest to largest

    Variable packing works best when smaller variables come first to fill storage slots efficiently.
  2. Step 2: Check given orders

    Declare as uint8 a; uint16 b; uint32 c; in this order. orders variables from uint8 (smallest) to uint32 (largest), maximizing packing.
  3. Final Answer:

    Declare as uint8 a; uint16 b; uint32 c; in this order. -> Option C
  4. Quick Check:

    Smallest to largest order = best packing [OK]
Hint: Order variables smallest to largest for packing [OK]
Common Mistakes:
  • Placing largest variables first wastes space
  • Using all uint256 wastes storage
  • Mixing order without size consideration
3.

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?

medium
A. 128 bits (16 bytes)
B. 256 bits (32 bytes)
C. 64 bits (8 bytes)
D. 32 bits (4 bytes)

Solution

  1. Step 1: Calculate bits for each variable

    uint8 = 8 bits, uint16 = 16 bits, uint8 = 8 bits; total = 8+16+8 = 32 bits.
  2. 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.
  3. Final Answer:

    32 bits (4 bytes) -> Option D
  4. Quick Check:

    8+16+8 = 32 bits used [OK]
Hint: Sum bits of variables to find packed size [OK]
Common Mistakes:
  • Assuming full 256 bits always used
  • Adding bytes instead of bits incorrectly
  • Confusing variable sizes
4.

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?

medium
A. Variables are not ordered from smallest to largest size.
B. uint256 cannot be packed with smaller types.
C. uint8 and uint16 must be declared as uint256.
D. All variables must be declared as uint8 for packing.

Solution

  1. Step 1: Check variable order for packing

    Variable packing requires ordering from smallest to largest to fill storage slots efficiently.
  2. Step 2: Analyze given order

    Here, uint256 a is first (largest), then smaller uint8 and uint16, which wastes space.
  3. Final Answer:

    Variables are not ordered from smallest to largest size. -> Option A
  4. Quick Check:

    Order smallest to largest for packing [OK]
Hint: Order variables smallest to largest to fix packing [OK]
Common Mistakes:
  • Thinking uint256 can't be packed
  • Believing all must be uint8
  • Ignoring variable order importance
5.

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?

hard
A. uint256 total; uint16 code; uint8 count; bool isActive;
B. bool isActive; uint8 count; uint16 code; uint256 total;
C. uint16 code; uint256 total; bool isActive; uint8 count;
D. uint8 count; bool isActive; uint256 total; uint16 code;

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    bool isActive; uint8 count; uint16 code; uint256 total; -> Option B
  4. Quick Check:

    Smallest to largest order = best packing [OK]
Hint: Place smallest variables first, largest last for packing [OK]
Common Mistakes:
  • Placing uint256 first wastes slots
  • Ignoring bool size as smallest
  • Mixing order without size logic