Reference types behavior in Blockchain / Solidity - Time & Space Complexity
When working with reference types in blockchain code, it's important to see how operations on these types affect performance.
We want to know how the time to run code changes as the size of the data referenced grows.
Analyze the time complexity of the following code snippet.
struct Data {
uint[] values;
}
function sumValues(Data storage data) public view returns (uint) {
uint total = 0;
for (uint i = 0; i < data.values.length; i++) {
total += data.values[i];
}
return total;
}
This function sums all numbers stored in a dynamic array inside a struct passed by reference.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each element in the array
data.values. - How many times: Once for every element in the array, so as many times as the array length.
As the array gets bigger, the function does more additions, one per element.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 additions |
| 100 | 100 additions |
| 1000 | 1000 additions |
Pattern observation: The work grows directly with the number of elements. Double the elements, double the work.
Time Complexity: O(n)
This means the time to run the function grows in a straight line with the size of the array.
[X] Wrong: "Since the struct is passed by reference, the function runs in constant time regardless of array size."
[OK] Correct: Passing by reference avoids copying data but the loop still visits every element, so time grows with array length.
Understanding how reference types affect time helps you explain performance clearly and shows you know how data size impacts blockchain functions.
"What if the function only summed the first 10 elements regardless of array size? How would the time complexity change?"
Practice
Solution
Step 1: Understand reference assignment
Assigning one reference type variable to another makes both point to the same data location in memory.Step 2: Effect of changes through references
Changes made through either variable affect the same original data because they share the reference.Final Answer:
Both variables point to the same data location. -> Option DQuick Check:
Reference assignment shares data location = A [OK]
- Thinking assignment copies data
- Assuming variables become independent
- Believing original data is deleted
Solution
Step 1: Understand storage vs memory in Solidity
Storage variables hold data permanently on blockchain, memory variables are temporary copies.Step 2: Correct way to copy reference
Assigning a storage reference variable to another storage variable copies the reference, not the data.Final Answer:
uint[] storage newArray = oldArray; -> Option CQuick Check:
Storage assignment copies reference = B [OK]
- Using 'memory' copies data, not reference
- Assuming .copy() method exists
- Trying to use undefined copy functions
uint[] storage arr1 = someArray;
uint[] storage arr2 = arr1;
arr2.push(10);
uint length = arr1.length;
What is the value of
length after execution?Solution
Step 1: Understand reference assignment
arr2 is assigned as a storage reference to arr1, so both point to the same array.Step 2: Effect of push on arr2
Pushing 10 to arr2 modifies the shared array, increasing its length by 1.Final Answer:
Length increases by 1 due to push on arr2. -> Option BQuick Check:
Shared reference means push affects both = C [OK]
- Thinking arr1 length stays same
- Assuming arr2 is a copy
- Ignoring reference sharing behavior
function updateArray(uint[] memory arr) public {
uint[] storage ref = arr;
ref.push(5);
}Solution
Step 1: Check assignment between memory and storage
In Solidity, you cannot assign a memory array directly to a storage reference variable.Step 2: Understand push operation
Push is allowed on storage arrays, but assignment error occurs before push.Final Answer:
Cannot assign memory array to storage reference directly. -> Option AQuick Check:
Memory to storage assignment invalid = A [OK]
- Assuming memory can be assigned to storage
- Thinking push is disallowed on storage
- Ignoring data location mismatch
Solution
Step 1: Understand data locations for copying
To avoid changing original storage array, create a new memory array and copy elements.Step 2: Modify and return the memory array
Modify the memory array safely and return it without affecting storage data.Final Answer:
Create a new memory array, copy elements from storage, modify it, then return. -> Option AQuick Check:
Use memory copy to avoid changing storage = D [OK]
- Modifying storage reference directly
- Returning storage array after modification
- Using global variables unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
