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:uint kesulitan = block.difficulty;
-
block.gaslimit
Jumlah maksimum gas yang dapat digunakan dalam blok saat ini.
Contoh:uint gasLimit = block.gaslimit;
-
block.coinbase
Alamat penambang (miner) yang menerima reward untuk blok saat ini.
Contoh:address penambang = block.coinbase;
2. Informasi Transaksi
Variabel-variabel ini memberikan detail tentang transaksi yang sedang berlangsung.
-
tx.gasprice
Harga gas untuk transaksi saat ini.
Contoh:uint hargaGas = tx.gasprice;
-
tx.origin
Alamat akun pengirim asli dari transaksi. Berbeda denganmsg.sender
, karenatx.origin
selalu merujuk ke pengirim asli, meskipun ada beberapa panggilan antar kontrak.
Contoh:require(tx.origin == pemilik, "Hanya pemilik kontrak yang dapat melakukan ini!");
Catatan: Hindari menggunakan
tx.origin
untuk otentikasi karena rentan terhadap serangan phishing.
3. Informasi Pesan (Call)
Variabel-variabel ini memberikan detail tentang pemanggilan fungsi atau pesan yang dikirim ke kontrak.
-
msg.sender
Alamat akun atau kontrak yang memanggil fungsi.
Contoh:address pemanggil = msg.sender;
-
msg.value
Jumlah Ether (dalam wei) yang dikirim bersama transaksi.
Contoh:require(msg.value == 1 ether, "Kirim tepat 1 Ether!");
-
msg.data
Data panggilan lengkap (calldata) dari fungsi yang dipanggil.
Contoh:bytes data = msg.data;
-
msg.sig
4 byte pertama dari calldata, yang mewakili tanda tangan fungsi.
Contoh:bytes4 tandaTangan = msg.sig;
4. Informasi Gas
Variabel-variabel ini memberikan informasi tentang gas yang digunakan atau tersedia selama eksekusi.
gasleft()
Mengembalikan jumlah gas yang tersisa untuk transaksi saat ini.
Contoh:uint gasTersisa = gasleft();
5. Informasi Kontrak
Variabel-variabel ini memberikan informasi tentang kontrak yang sedang dieksekusi.
-
address(this)
Alamat kontrak saat ini.
Contoh:address alamatKontrak = address(this);
-
this.balance
Saldo (dalam wei) kontrak saat ini.
Contoh:uint saldoKontrak = address(this).balance;
6. Variabel Kontekstual Lainnya
blockhash(uint blockNumber)
Mengembalikan hash dari nomor blok tertentu. Hanya berfungsi untuk 256 blok terbaru.
Contoh:bytes32 hashBlok = blockhash(block.number - 1);
Catatan Penggunaan
- Efisiensi Gas: Gunakan variabel global secara bijaksana karena beberapa (seperti
blockhash
) mungkin memerlukan biaya gas tambahan. - Keamanan: Hindari menggunakan variabel seperti
block.timestamp
atautx.origin
untuk logika penting, seperti menghasilkan angka acak atau otentikasi, karena dapat dimanipulasi.
Variabel global bawaan ini mempermudah pengembangan kontrak pintar yang responsif dan kontekstual!
Komentar
Posting Komentar