Pengenalan Struktur Smart Contract
Jika dibandingkan dengan programming language lainnya, Contract mirip dengan class.
Contract dapat berisi:
- State variables
- Functions
- Function modifiers
- Events
- Structs
- Enums
Contract juga dapat diturunkan dari contract lainnya.
Smart Contract Menggunakan Solidity
File solidity akan menggunakan extension .sol.
Pada baris pertama adalah pragma statement yang berguna untuk menunjukan versi solidity compiler.
pragma solidity ^0.4.10
Pragma statement diatas menunjukan versi compiler yang valid adalah dari 0.4.0 sampai 0.4.10.
Perhatian, versi pada statement pragma tidak mengubah versi compiler. Statement pragma hanya menginstruksikan compiler untuk memeriksa apakah versinya match dengan yang diminta oleh statement pragma. Jika tidak, compiler akan menampilkan error.
Berikutnya adalah contract declaration, menggunakan keyword contract diikuti nama contract.
pragma solidity ^0.4.10
contract NamaContract {
//code goes here
}
Konvensi penulisan nama contract menggunakan camel case, dan menggunakan nama file yang sama dengan nama contract. Pada contoh digunakan nama file NamaContract.sol
Baris pertama dalam contract umumnya adalah state variable declaration.
pragma solidity ^0.4.10
contract NamaContract {
uint value;
}
Berikutnya adalah mendefinisikan events. Events akan dibahas pada modul berikutnya.
pragma solidity ^0.4.10
contract NamaContract {
uint value;
event LogChange(uint newValue);
}
Bila ada modifiers, berikutnya adalah deklarasi modifiers.
pragma solidity ^0.4.10
contract NamaContract {
uint value;
event LogChange(uint newValue);
modifier onlyIfZero{
require(value==0);
_;
}
}
Setelah modifier, deklarasi functions.
Untuk nama fungsi contract constructor digunakan nama yang sama dengan nama contract. Sama seperti constructor pada class, fungsi constructor akan dijalankan saat contract di create.
pragma solidity ^0.4.10
contract NamaContract {
uint value;
event LogChange(uint newValue);
modifier onlyIfZero{
require(value==0);
_;
}
NamaContract(){
value = 1;
}
setStorage(uint newValue){
value = newValue;
}
}
Inline Assembly
Solidity mendukung inline assembly. Dengan menggunakan inline assembly kita memiliki control yang lebih detail terhadap EVM stack.
Berikut contoh penggunaan inline assembly:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
library GetCode {
function at(address _addr) public view returns (bytes memory o_code) {
assembly {
let size := extcodesize(_addr)
o_code := mload(0x40)
mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
mstore(o_code, size)
extcodecopy(_addr, add(o_code, 0x20), 0, size)
}
}
}
Inline assembly tidak dibahas dalam tutorial Ethereum dan Smart Contract Dasar.
Untuk lebih detail mengenai inline assembly, silakan kunjungi https://docs.soliditylang.org/en/v0.8.10/assembly.html