Bird
Raised Fist0
Blockchain / Solidityprogramming~10 mins

Mappings in Blockchain / Solidity - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Mappings
Start
↓
Define mapping
↓
Add key-value pair
↓
Access value by key
↓
Update or delete value
↓
End
This flow shows how a mapping is defined, used to store key-value pairs, accessed, updated, and deleted in blockchain smart contracts.
Execution Sample
Blockchain / Solidity
mapping(address => uint) balances;

function updateBalance(address user, uint amount) public {
  balances[user] = amount;
}

function getBalance(address user) public view returns (uint) {
  return balances[user];
}

function deleteBalance(address user) public {
  delete balances[user];
}
This code defines a mapping from addresses to numbers, updates a user's balance, retrieves it, and deletes a balance.
Execution Table
StepActionKey (address)Value (uint)Mapping StateOutput
1Define empty mapping--{}-
2Call updateBalance(user1, 100)user1100{user1: 100}-
3Call updateBalance(user2, 50)user250{user1: 100, user2: 50}-
4Call getBalance(user1)user1-{user1: 100, user2: 50}100
5Call updateBalance(user1, 200)user1200{user1: 200, user2: 50}-
6Call getBalance(user1)user1-{user1: 200, user2: 50}200
7Call getBalance(user3) (not set)user3-{user1: 200, user2: 50}0
8Delete balances[user2]user2-{user1: 200}-
9Call getBalance(user2)user2-{user1: 200}0
💡 Execution ends after accessing and updating mapping entries and deleting a key.
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 5After Step 8Final
balances{}{user1: 100}{user1: 100, user2: 50}{user1: 200, user2: 50}{user1: 200}{user1: 200}
Key Moments - 3 Insights
Why does getBalance(user3) return 0 even though user3 was never set?
Mappings in blockchain return the default value for the value type if the key does not exist. Here, uint default is 0, as shown in execution_table row 7.
What happens when we update balances[user1] from 100 to 200?
The value for key user1 is overwritten with the new value 200, as seen in execution_table row 5 and variable_tracker after step 5.
How does deleting a key affect the mapping?
Deleting a key removes its entry, so accessing it returns the default value 0, shown in execution_table rows 8 and 9.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of balances[user1] after step 3?
A50
B100
C200
D0
💡 Hint
Check the Mapping State column at step 3 in the execution_table.
At which step does balances[user1] get updated to 200?
AStep 5
BStep 7
CStep 2
DStep 8
💡 Hint
Look for the updateBalance call that changes user1's value in the execution_table.
If we delete balances[user2], what will getBalance(user2) return?
A50
BUndefined
C0
DError
💡 Hint
Refer to execution_table rows 8 and 9 showing deletion and access after deletion.
Concept Snapshot
Mappings store key-value pairs like a dictionary.
Keys map to values; if key missing, returns default value.
Use mapping(keyType => valueType) syntax.
Update by assigning new value to a key.
Delete keys to reset to default.
Common in blockchain for balances and states.
Full Transcript
Mappings in blockchain smart contracts are like special dictionaries that connect keys to values. You define a mapping with a key type and a value type. When you add or update a key, the mapping stores the value. If you ask for a key that was never set, it returns the default value for that type, like 0 for numbers. You can also delete keys to remove their stored value. This example showed how balances are stored for addresses, updated, accessed, and deleted step-by-step.

Practice

(1/5)
1. What is the primary purpose of mapping in blockchain smart contracts?
easy
A. To create user interfaces
B. To store a list of all keys used
C. To perform complex mathematical calculations
D. To connect keys to values for fast data lookup

Solution

  1. Step 1: Understand the role of mapping

    Mappings are used to link a key to a value, allowing quick access to data based on the key.
  2. Step 2: Compare options

    Only To connect keys to values for fast data lookup correctly describes this purpose; others describe unrelated functions.
  3. Final Answer:

    To connect keys to values for fast data lookup -> Option D
  4. Quick Check:

    Mapping = key-value fast lookup [OK]
Hint: Mappings link keys to values quickly [OK]
Common Mistakes:
  • Thinking mappings store all keys explicitly
  • Confusing mappings with arrays or lists
  • Assuming mappings perform calculations
