📖 Scenario: Imagine you are building a simple blockchain smart contract that manages token balances for users. In blockchain, numbers have limits, and if you add or subtract too much, the number can wrap around unexpectedly. This is called integer overflow or underflow, and it can cause serious problems.
🎯 Goal: You will create a small program that simulates token balances and shows how overflow and underflow happen. Then, you will add a safety check to prevent these errors.
📋 What You'll Learn
Create a dictionary called balances with exact entries: 'Alice': 100, 'Bob': 50
Create a variable called max_uint and set it to 255 (simulate 8-bit unsigned integer max)
Write code to add 200 tokens to Alice's balance using modular arithmetic to simulate overflow
Print the final balances dictionary exactly as it is after the addition
💡 Why This Matters
🌍 Real World
Smart contracts on blockchains use fixed-size integers. Overflow or underflow can cause wrong balances or security bugs.
💼 Career
Blockchain developers must understand integer limits and how to prevent overflow bugs to build secure contracts.
Progress0 / 4 steps
1
Create initial balances
Create a dictionary called balances with these exact entries: 'Alice': 100 and 'Bob': 50.
Blockchain / Solidity
Hint
Use curly braces to create a dictionary with keys 'Alice' and 'Bob' and their token amounts.
2
Set maximum integer value
Create a variable called max_uint and set it to 255 to simulate an 8-bit unsigned integer maximum value.
Blockchain / Solidity
Hint
Just assign 255 to the variable max_uint.
3
Simulate overflow by adding tokens
Add 200 tokens to Alice's balance using modular arithmetic with max_uint to simulate overflow. Update balances['Alice'] accordingly.
Blockchain / Solidity
Hint
Use the modulo operator % with max_uint + 1 to wrap the value around.
4
Print the final balances
Print the balances dictionary to show the result after the overflow addition.
Blockchain / Solidity
Hint
Use print(balances) to display the dictionary.
Practice
(1/5)
1. What happens in blockchain when an unsigned integer variable exceeds its maximum value?
easy
A. It wraps around to zero (integer overflow).
B. It throws an error automatically.
C. It becomes negative.
D. It stays at the maximum value.
Solution
Step 1: Understand unsigned integer limits
Unsigned integers start at 0 and go up to a max value (like 2^256-1 in Solidity).
Step 2: What happens when max is exceeded?
When the value goes above max, it wraps around to 0, causing integer overflow.
Final Answer:
It wraps around to zero (integer overflow). -> Option A
Quick Check:
Unsigned integer overflow = wrap to zero [OK]
Hint: Unsigned integers wrap to zero on overflow [OK]
Common Mistakes:
Thinking overflow throws an error automatically
Assuming value becomes negative
Believing value stays at max
2. Which of the following Solidity code snippets correctly prevents integer underflow when subtracting 1 from a uint variable balance?
easy
A. balance -= 1; require(balance >= 0);
B. balance = balance - 1;
C. if (balance > 0) { balance -= 1; }
D. balance = balance + 1;
Solution
Step 1: Identify safe subtraction
To avoid underflow, subtract only if balance is greater than zero.
Step 2: Check each option
if (balance > 0) { balance -= 1; } checks balance > 0 before subtracting, preventing underflow. The other options either subtract without checking first (allowing underflow) or add instead of subtracting.
Final Answer:
if (balance > 0) { balance -= 1; } -> Option C
Quick Check:
Check before subtracting prevents underflow [OK]
Hint: Check value > 0 before subtracting to avoid underflow [OK]
Common Mistakes:
Not checking before subtracting
Using require after subtraction (too late)
Adding instead of subtracting
3. Consider this Solidity code snippet:
uint8 x = 255;
x += 1;
What is the value of x after execution?
medium
A. 0
B. 1
C. 255
D. 256
Solution
Step 1: Understand uint8 max value
uint8 can hold values from 0 to 255. 255 is the max.
Step 2: Add 1 to max value
Adding 1 causes overflow, wrapping value back to 0.
Final Answer:
0 -> Option A
Quick Check:
uint8 overflow wraps to 0 [OK]
Hint: uint8 max is 255; adding 1 wraps to 0 [OK]
Common Mistakes:
Expecting 256 (out of range)
Expecting value to stay at 255
Confusing with signed integers
4. This Solidity function tries to subtract 1 from count. What is the bug?
function decrement(uint count) public pure returns (uint) {
count -= 1;
return count;
}
medium
A. No bug; works fine.
B. Underflow if count is 0, wrapping to max uint.
C. Syntax error due to missing semicolon.
D. Returns negative number which is invalid.
Solution
Step 1: Analyze subtraction without check
The function subtracts 1 from count without checking if count is zero.
Step 2: Understand underflow risk
If count is 0, subtracting 1 causes underflow, wrapping to max uint value.
Final Answer:
Underflow if count is 0, wrapping to max uint. -> Option B
Quick Check:
Subtracting 1 from 0 causes underflow [OK]
Hint: Check before subtracting to avoid underflow [OK]
Common Mistakes:
Assuming no bug without checks
Thinking Solidity throws error automatically
Confusing underflow with negative return
5. You have a smart contract token balance stored as uint256. You want to safely add tokens without overflow. Which approach is best?
hard
A. Convert to int256 and add.
B. Use unchecked addition: balance += amount;
C. Subtract amount first, then add balance.
D. Use SafeMath library's add function to check overflow.
Solution
Step 1: Understand overflow risk in addition
Adding tokens can overflow uint256 max value, causing wraparound bugs.
Step 2: Use SafeMath library
SafeMath's add function checks for overflow and reverts if it happens, preventing bugs.
Step 3: Evaluate other options
Unchecked addition risks overflow. Subtracting first or converting to int256 does not prevent overflow safely.
Final Answer:
Use SafeMath library's add function to check overflow. -> Option D
Quick Check:
SafeMath add prevents overflow [OK]
Hint: Use SafeMath add to prevent overflow safely [OK]
Common Mistakes:
Using unchecked addition risking overflow
Trying to subtract before adding
Converting to signed int without checks
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.