Sama seperti function pada bahasa pemograman lainnya function adalah block code yang melakukan tugas tertentu. Perbedaanya terdapat keyword untuk accessibility dari function.
Berikut syntax untuk membuat function.
function nama_fungsi (parameters)
[internal | external | private | public]
[pure | constant | view | payable]
[modifiers]
[returns(return_types)]
{
//code goes here
}
Untuk parameters, mirip dengan bahasa java. Berikut contoh penulisan parameter yang valid.
string name; function setName(string _name){ name = _name; }
Accessbility
- internal: hanya dapat diakses didalam contract atau contract turunan.
- private : hanya dapat diakses didalam contract.
- public : tidak ada batasan akses.
- external: hanya dapat diakses dari luar contract, kecuali digunakan keyword this.
Returns Value
Untuk menuliskan return value ada dua pendekatan.
Menuliskan type data.
string name; function getName() returns(string) { return name; }
Menuliskan type data dan return value. Pada body function, tidak perlu digunakan keyword return.
string name; function getName() returns(string _name) { _name = name; }
constant / view
constant artinya fungsi tidak mengubah nilai state. Jadi fungsi diatas harus ditulis seperti berikut.
Dapat menggunakan keyword constant atau view. Karena tidak melakukan perubahan state, maka fungsi constant tidak memerlukan gas.
string name; function getName() constant returns(string) { return name; }
pure
pure function tidak mengubah atau membaca state. Sama seperti fungsi pada bahasa programming lainnya. pure function adalah fungsi yang self contained.
Contoh, fungsi untuk melakukan perhitungan suatu nilai.
function f(uint a, uint b) pure returns (uint) { return a * (b + 10); }
payable
Function yang menangani ether harus menggunakan keyword payable.
Function yang menangani ether tapi tidak ditandai sebagai payable akan menyebabkan error.
uint balance; function deposit() public payable { balance += msg.value; }
Function Modifiers
Modifiers ada block code yang dapat dijalankan sebelum atau sesudah sebuah function call.
Modifiers berguna untuk memodifikasi behaviour sebuah fungsi, contoh:
- Mengatur akses terhadap suatu fungsi.
- Validasi input
- Mencegah hack
Untuk membuat modifier digunakan syntax
modifier nama_modifier{
// _;
// code goes here
// _;
}
Tanda underscore “_” berguna untuk mengatur kapan modifier dijalankan.
- Diakhir modifier, fungsi akan dijalankan setelah modifier.
- Diawal modifier, fungsi akan dijalankan sebelum modifier.
Berikut contoh modifier onlyOwner, yang digunakan untuk restrict access fungsi setName. Hanya owner yang dapat menjalankan fungsi setName
string name; address owner; modifier onlyOwner { require(msg.sender == owner); _; } function setName() onlyOwner { return name; }
Overload Function
Overload function berarti kita bisa memiliki beberapa fungsi dengan nama yang sama, namum berbeda parameter.
Overload function juga dapat dilakukan untuk fungsi yang diturunkan. Fungsi pada child contract akan meng-override parent contract.
Contoh overloading function
function f(uint _i) pure returns (uint out) { out = 1; } function f(uint _i, bytes32 _key) pure returns (uint out) { out = 2; }