When fetching data from a storage location, assigning the data to a memory
variable causes all fields of the struct/array to be read from storage, which incurs a Gcoldsload
(2,100 gas) for each field of the struct/array. If the fields are read from the new memory variable, they incur an additional MLOAD
rather than a cheap stack read. Instead of declaring the variable with the memory
keyword, declaring the variable with the storage
keyword and caching any fields that need to be re-read in stack variables, will be much cheaper, only incurring the Gcoldsload
for the fields actually read. The only time it makes sense to read the whole struct/array into a memory
variable is if the full struct/array is being returned by the function, is being passed to a function that requires memory
, or if the array/struct is being read from another memory
array/struct.
There are 10 instances of this issue.
File Link | Instance Count | Instance Links |
---|---|---|
Lender.sol | 10 | 117,238,296,363,367,441,467,552,606,611 |
42,000 gas
baudit: a custom static code analysis tool; manual review
Use storage
instead of memory
for structs and arrays.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.