Langsung ke konten utama

Apa perbedaan Variable Storage and Variable Memory pada Solidity?

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 dibandingkan memory.
    • Karena data disimpan di blockchain secara permanen, setiap pembaruan membutuhkan lebih banyak gas untuk menulis atau membaca data.
  • 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
        }
    }
    
  • 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
          }
      }
      
  • 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;
          }
      }
      

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 atau storage.

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

Postingan populer dari blog ini

Membuat Aplikasi Web ASP.NET Core di Visual Studio 2022

Artikel ini membahas langkah-langkah membuat aplikasi ASP.NET Core menggunakan Visual Studio 2022 dan framework .NET 8. 1. Membuka Visual Studio 2022 Buka Visual Studio 2022 dan klik "Create a new project" di layar awal. 2. Memilih Template Proyek Di jendela "Create a new project" , pilih template ASP.NET Core Empty . Template ini memberikan struktur dasar tanpa konfigurasi awal seperti controller, view, atau API. Setelah itu, klik Next . 3. Konfigurasi Proyek Baru Isi informasi proyek seperti berikut: Project Name : Masukkan nama proyek, misalnya FirstCoreWebApplication . Location : Tentukan lokasi folder untuk menyimpan proyek, misalnya D:\Projects . Solution Name : Biasanya sama dengan nama proyek, tetapi bisa diubah jika diperlukan. Centang "Place solution and project in the same directory" jika solusi dan proyek ingin disimpan dalam satu folder. Klik Create untuk melanjutkan. 4. Pengaturan Tambahan Pada jendela "Additional Information...

Remix IDE: Solusi Praktis untuk Menulis dan Deploy Kontrak Pintar

Remix IDE  adalah lingkungan pengembangan terintegrasi berbasis web yang dirancang untuk menulis, mengompilasi, dan menyebarkan smart contract menggunakan bahasa pemrograman  Solidity  di blockchain Ethereum. Alat ini banyak digunakan oleh pengembang blockchain karena kemudahannya dalam menyediakan fitur lengkap untuk pengembangan, pengujian, dan debugging kontrak pintar. Fitur Utama Remix IDE Berbasis Web dan Gratis Tidak perlu diunduh atau diinstal. Anda dapat mengakses Remix langsung melalui browser di  remix.ethereum.org . Karena berbasis web, Remix dapat digunakan di berbagai perangkat selama ada akses internet. Editor Kode Mendukung penulisan kode Solidity dengan penyorotan sintaks, autocompletion, dan validasi kesalahan. Fitur penyorotan kesalahan (error highlighting) memudahkan pengembang untuk menemukan bug pada kode. Compiler Solidity Remix menyediakan compiler bawaan untuk mengonversi kode Solidity menjadi bytecode yang dapat dijalankan di Ethereum Virtual...

Perlu dicatat Built-in Global Variable pada Solidity

Solidity, sebagai bahasa pemrograman untuk membuat smart contract di Ethereum dan blockchain lainnya, menyediakan beberapa variabel global bawaan . Variabel ini memungkinkan akses mudah ke informasi tentang blockchain, transaksi, dan konteks eksekusi. Dengan menggunakan variabel ini, pengembang dapat berinteraksi dengan lingkungan blockchain tanpa perlu menulis banyak kode tambahan. Berikut penjelasan kategori dan variabel global yang umum digunakan: 1. Informasi Blockchain Variabel-variabel ini menyediakan informasi terkait blockchain, seperti blok saat ini dan propertinya. block.number Mengembalikan nomor blok saat ini. Contoh: uint nomorBlokSaatIni = block.number; block.timestamp Waktu pembuatan blok saat ini dalam format detik sejak Unix epoch. Biasanya digunakan untuk mendapatkan waktu saat ini. Contoh: require(block.timestamp >= waktuMulai, "Terlalu awal untuk eksekusi!"); block.difficulty Tingkat kesulitan penambangan pada blok saat ini. Contoh: uin...