Gas usage testing in Blockchain / Solidity - Time & Space Complexity
When testing gas usage in blockchain smart contracts, we want to know how the cost changes as the input grows.
We ask: How does the gas needed increase when the contract processes more data?
Analyze the time complexity of the following code snippet.
function sumArray(uint[] memory numbers) public pure returns (uint) {
uint total = 0;
for (uint i = 0; i < numbers.length; i++) {
total += numbers[i];
}
return total;
}
This function adds up all numbers in an array and returns the total sum.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that adds each number to the total.
- How many times: It runs once for every element in the input array.
As the array gets bigger, the number of additions grows the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 additions |
| 100 | 100 additions |
| 1000 | 1000 additions |
Pattern observation: The work grows directly with the number of items in the array.
Time Complexity: O(n)
This means the gas cost grows in a straight line as the input size increases.
[X] Wrong: "Gas cost stays the same no matter how many items are processed."
[OK] Correct: Each item requires work, so more items mean more gas is used.
Understanding how gas usage grows helps you write efficient contracts and explain your code clearly in interviews.
"What if we changed the function to sum only the first half of the array? How would the time complexity change?"
Practice
Solution
Step 1: Understand gas usage testing
Gas usage testing measures the amount of gas consumed by smart contract functions during execution.Step 2: Differentiate from other tests
It is not about syntax errors, logic correctness, or changing gas prices but about cost measurement.Final Answer:
To measure how much gas a function consumes when executed -> Option DQuick Check:
Gas usage testing = measure gas cost [OK]
- Confusing gas usage testing with syntax or logic testing
- Thinking gas usage testing changes gas prices
- Assuming gas usage testing verifies contract correctness
Solution
Step 1: Identify the correct property for gas used
Transaction receipts have a property calledgasUsedthat shows the gas consumed.Step 2: Eliminate incorrect properties
gas_priceis gas price per unit,gasLimitis max gas allowed, andgasCostis not a standard property.Final Answer:
const gasUsed = receipt.gasUsed; -> Option AQuick Check:
Gas used = receipt.gasUsed [OK]
- Using gas_price instead of gasUsed
- Confusing gasLimit with gas used
- Trying to access non-existent gasCost property
const receipt = await contract.methods.myFunction().send({ from: user });
console.log(receipt.gasUsed);What will this code output?
Solution
Step 1: Understand what receipt.gasUsed represents
Thereceipt.gasUsedproperty contains the gas consumed by the transaction.Step 2: Confirm the code logs gas used
The code logsreceipt.gasUsed, so it outputs the gas used bymyFunction.Final Answer:
The amount of gas used by myFunction execution -> Option CQuick Check:
receipt.gasUsed logs gas used [OK]
- Thinking gasUsed is gas price or block gas limit
- Expecting gasUsed to be undefined or cause error
- Confusing gasUsed with transaction cost in ether
const receipt = await contract.methods.transfer(to, amount).send({ from: sender });
const gasUsed = receipt.gasPrice;
console.log(gasUsed);What is the error here?
Solution
Step 1: Check property used for gas consumption
The code usesreceipt.gasPrice, which is gas price per unit, not gas used.Step 2: Identify correct property for gas used
The correct property to get gas consumed isreceipt.gasUsed.Final Answer:
Using receipt.gasPrice instead of receipt.gasUsed to get gas consumed -> Option AQuick Check:
Gas used = receipt.gasUsed, not gasPrice [OK]
- Confusing gasPrice with gasUsed
- Omitting await causing promise issues
- Assuming send() returns something other than receipt
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?
Solution
Step 1: Understand gas usage variability
Gas used depends on blockchain state and inputs; single runs may not reflect average cost.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.Final Answer:
Gas usage can vary due to blockchain state; single runs may mislead -> Option BQuick Check:
Gas varies by state; test multiple times [OK]
- Assuming gasUsed is fixed for all runs
- Adding gasPrice to gasUsed incorrectly
- Thinking gasUsed must convert to ether for comparison
Ready to prove it?
Pass the test and this pattern moves unknown
