Receiving Ether in Blockchain / Solidity - Time & Space Complexity
When a smart contract receives Ether, it runs code to handle the incoming payment.
We want to understand how the time it takes grows as more Ether transfers happen.
Analyze the time complexity of the following Solidity code snippet.
contract ReceiveEther {
event Received(address sender, uint amount);
receive() external payable {
emit Received(msg.sender, msg.value);
}
}
This contract receives Ether and emits an event each time it happens.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The receive function runs once per Ether transfer.
- How many times: It runs exactly once for each incoming payment.
Each Ether transfer triggers the receive function once, doing a fixed amount of work.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 calls to receive() |
| 100 | 100 calls to receive() |
| 1000 | 1000 calls to receive() |
Pattern observation: The total work grows directly with the number of transfers.
Time Complexity: O(n)
This means the total time grows linearly with the number of Ether transfers received.
[X] Wrong: "The receive function runs once and handles all Ether transfers at once."
[OK] Correct: Each transfer triggers the receive function separately, so the work adds up with each payment.
Understanding how contract functions run per transaction helps you explain how blockchain handles many users efficiently.
"What if the receive function also updated a growing list of senders? How would the time complexity change?"
Practice
What is the main purpose of the receive function in a Solidity contract?
Solution
Step 1: Understand the role of the receive function
The receive function is a special function in Solidity that is triggered when the contract receives Ether without any calldata.Step 2: Identify its purpose
Its purpose is to accept Ether sent directly to the contract without any function call data.Final Answer:
To accept Ether sent to the contract without any data -> Option DQuick Check:
receive function = accept Ether without data [OK]
- Confusing receive with fallback function
- Thinking receive sends Ether out
- Assuming receive initializes variables
Which of the following is the correct syntax for a receive function in Solidity?
?
Solution
Step 1: Recall receive function requirements
The receive function must be declared as external and payable to accept Ether without data.Step 2: Match syntax
receive() external payable {} matches the required syntax:receive() external payable {}.Final Answer:
receive() external payable {} -> Option BQuick Check:
receive must be external and payable [OK]
- Using public instead of external
- Omitting payable keyword
- Making receive internal or private
Consider this Solidity contract snippet:
contract Test {
event Received(address sender, uint amount);
receive() external payable {
emit Received(msg.sender, msg.value);
}
}What happens when someone sends 1 Ether to this contract without calling any function?
Solution
Step 1: Analyze the receive function
The receive function is payable and emits an event with sender and amount when Ether is received without data.Step 2: Understand the behavior on Ether transfer
Sending 1 Ether without data triggers receive, so Ether is accepted and event emitted.Final Answer:
The contract accepts the Ether and emits the Received event -> Option CQuick Check:
receive payable + emit event = accept and notify [OK]
- Thinking fallback is called instead
- Assuming no event is emitted
- Believing Ether is rejected
Identify the error in this Solidity contract snippet that prevents it from receiving Ether:
contract Example {
receive() public payable {
// code
}
}Solution
Step 1: Check receive function visibility
The receive function must be declared as external, not public.Step 2: Confirm payable requirement
It is correctly marked payable, so no error there.Final Answer:
receive function must be external, not public -> Option AQuick Check:
receive must be external, not public [OK]
- Using public instead of external
- Removing payable keyword
- Adding return type to receive
You want to create a contract that tracks the total Ether received and rejects any Ether sent with data. Which combination of functions should you implement?
Solution
Step 1: Accept Ether without data using receive
The receive function accepts Ether sent without data and can update total received.Step 2: Reject Ether sent with data using fallback
The fallback function should revert to reject any Ether sent with data.Final Answer:
Implement receive() external payable to accept Ether and fallback() external to revert on data -> Option AQuick Check:
receive accepts plain Ether, fallback rejects data [OK]
- Making fallback payable and accepting Ether with data
- Omitting fallback to reject data
- Not marking receive payable
Ready to prove it?
Pass the test and this pattern moves unknown
