Bird
Raised Fist0
Blockchain / Solidityprogramming~20 mins

Gas usage testing in Blockchain / Solidity - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Gas Usage Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Gas usage of simple storage update
Consider a smart contract function that updates a stored number. What is the gas usage behavior when calling this function multiple times with the same value?
Blockchain / Solidity
contract SimpleStorage {
    uint256 public storedData;

    function set(uint256 x) public {
        storedData = x;
    }
}
AGas cost is zero for calls with the same value as the current storedData.
BGas cost is the same for every call regardless of the value.
CGas cost is high only on the first update; subsequent calls with the same value cost less gas.
DGas cost increases with each call regardless of the value.
Attempts:
2 left
💡 Hint
Think about how Ethereum refunds gas when storage is not changed.
❓ Predict Output
intermediate
2:00remaining
Gas cost of adding vs removing elements in a mapping
Given a mapping in a smart contract, what happens to gas usage when you add a new key-value pair versus when you delete a key?
Blockchain / Solidity
contract MapExample {
    mapping(address => uint256) public balances;

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

    function removeBalance(address user) public {
        delete balances[user];
    }
}
ADeleting a key costs more gas than adding one.
BAdding and deleting keys cost the same gas with no refunds.
CNeither adding nor deleting keys affects gas usage.
DAdding a new key costs more gas; deleting a key refunds some gas.
Attempts:
2 left
💡 Hint
Consider how storage refunds work in Ethereum.
🔧 Debug
advanced
3:00remaining
Unexpected high gas usage in loop
This contract function loops over an array and updates a mapping. Why does it consume unexpectedly high gas?
Blockchain / Solidity
contract LoopGas {
    mapping(uint256 => uint256) public data;
    uint256[] public keys;

    function updateData() public {
        for (uint i = 0; i < keys.length; i++) {
            data[keys[i]] = i;
        }
    }
}
AThe mapping update inside the loop is free and does not affect gas.
BThe loop condition uses <= which causes an out-of-bounds access and wastes gas.
CThe keys array is empty, so the loop does not run and gas is wasted.
DThe function is missing a payable modifier causing high gas.
Attempts:
2 left
💡 Hint
Check the loop boundary carefully.
📝 Syntax
advanced
2:00remaining
Gas optimization with unchecked arithmetic
Which option correctly uses unchecked arithmetic to save gas in Solidity 0.8+ without causing overflow errors?
Blockchain / Solidity
function sum(uint256 a, uint256 b) public pure returns (uint256) {
    // Fill in the blank
}
Aunchecked { return a + b; }
Breturn a + b; // no unchecked block
Cunchecked return a + b;
Dreturn unchecked(a + b);
Attempts:
2 left
💡 Hint
The unchecked block disables overflow checks inside it.
🚀 Application
expert
3:00remaining
Estimating gas cost for dynamic array resizing
You have a function that appends elements to a dynamic array in a smart contract. How does the gas cost behave as the array grows, and which option best describes this behavior?
Blockchain / Solidity
contract DynamicArray {
    uint256[] public numbers;

    function addNumber(uint256 num) public {
        numbers.push(num);
    }
}
AGas cost per push remains roughly constant regardless of array size.
BGas cost per push increases linearly as the array grows.
CGas cost per push decreases as the array grows due to storage optimization.
DGas cost per push is zero after the first element is added.
Attempts:
2 left
💡 Hint
Think about how storage slots are allocated for dynamic arrays.

Practice

(1/5)
1. What is the main purpose of gas usage testing in blockchain smart contracts?
easy
A. To check if the smart contract code has syntax errors
B. To increase the gas price for faster transactions
C. To verify the correctness of smart contract logic
D. To measure how much gas a function consumes when executed

Solution

  1. Step 1: Understand gas usage testing

    Gas usage testing measures the amount of gas consumed by smart contract functions during execution.
  2. Step 2: Differentiate from other tests

    It is not about syntax errors, logic correctness, or changing gas prices but about cost measurement.
  3. Final Answer:

    To measure how much gas a function consumes when executed -> Option D
  4. Quick Check:

    Gas usage testing = measure gas cost [OK]
Hint: Gas testing measures cost, not correctness or syntax [OK]
Common Mistakes:
  • Confusing gas usage testing with syntax or logic testing
  • Thinking gas usage testing changes gas prices
  • Assuming gas usage testing verifies contract correctness
