Event filtering in Blockchain / Solidity - Time & Space Complexity
When working with blockchain events, filtering helps us find specific information quickly.
We want to know how the time to filter events changes as the number of events grows.
Analyze the time complexity of the following code snippet.
// Assume events is an array of event objects
function filterEvents(events, targetAddress) {
let filtered = [];
for (let i = 0; i < events.length; i++) {
if (events[i].address === targetAddress) {
filtered.push(events[i]);
}
}
return filtered;
}
This code goes through all events and collects those matching a specific address.
- Primary operation: Looping through each event once.
- How many times: Exactly once for every event in the list.
As the number of events grows, the time to check each event grows too.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 checks |
| 100 | 100 checks |
| 1000 | 1000 checks |
Pattern observation: The number of operations grows directly with the number of events.
Time Complexity: O(n)
This means the time to filter events grows in a straight line as the number of events increases.
[X] Wrong: "Filtering events is instant no matter how many events there are."
[OK] Correct: Each event must be checked, so more events mean more work and more time.
Understanding how filtering scales helps you explain how blockchain apps handle large data efficiently.
"What if events were stored in a map by address? How would the time complexity change?"
Practice
What is the main purpose of event filtering in blockchain applications?
Solution
Step 1: Understand event filtering concept
Event filtering allows you to listen only to events that match specific parameters or conditions.Step 2: Identify the main purpose
This helps reduce unnecessary data processing and improves app performance by focusing on relevant events.Final Answer:
To listen only to specific events that match certain criteria -> Option DQuick Check:
Event filtering = selective listening [OK]
- Confusing event filtering with event creation
- Thinking event filtering speeds up mining
- Believing event filtering encrypts data
Which of the following is the correct syntax to filter events by a parameter named user in a blockchain event listener?
contract.events.Transfer({ filter: { ??? } })Solution
Step 1: Understand filter syntax
Filters use an object with key-value pairs where keys are parameter names and values are filter values.Step 2: Match correct syntax
The correct syntax is an object with the parameter name as key and the desired value, like { user: '0x123...' }.Final Answer:
{ user: '0x123...' } -> Option AQuick Check:
Filter = object with key-value pairs [OK]
- Using array or string instead of object for filters
- Writing filter as assignment instead of object
- Omitting quotes around string values
Given the following code snippet, what events will be received?
contract.events.Transfer({ filter: { from: '0xabc...' }, fromBlock: 100, toBlock: 200 })Assuming events with from address '0xabc...' occurred at blocks 90, 150, and 210.
Solution
Step 1: Analyze filter parameters
The filter listens for events where 'from' equals '0xabc...'. The block range is from 100 to 200.Step 2: Check event blocks against filter
Events at blocks 90 and 210 are outside the block range, so only the event at block 150 matches both filter and block range.Final Answer:
Only event at block 150 -> Option AQuick Check:
Filter + block range = event at block 150 only [OK]
- Ignoring block range and including all matching events
- Including events outside the block range
- Confusing filter parameter with block number
Identify the error in this event filter code snippet:
contract.events.Approval({ filter: { owner: 0xabc123 }, fromBlock: 'latest' })Solution
Step 1: Check filter parameter types
Filter values must be strings for addresses, but 0xabc123 is missing quotes, so it's treated as a variable or number.Step 2: Validate other parts
The event name and fromBlock usage are valid; fromBlock can be 'latest'. Filter should be an object, not an array.Final Answer:
The filter value 0xabc123 should be a string -> Option BQuick Check:
Address filter values must be strings [OK]
- Omitting quotes around address strings
- Thinking fromBlock 'latest' is invalid
- Using array instead of object for filter
You want to listen to Transfer events where the value is greater than 1000 tokens. Which approach correctly filters these events?
// Assume event signature: Transfer(address from, address to, uint256 value)
Solution
Step 1: Understand filter limitations
Event filters only support exact matches or arrays of values, not comparison operators like greater than.Step 2: Choose correct approach
To filter by value > 1000, you must receive events first and then check the value in your code logic.Final Answer:
Filter events after receiving all by checking value > 1000 in code -> Option CQuick Check:
Filters do exact matches; use code for range checks [OK]
- Trying to use comparison operators in filter
- Assuming string '>1000' works as filter
- Confusing block range with value filtering
Ready to prove it?
Pass the test and this pattern moves unknown
