Interfaces in Blockchain / Solidity - Time & Space Complexity
When working with interfaces in blockchain, it's important to see how the code runs as input grows.
We want to know how the time to execute changes when using interfaces.
Analyze the time complexity of the following code snippet.
interface IToken {
function balanceOf(address owner) external view returns (uint);
}
contract Wallet {
IToken token;
address[] owners;
function totalBalance() public view returns (uint) {
uint total = 0;
for (uint i = 0; i < owners.length; i++) {
total += token.balanceOf(owners[i]);
}
return total;
}
}
This code defines an interface to check token balances and sums balances for a list of owners.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that calls
balanceOffor each owner. - How many times: Once for each owner in the
ownersarray.
As the number of owners grows, the total calls to balanceOf grow the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 calls to balanceOf |
| 100 | 100 calls to balanceOf |
| 1000 | 1000 calls to balanceOf |
Pattern observation: The work grows directly with the number of owners.
Time Complexity: O(n)
This means the time to run grows in a straight line as the number of owners increases.
[X] Wrong: "Using an interface makes the code run instantly regardless of input size."
[OK] Correct: Calling interface functions still takes time for each call, so more owners mean more calls and more time.
Understanding how interface calls scale helps you write efficient blockchain contracts and explain your reasoning clearly.
What if we changed the owners array to a mapping and tried to sum balances? How would the time complexity change?
Practice
What is the main purpose of an interface in blockchain smart contracts?
Solution
Step 1: Understand what an interface is
An interface only declares function names and their inputs/outputs but does not provide code inside them.Step 2: Identify the purpose in blockchain contracts
Interfaces ensure different contracts agree on function names and types to interact properly.Final Answer:
To define a set of function signatures without implementation -> Option AQuick Check:
Interface = function signatures only [OK]
- Thinking interfaces store data variables
- Confusing interfaces with executable code
- Believing interfaces create UI elements
Which of the following is the correct syntax to declare an interface named IPayment in Solidity?
?
Solution
Step 1: Recall interface syntax in Solidity
Interfaces use the keywordinterfaceand declare functions without bodies, markedexternal.Step 2: Check each option
interface IPayment { function pay() external; }correctly declares an interface with an external function without implementation. Versions usingcontractare wrong.interface IPayment { function pay() public {} }has a function body which is not allowed in interfaces.Final Answer:
interface IPayment { function pay() external; } -> Option AQuick Check:
Interface + external function + no body = correct syntax [OK]
- Using 'contract' instead of 'interface'
- Adding function bodies inside interfaces
- Using 'public' instead of 'external' in interface functions
Given the interface and contract below, what will be the output when calling getValue()?
interface IValue {
function getValue() external view returns (uint);
}
contract Value is IValue {
function getValue() external pure returns (uint) {
return 42;
}
}Solution
Step 1: Compare function signatures in interface and contract
The interface declaresgetValue()asview, but the contract implements it aspure. These must match exactly.Step 2: Understand Solidity rules for interface implementation
Function modifiers likeviewandpuremust match. Mismatch causes a compilation error.Final Answer:
Compilation error -> Option DQuick Check:
Modifier mismatch = compilation error [OK]
- Ignoring function modifier differences
- Assuming pure and view are interchangeable
- Expecting runtime error instead of compile error
Identify the error in the following Solidity code implementing an interface:
interface ICalculator {
function add(uint a, uint b) external returns (uint);
}
contract Calculator is ICalculator {
function add(uint a, uint b) public returns (uint) {
return a + b;
}
}Solution
Step 1: Check function visibility in interface and contract
The interface function is declared asexternal, but the contract function ispublic. These must match.Step 2: Understand Solidity interface implementation rules
Function visibility must be the same; otherwise, it causes a compilation error.Final Answer:
Function visibility mismatch between interface and contract -> Option BQuick Check:
Visibility mismatch = compilation error [OK]
- Using public instead of external in implementation
- Thinking interfaces cannot have parameters
- Ignoring 'is' keyword for inheritance
You want to create a contract Token that implements two interfaces IERC20 and IERC721. Which of the following is the correct way to declare this contract?
Solution
Step 1: Recall Solidity syntax for multiple interface inheritance
Solidity uses the keywordisto inherit from multiple interfaces or contracts.Step 2: Evaluate each option
contract Token is IERC20, IERC721 { /* implementation */ } correctly usesiswith both interfaces. contract Token implements IERC20, IERC721 { /* implementation */ } usesimplementswhich is invalid in Solidity. interface Token is IERC20, IERC721 { /* implementation */ } declaresTokenas an interface, not a contract. contract Token inherits IERC20, IERC721 { /* implementation */ } usesinheritswhich is not a Solidity keyword.Final Answer:
contract Token is IERC20, IERC721 { /* implementation */ } -> Option CQuick Check:
Use 'is' for multiple interface inheritance [OK]
- Using 'implements' instead of 'is'
- Declaring contract as interface by mistake
- Using non-existent keywords like 'inherits'
Ready to prove it?
Pass the test and this pattern moves unknown