2. Which of the following is the correct way to get gas used from a transaction receipt in Solidity testing frameworks?
easy
A. const gasUsed = receipt.gasUsed;
B. const gasUsed = receipt.gas_price;
C. const gasUsed = receipt.gasLimit;
D. const gasUsed = receipt.gasCost;

Solution

  1. Step 1: Identify the correct property for gas used

    Transaction receipts have a property called gasUsed that shows the gas consumed.
  2. Step 2: Eliminate incorrect properties

    gas_price is gas price per unit, gasLimit is max gas allowed, and gasCost is not a standard property.
  3. Final Answer:

    const gasUsed = receipt.gasUsed; -> Option A
  4. Quick Check:

    Gas used = receipt.gasUsed [OK]
Hint: Gas used is in receipt.gasUsed property [OK]
Common Mistakes:
  • Using gas_price instead of gasUsed
  • Confusing gasLimit with gas used
  • Trying to access non-existent gasCost property
3. Consider this JavaScript test snippet for a smart contract function:
const receipt = await contract.methods.myFunction().send({ from: user });
console.log(receipt.gasUsed);

What will this code output?
medium
A. An error because gasUsed is undefined
B. The gas price set for the transaction
C. The amount of gas used by myFunction execution
D. The total gas limit of the block

Solution

  1. Step 1: Understand what receipt.gasUsed represents

    The receipt.gasUsed property contains the gas consumed by the transaction.
  2. Step 2: Confirm the code logs gas used

    The code logs receipt.gasUsed, so it outputs the gas used by myFunction.
  3. Final Answer:

    The amount of gas used by myFunction execution -> Option C
  4. Quick Check:

    receipt.gasUsed logs gas used [OK]
Hint: receipt.gasUsed shows gas consumed by function call [OK]
Common Mistakes:
  • Thinking gasUsed is gas price or block gas limit
  • Expecting gasUsed to be undefined or cause error
  • Confusing gasUsed with transaction cost in ether
4. You wrote this test code to measure gas usage:
const receipt = await contract.methods.transfer(to, amount).send({ from: sender });
const gasUsed = receipt.gasPrice;
console.log(gasUsed);

What is the error here?
medium
A. Using receipt.gasPrice instead of receipt.gasUsed to get gas consumed
B. Missing await keyword before contract method call
C. Incorrect method name; should be transferFrom
D. send() does not return a receipt object

Solution

  1. Step 1: Check property used for gas consumption

    The code uses receipt.gasPrice, which is gas price per unit, not gas used.
  2. Step 2: Identify correct property for gas used

    The correct property to get gas consumed is receipt.gasUsed.
  3. Final Answer:

    Using receipt.gasPrice instead of receipt.gasUsed to get gas consumed -> Option A
  4. Quick Check:

    Gas used = receipt.gasUsed, not gasPrice [OK]
Hint: Use receipt.gasUsed, not gasPrice, for gas consumption [OK]
Common Mistakes:
  • Confusing gasPrice with gasUsed
  • Omitting await causing promise issues
  • Assuming send() returns something other than receipt
5. You want to compare gas usage of two smart contract functions, funcA and funcB, to find which is cheaper. You run:
const receiptA = await contract.methods.funcA().send({ from: user });
const receiptB = await contract.methods.funcB().send({ from: user });
console.log(receiptA.gasUsed < receiptB.gasUsed ? 'funcA cheaper' : 'funcB cheaper');

What is a potential issue with this approach?
hard
A. You cannot compare gasUsed values directly; must convert to ether
B. Gas usage can vary due to blockchain state; single runs may mislead
C. You must add gasPrice to gasUsed to get total cost
D. send() does not return gasUsed in receipt

Solution

  1. Step 1: Understand gas usage variability

    Gas used depends on blockchain state and inputs; single runs may not reflect average cost.
  2. Step 2: Identify why single comparison can mislead

    Different states or conditions can cause gas usage to fluctuate, so multiple tests or averaging is better.
  3. Final Answer:

    Gas usage can vary due to blockchain state; single runs may mislead -> Option B
  4. Quick Check:

    Gas varies by state; test multiple times [OK]
Hint: Gas varies; test multiple times for accurate comparison [OK]
Common Mistakes:
  • Assuming gasUsed is fixed for all runs
  • Adding gasPrice to gasUsed incorrectly
  • Thinking gasUsed must convert to ether for comparison
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