Study
Solidity

Storage vs Memory vs Calldata

Penjelasan

Solidity punya TIGA lokasi data yang WAJIB dipahami: `storage` (data permanen di blockchain, PALING MAHAL karena ditulis selamanya — dipakai variabel state), `memory` (data sementara yang hidup selama function berjalan, jauh lebih murah, dipakai untuk parameter/variabel lokal yang MUNGKIN diubah), dan `calldata` (mirip memory tapi READ-ONLY, khusus parameter function `external`, PALING MURAH karena data tidak disalin sama sekali). Parameter bertipe reference (array, struct, string, mapping) WAJIB ditandai salah satu dari tiga ini secara eksplisit.

Contoh Konsep

contract Contoh {
    uint256[] public dataStorage;   // otomatis storage, karena variabel state

    function ubahMemory(uint256[] memory data) public pure returns (uint256) {
        data[0] = 99;   // cuma mengubah SALINAN sementara di memory, tidak permanen
        return data[0];
    }

    function bacaCalldata(uint256[] calldata data) external pure returns (uint256) {
        // data[0] = 99; // ERROR! calldata read-only, tidak bisa diubah
        return data[0];
    }
}

Praktikum

Buat function external bernama jumlahkanCalldata(uint256[] calldata angka) yang menjumlahkan seluruh isi array parameter calldata tersebut.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Kalau function-mu `external` dan parameternya TIDAK PERLU diubah di dalam function, selalu pilih `calldata` daripada `memory` — perbedaannya bisa menghemat gas signifikan karena calldata tidak perlu menyalin data ke memory terlebih dahulu.