What is the difference between Memory and Storage ?
From both the EVM point of view and the contract design one.
Thanks!
What is the difference between Memory and Storage ?
From both the EVM point of view and the contract design one.
Thanks!
Memory is temporary. Storage is permanent. For example, you would perform intermediate computations using memory, and then save the result to storage.
Storage is a key/value store where keys and values are both 32 bytes. It is sparse (like a hash table), and there are no inherent gas savings from having two 32 byte values next to each other. Storing one of the values at key 1 and the other at key 1000, costs the same amount of gas as storing them at key 1 and key 2. (Gas savings from packing storage are still possible, such as fitting 2 uint128 values within a single key, instead of using 2 keys.)
Memory is a byte-array. Memory starts off zero-size, but can be expanded in 32-byte chunks by simply storing memory at indices greater than its current size. Since memory is contiguous, it does save gas to keep it packed and shrink its size, instead of having large patches of zeros. It's cheaper to have an array of length 2 storing 2 values, than an array of length 1000 where the values are at the ends of the array and the middle is all zeros.
The subtleties wiki explains further the gas costs for using memory:
The fee for expanding memory is determined via a subtract-the-integrals method. Specifically, TOTALFEE(SZ) = SZ * 3 + floor(SZ**2 / 512) is the total fee for expanding the memory to SZ 32-byte chunks (note: partially filled chunks are counted, so 33 bytes = 2 chunks), and if a particular operation expands memory from size x to y, the additional gas cost is TOTALFEE(y) - TOTALFEE(x)
Storage gas costs are primarily: 20,000 gas when a value is set to non-zero from zero; 5,000 gas when writing to existing storage or setting a value to zero; and a 15,000 gas refund when a non-zero value is set to zero.
EDIT: EIP-2200 finalized in 2018 has further explanations on storage costs, such as 800 gas for "storing" the same value.
They are analogous to memory and hard drive storage in a computer. The contract can use any amount of memory (as long as it can pay for it of course) during executing its code, but when execution stops, the entire content of the memory is wiped, and the next execution will start fresh. The storage on the other hand is persisted into the blockchain itself, so the next time the contract executes some code, it has access to all the data it previously stored into its storage area.
memory is like RAM of your code, which holds the data in it till the execution of your function, once the function execution is over it is removed.On the other hand storage is like the database which exists in the blockchain independent of the function execution.
uint128[1] memory t; t[0] = 10;in my function, the gas cost calling it is 21581. When if I remove those 2 lines from the function(which will be totally empty), now it's 21394. There is like 187 Gas difference. I just used 1-2 slots maximum. Putting 2 in the formula , we get 6. Any idea ? – Nika Kurashvili Jan 20 '21 at 15:55