Dalam Solidity, variabel storage
dan memory
digunakan untuk menyimpan data, tetapi keduanya memiliki perbedaan mendasar dalam cara kerja, lokasi penyimpanan, dan biaya gas. Berikut adalah perbedaan antara variabel storage dan memory:
1. Lokasi Penyimpanan
- Storage:
- Data disimpan secara permanen di blockchain (Ethereum Virtual Machine - EVM).
- Bersifat persistent, artinya data tetap ada bahkan setelah eksekusi kontrak selesai.
- Digunakan untuk menyimpan variabel state (state variables), yaitu data yang ingin dipertahankan dalam kontrak.
- Memory:
- Data disimpan di memori sementara selama eksekusi fungsi.
- Bersifat non-persistent, artinya data akan hilang setelah fungsi selesai dijalankan.
- Digunakan untuk variabel lokal dalam fungsi atau parameter input/output fungsi.
2. Biaya Gas
-
Storage:
- Penyimpanan data di
storage
lebih mahal dibandingkanmemory
. - Karena data disimpan di blockchain secara permanen, setiap pembaruan membutuhkan lebih banyak gas untuk menulis atau membaca data.
- Penyimpanan data di
-
Memory:
- Lebih murah karena data hanya disimpan sementara dalam memori EVM selama eksekusi fungsi.
- Ideal untuk operasi sementara atau manipulasi data.
3. Cara Penggunaan
-
Storage:
- Digunakan untuk variabel yang dideklarasikan di luar fungsi (variabel state).
Contoh:
contract Example { uint public storedData; // Variabel state (disimpan di storage) function set(uint x) public { storedData = x; // Mengupdate storage } }
- Digunakan untuk variabel yang dideklarasikan di luar fungsi (variabel state).
-
Memory:
- Digunakan untuk variabel lokal dalam fungsi atau parameter input/output.
- Secara eksplisit, array, string, atau struktur data lainnya harus diberi keyword
memory
dalam fungsi.
Contoh:
contract Example { function process(uint[] memory numbers) public pure returns (uint) { uint sum = 0; for (uint i = 0; i < numbers.length; i++) { sum += numbers[i]; // Operasi di memory } return sum; } }
4. Modifikasi Data
-
Storage:
- Modifikasi data pada
storage
memengaruhi data permanen yang tersimpan di blockchain. - Contoh:
contract Example { uint[] public data; // Disimpan di storage function update() public { data.push(1); // Data di storage diperbarui } }
- Modifikasi data pada
-
Memory:
- Modifikasi data pada
memory
tidak memengaruhi data permanen di blockchain. - Contoh:
contract Example { uint[] public data = [1, 2, 3]; function modifyMemory() public view returns (uint[] memory) { uint[] memory temp = data; // Salin ke memory temp[0] = 99; // Hanya memengaruhi data di memory return temp; } }
- Modifikasi data pada
5. Default Behavior
- Variabel yang dideklarasikan di luar fungsi (
state variables
) secara default berada di storage. - Variabel lokal di dalam fungsi berada di memory secara default, kecuali tipe data kompleks (seperti array, string, atau struct), yang harus secara eksplisit dideklarasikan sebagai
memory
ataustorage
.
Kesimpulan
Aspek | Storage | Memory |
---|---|---|
Lokasi Penyimpanan | Permanen di blockchain | Sementara di memori EVM |
Persistent | Ya (tetap ada setelah eksekusi selesai) | Tidak |
Biaya Gas | Mahal (karena melibatkan blockchain) | Lebih murah |
Kegunaan | Variabel state (data jangka panjang) | Variabel lokal (data sementara) |
Deklarasi | Default untuk variabel state | Harus eksplisit untuk tipe kompleks |
Pemilihan antara storage dan memory bergantung pada kebutuhan data: gunakan storage
untuk data permanen dan memory
untuk data sementara.
Komentar
Posting Komentar