Solidity adalah static type language, yang artinya setiap variable harus memiliki type data. Solidity akan dicompile menjadi byte code, yang akan dijalankan diatas Ethereum Virtual Machine.
Beberapa hal umum tentang variable.
- Jika digunakan keyword public, maka otomatis akan dibuatkan function getter untuk mengakses value dari variable.
- Jika tidak didefinisikan, semuat type variable akan memiliki default value 0 atau ekuivalen. Contoh boolean variable tanpa inisialisasi akan diisi false.
Value Types
Boolean
Boolean pada Solidity bekerja seperti pada bahasa programming lainnya. Dapat bernilai True atau False. Digunakan untuk mengatur flow dalam conditional statements.
bool nama_variable
Operator untuk boolean yang dapat digunakan
- negation, menggunakan tanda !
- logical conjuction, menggunakan tanda &&
- logical disjunction, menggunakan tanda ||
- equality, menggunakan tanda ==
- inequality, menggunakan tanda !=
public attribute seperti dibawah, akan ototmatis dibuatkan function getter untuk mengakses value dari variable.
bool public nama_variable
Integer
Ada dua tipe integer, signed dan unsigned (int dan uint). Unsigned adalah nilai positif. Ukuran default 32 bytes.
Integer bisa dideklarasikan berdasarkan ukuran tertentu, mulai dari 8 hingga 256. Contoh: int8, int16, int32, int64, int128.
Jika tanpa inisialisasi, nilai default adalah 0.
Berikut contoh deklarasi integer yang valid
int my_int1
int16 my_int2
uint64 my_uint
Address
Ada dua macam address yaitu Externally Owned Account dan Contract Address. Address memiliki size 20 byte dimana memiliki fungsi dan property:
- Balance, untuk mendapatkan informasi balance.
- Transfer, untuk mengirim Ether dalam unit wei ke alamat yang dituju.
- Send, low level transfer, disarankan untuk menggunakan transfer.
- Call, digunakan untuk memanggil contract lainnya. Akan mengembalikan true jika fungsi berhasil dijalankan, false jika terjadi exception.
- Delegatecall, mendelegasikan function call pada address tertentu
Byte Arrays
Sesuai namanya, array of bytes. Ada dua cara deklarasi, fixed atau dynamic. Jika ukuran sudah pasti, gunakan fixed karena berpengaruh ke biaya gas.
Fixed size, definisikan byte dengan angka diantara 1-32.
byte[6] nama_variable
Dynamic size, didefinisikan tanpa nilai length dari array.
byte[] nama_variable
Enums
Type data yang didefinisikan oleh user. Tujuan dari enum adalah agar intent dari code menjadi lebih jelas.
Member dari enum dapat diconver secara eksplisit kedalam angka, dimana angka pertama adalah nol.
Aturan membuat enum adalah minimal memiliki satu anggota.
Berikut contoh membuat type variable ActionChoices.
enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
ActionChoices choice;
ActionChoices constant defaultChoice = ActionChoices.GoStraight;
Function Type
Digunakan untuk passing function sebagai parameter ke fungsi lainnya, atau sebagai return function dari function lainnya.
Function type berbeda dengan function declaration saat kita akan membuat fungsi. Berikut sintaks dari deklarasi function type.
function (<parameter types>) {internal|external} [pure|view|payable] [returns (<return types>)]
Function type ada dua macam:
- Internal, type default, hanya dapat dipanggil dari contract saat ini atau fungsi turunan.
- External, memiliki address, dapat dipanggil dari account atau contract lain.
Reference Types
Untuk reference type, perlu hati-hati dalam menggunakanya karena sensitif terhadap harga.
Arrays
Arrays dapat didefinisikan ukurannya atau dinamis. Array dinamis flexible untuk digunakan karena dapat diubah ukurannya kapan saja, dengan konsekuensi biaya gas yang lebih mahal.
//dynamic
a[]
//fixed size
a[4]
Array dapat disimpan dalam memory atau storage.
Storage array dapat menggunakan semua tipe data, sementara memory array dapat menggunakan semua tipe data kecuali mapping.
Untuk membuat memory array variable length digunakan new keyword.
uint[] memory a = new uint[](variable_length)
Variable_length dapat diditentukan pada runtime, namun setelah didefinisikan, ukuran Memory Array tidak bisa diubah. Jadi cukup flexible dan lebih murah biaya gas dibanding storage array.
Struct
struct adalah cara untuk membuat type data baru dengan kombinasi dari data type lain.
Contoh struct
struct Funder{
address addr;
uint amount;
}
struct Campaign{
address beneficiary;
unit fundingGoal;
unit numFunders;
unit amount;
mapping (uint => Funder) funders;
}
Mapping
Mapping dapat digambarkan seperti hash table. Merupakan mapping pasangan key dan value.
Key dapat menggunakan semua tipe data kecuali tipe data mapping, dynamic array, contract, enum atau struct.
Sementara value dapat menggunakan semua tipe data. Value akan menggunakan default value hingga nilai diassign kedalam value.
Key data tidak disimpan dalam mapping, tapi disimpan dalam keccack256 hash
Pada mapping tidak ada konsep length (tidak seperti array).
Berikut sintaks untuk mendeklarasikan mapping
mapping (_key => _value)
Units dan Global Variable
Units
Adalah conversion unit dan berupa global variables.
- Ether units: wei, finney, szabo dan ether.
- Time units: secoinds, minutes, hours, days, weeks dan years
Global Variables
Berikut list beberapa global variable yang umum digunakan
- msg.data (bytes): complete calldata.
- msg.gas (uint): jumlah gas yang tersedia.
- msg.sender(address): alamat sender message.
- msg.sig(bytes4): 4 byte pertama dari calldata.
- msg.value(uint): jumlah wei yang dikirim.
- tx.gasprice(uint): harga gas dari transaksi.
- tx.origin(address): alamat sender transaction.
- now(uint): block timestamp saat ini.
- block.difficulty(uint): block difficulty saat ini.
- block.gaslimit(uint): gas limit block saat ini.
Untuk lebih lengkap silakan cek dokumentasi solidity https://docs.soliditylang.org/en/v0.8.11/units-and-global-variables.html