2. Which of the following is the correct syntax to declare a mapping from address to uint in Solidity?
easy
A. mapping(address, uint) balances;
B. mapping(address => uint) public balances;
C. mapping[address => uint] balances;
D. mapping(address => uint) balances()

Solution

  1. Step 1: Recall Solidity mapping syntax

    The correct syntax uses parentheses with key type, arrow, and value type: mapping(keyType => valueType) visibility name;
  2. Step 2: Check each option

    mapping(address => uint) public balances; matches the correct syntax. Options A, C, and D have syntax errors like using commas instead of =>, wrong brackets, or function-like declaration.
  3. Final Answer:

    mapping(address => uint) public balances; -> Option B
  4. Quick Check:

    Correct mapping syntax uses (key => value) [OK]
Hint: Use parentheses and arrow for mapping syntax [OK]
Common Mistakes:
  • Using square brackets instead of parentheses
  • Missing visibility keyword like public
  • Using commas instead of =>
3. Consider the Solidity code:
mapping(address => uint) public balances;

function setBalance(address user, uint amount) public {
  balances[user] = amount;
}

function getBalance(address user) public view returns (uint) {
  return balances[user];
}

// After calling setBalance(0x1234..., 50), what does getBalance(0x1234...) return?
medium
A. 50
B. Error
C. Undefined
D. 0

Solution

  1. Step 1: Understand setBalance effect

    The function sets the balance of the given address to the specified amount, here 50.
  2. Step 2: Understand getBalance output

    Calling getBalance with the same address returns the stored value, which is 50.
  3. Final Answer:

    50 -> Option A
  4. Quick Check:

    Set then get returns stored value [OK]
Hint: Set value then get returns that value [OK]
Common Mistakes:
  • Assuming default zero is returned after setting
  • Thinking mapping keys are enumerable
  • Expecting an error for unset keys
4. What is wrong with this Solidity code snippet?
mapping(address => uint) balances;

function addBalance(address user, uint amount) public {
  balances[user] += amount;
}

function getBalance(address user) public view returns (uint) {
  return balances[user];
}
medium
A. The mapping is missing initialization before use
B. The mapping keys are not stored, so balances[user] always returns zero
C. There is no error; the code works as expected
D. The mapping is not declared public, so balances cannot be read

Solution

  1. Step 1: Check mapping declaration

    Mapping does not need explicit initialization; default values are zero.
  2. Step 2: Check function logic

    addBalance adds amount to the current balance; getBalance returns it. Not declaring public means no automatic getter, but manual getter exists.
  3. Final Answer:

    There is no error; the code works as expected -> Option C
  4. Quick Check:

    Mapping defaults and manual getter work fine [OK]
Hint: Manual getter works even if mapping not public [OK]
Common Mistakes:
  • Assuming mapping must be public to read values
  • Thinking mappings need explicit initialization
  • Confusing mapping keys storage with values
5. You want to track ownership of unique items by users using mappings in Solidity. Which approach correctly allows you to check if a user owns a specific item ID with a direct lookup starting from the user address?
hard
A. mapping(address => mapping(uint => bool)) ownsItem; // nested mapping user to item ID to ownership
B. mapping(uint => address) itemToOwner; // maps item ID to owner address
C. mapping(address => uint) ownerToItem; // stores one item per user
D. mapping(address => uint[]) userItems; // mapping to array of item IDs

Solution

  1. Step 1: Understand ownership tracking needs

    We need to check if a user owns a specific item ID, so a direct boolean check is best.
  2. Step 2: Analyze options

    Only mapping(address => mapping(uint => bool)) ownsItem; // nested mapping user to item ID to ownership provides a nested mapping(address => mapping(uint => bool)) ownsItem, allowing direct ownsItem[user][itemID] lookup from the user address. A limits to one item per user; B requires starting from item ID; D requires searching an array.
  3. Final Answer:

    mapping(address => mapping(uint => bool)) ownsItem; // nested mapping user to item ID to ownership -> Option A
  4. Quick Check:

    Nested mapping allows direct ownership check [OK]
Hint: Use nested mapping for user-item ownership check [OK]
Common Mistakes:
  • Using single mapping limiting one item per user
  • Using arrays which are not mappings
  • Confusing item-to-owner with user-to-item ownership check
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard