Ads Area

Belajar Dasar-Dasar Solidity & Cara Membuat Smartcontract untuk Pemula

Apa itu Solidity?

    Solidity adalah bahasa pemograman object-oriented programming (OOP) tingkat tinggi yang didesain untuk web3 development khususnya untuk membuat smart contract di jaringan Ethereum. 

    Solidity merupakan bahasa pemrograman yang memungkinkan Ethereum untuk memperluas teknologi blockchainnya yang berbeda dengan Bitcoin. 

    Solidity diusulkan pada tahun 2014 oleh Dr. Gavin Wood, yang bekerja sama dengan Vitalik Buterin untuk mengembangkan Ethereum. Solidity adalah bahasa pemograman dari kontrak pintar yang dijalankan sendiri di blockchain layer 2. Tapi sekarang etheruem telah merge, hanya ada satu jaringan blockchain. Melihat sebagai aplikasi terdesentralisasi atau DApps, Solidity adalah bahasa yang digunakan untuk membangun segala sesuatu mulai dari platform keuangan terdesentralisasi ( DeFi ) hingga permainan kripto dan alat manajemen rantai pasokan. 

    Pada dasarnya, apa pun yang berjalan di Ethereum Virtual Machine — mesin komputasi terisolasi Ethereum di mana semua kontrak pintar dibuat, dijalankan, dan dieksekusi — dapat, dan sebagian besar, dibangun menggunakan bahasa Solidity. 

Tentang Solidity? 

    Solidity adalah bahasa pemograman populer yang digunakan dalam ekosistem Ethereum. Solidity adalah bahasa pemogram tingkat tinggi dengan dasar C++, Python, dan JS. Jika kamu terbiasa menggunakan bahasa pemograman tersebut maka kamu akan lebih mudah dalam mempelajari Solidity. Solidity adalah codingan yang ditulis secara statis (tidak dapat dirubah) sehingga pemeriksaan jenis membutuhkan banyak waktu. Tidak seperti bahasa pemograman lain yang ditulis secara dinamis, yang dapat dengan mudah diganti melalui fitur seperti merge, push, atau commit di git.

Apa Kelebihan Solidity? 

    Solidity memiliki sejumlah kelebihan yang membantu membangun ekosistem Ethereum menjadi raksasa. Untuk satu hal, solidity memang dirancang agar cukup mudah digunakan oleh siapa saja yang memiliki pengetahuan dasar tentang bahasa pemrograman seperti Javascript atau C++. 

    Untuk yang lain, kontrak pintarnya dibangun di atas blockchain, sehingga tidak dapat diubah atau dihapus. Itu berarti bahwa Ethereum adalah cara yang sangat aman untuk melakukan apa yang dirancang untuk dilakukan — mentransfer apa pun yang berharga, baik menggunakan token Ether asli atau token ERC-20 yang kompatibel tetapi berlabel putih untuk membayar transaksi tersebut.

Apa Kekurangan Solidity? 

    Solidity bagai pedang bermata dua, karena itu berarti bahwa kontrak pintar Solidity apa pun harus ditulis dengan sempurna . Seperti yang sering dikatakan oleh pakar desain kripto: “Kode adalah hukum.” 

    Kesalahan tidak dapat diperbaiki, transaksi tidak dapat dibatalkan, dan eksploitasi hanya dapat diperbaiki dengan memperbarui kode Ethereum — yang membutuhkan partisipasi setiap node yang cukup rumit, setidaknya tidak dengan cepat. Itu adalah masalah dengan peretasan DAO 2016 yang menghabiskan $60 juta pada tahun 2016 menggunakan kerentanan EVM yang disebut re-entrancy — salah satu dari sejumlah eksploitasi yang diketahui — sama seperti masalah pada peretasan 27 Agustus 2021 yang menyebabkan percabangan di blockchain Ethereum. Dalam kedua kasus, eksploitasi diketahui dan perbaikan telah dirilis saat dieksploitasi. 

    Pada bulan Juli, pertukaran mata uang kripto AS terbesar, Coinbase, merilis alat bernama Solidify , yang digunakan untuk mendeteksi dan mengklasifikasikan risiko kontrak pintar, sebuah audit otomatis. Seperti namanya, alat ini bertujuan untuk meningkatkan kontrak pintar Solidity dengan menemukan kelemahan potensialnya — sesuatu yang dilakukan Coinbase dalam tinjauan protokol yang ketat namun memakan waktu yang tokennya sedang dipertimbangkan untuk didaftarkan.

Memahami Dasar-Dasar Solidity: 
    
Smart contract yang dibuat dengan menggunakan Solidity biasanya terdiri dari: 
  • Direktif Pragma (Arahan Pragma) 
  • State Variable (Status variable) 
  • Fungtion (fungsi) 
  • Program 
    Meskipun masih ada banyak lagi yang perlu kamu ketahui untuk dapat membuat program smart contract yang bersifat industri, hal-hal di atas dapat membantu kamu dalam mempelajari prinsip dasar Solidity dengan mudah. 

    Jika kamu memiliki pengalaman yang cukup tentang konsep-konsep ini, maka kamu akan dapat dengan mudah menulis smart contract untuk berbagai kasus. 
  • Directive Pragma 
    Pragma adalah kata kunci yang digunakan untuk mengaktifkan fitur atau pemeriksaan kompiler tertentu. Directive pragma selalu lokal ke file sumber, jadi kamu harus menambahkan pragma ke semua file milikmu jika kamu ingin mengaktifkannya di seluruh proyekmu. Jika kamu mengimpor file lain, pragma dari file tersebut tidak secara otomatis berlaku untuk file yang diimpor. 

Versi Pragma 

    File sumber dapat (dan harus) dianotasi dengan versi pragma untuk menolak kompilasi dengan versi kompiler masa depan yang mungkin memperkenalkan perubahan yang tidak kompatibel. Kita mencoba untuk menjaga ini agar tetap minimum dan memperkenalkannya sedemikian rupa sehingga perubahan dalam semantik juga memerlukan perubahan dalam sintaks, tetapi ini tidak selalu memungkinkan. Karena itu, selalu untuk pastikan untuk menyertakan versi terbaru Solidity dalam definisi kontrak cerdas buatanmu. Rilis ini selalu memiliki versi bentuk 0.x.0atau x.0.0. 

Versi direktif pragma akan terlihat seperti ini: 
pragma solidity ^0.7.0;
File sumber dengan baris di atas tidak dikompilasi dengan kompiler lebih awal dari versi 0.7.0, dan juga tidak bekerja pada kompiler mulai dari versi 0.8.0 (kondisi kedua ini ditambahkan dengan menggunakan ^). Karena tidak akan ada perubahan yang mengganggu hingga version 0.8.0, kamu dapat yakin bahwa kode kamu dikompilasi seperti yang kamu inginkan. Versi kompiler yang tepat tidak diperbaiki, sehingga rilis perbaikan bug masih dimungkinkan. 

Catatan: 
Menggunakan pragma versi tidak mengubah versi kompiler. Itu juga tidak mengaktifkan atau menonaktifkan fitur kompiler. Itu hanya menginstruksikan kompiler untuk memeriksa apakah versinya cocok dengan yang dibutuhkan oleh pragma. Jika tidak cocok, kompilator akan mengeluarkan kesalahan. 
  • State Variable 
State variable adalah variabe yang nilainya disimpan secara permanen dalam penyimpanan kontrak.
pragma solidity ^0.5.0;
contract SolidityTest {
   uint storedData;      // State variable
   constructor() public {
      storedData = 10;   // Using State variable
   }
}
Dalam contoh ini, variabel status diberi nama storedData dengan jenis uint. Uint jenis bilangan bulat menunjukkan bahwa variabel ini adalah bilangan bulat tidak bertanda dengan 256 bit. Itu berarti Uint dapat menyimpan angka positif dalam kisaran 0 hingga 2256 -1.
  • Function
    Dalam smart contract, unit kode yang dapat dieksekusi dinamai dengan function. Fungtion atau fungsi ini menjelaskan suatu tindakan untuk mencapai suatu tugas. Fungsi juga dapat dipanggil dari file sumber lain seperti library. Function dalam Solidity mirip dengan bahasa pemograman pada umumnya.

Syntax
Berikut ini adalah syntax dasar dari Solidity:
function function-name(parameter-list) scope returns() {
   //statements
}
Contoh 
Coba perhatikan contoh berikut. Syntax ini mendefinisikan fungsi yang disebut dengan getResult yang tidak menggunakan parameter.
pragma solidity ^0.5.0;

contract Test {
   function getResult() public view returns(uint){
      uint a = 1; // local variable
      uint b = 2;
      uint result = a + b;
      return result;
   }
}
Contoh Memanggil Fungsi
pragma solidity ^0.5.0;

contract SolidityTest {   
   constructor() public{       
   }
   function getResult() public view returns(string memory){
      uint a = 1; 
      uint b = 2;
      uint result = a + b;
      return integerToString(result); 
   }
   function integerToString(uint _i) internal pure 
      returns (string memory) {
      
      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;
      
      while (j != 0) {
         len++;
         j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;
      
      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i /= 10;
      }
      return string(bstr);//access local variable
   }
}
Jalankan program di atas dan akan menghasilkan output:
0: String: 3

Pengubah Fungction
Fungsi Solidity dapat memiliki pernyataan pengembalian opsional . Ini diperlukan jika kamu ingin mengembalikan nilai dari suatu fungsi. Pernyataan ini harus menjadi pernyataan terakhir dalam suatu fungsi.

Seperti pada contoh di atas, kita menggunakan fungsi uint2str untuk mengembalikan sebuah string.
Dalam Solidity, suatu fungsi juga dapat mengembalikan beberapa nilai. Lihat contoh di bawah ini:
pragma solidity ^0.5.0;

contract Test {
   function getResult() public view returns(uint product, uint sum){
      uint a = 1; // local variable
      uint b = 2;
      product = a * b;
      sum = a + b;
  
      //alternative return statement to return 
      //multiple values
      //return(a*b, a+b);
   }
}
Jalankan program di atas dan akan menghasilkan output: 
0: uint256: product 2 
1: uint256: sum 3
  • Event
    Event adalah anggota kontrak yang dapat diwarisi. Suatu event dipancarkan, menyimpan argumen yang diteruskan dalam log transaksi. Log ini disimpan di blockchain dan dapat diakses menggunakan alamat kontrak hingga kontrak ada di blockchain. Suatu peristiwa yang dihasilkan tidak dapat diakses dari dalam kontrak, bahkan yang telah membuat dan memancarkannya pun tidak.

Sebuah event dapat dideklarasikan menggunakan kata kunci event.
//Declare an Event
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);

//Emit an event
emit Deposit(msg.sender, _id, msg.value);
Contoh
Coba kode berikut untuk memahami cara kerja event di Solidity.
Pertama Buat kontrak dan pancarkan event.
pragma solidity ^0.5.0;

contract Test {
   event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
   function deposit(bytes32 _id) public payable {      
      emit Deposit(msg.sender, _id, msg.value);
   }
}
Kemudian akses acara kontrak dalam kode JavaScript.
var abi = /* abi as generated using compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceiptContract = ClientReceipt.at("0x1234...ab67" /* address */);

var event = clientReceiptContract.Deposit(function(error, result) {
   if (!error)console.log(result);
});
Itu akan mencetak detail yang mirip dengan output berikut ini:

{
   "returnValues": {
      "_from": "0x1111...FFFFCCCC",
      "_id": "0x50...sd5adb20",
      "_value": "0x420042"
   },
   "raw": {
      "data": "0x7f...91385",
      "topics": ["0xfd4...b4ead7", "0x7f...1a91385"]
   }
}


Cara Membuat Smart Contract di Testnet untuk Pemula
  • Menulis code sederhana
Sekarang, mari kita membuat kontrak pintar sederhana. Smart contract yang kita buat nanti akan memungkinkan kita untuk menyimpan bilangan bulat yang tidak ditandatangani dan mengambilnya. 

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.0 <0.7.0;
contract SimpleStorage {
    uint storedData;
    function set(uint x) public {
        storedData = x;
    }
    function get() public view returns (uint) {
        return storedData;
    }
}
Cuplikan kode di atas adalah kontrak pintar yang ditulis dalam bahasa Solidity. Mari luangkan waktu sejenak untuk memahami apa yang dilakukan kode yang kita tulis di kontrak pintar kita baris demi baris.
Baris 1 : Menentukan jenis lisensi SPDX , yang merupakan tambahan setelah Solidity ^0.6.8; kapan pun kode sumber kontrak cerdas tersedia untuk umum, lisensi ini dapat membantu menyelesaikan/menghindari masalah hak cipta. Jika kamu tidak ingin menentukan jenis lisensi apa pun, kamu dapat menggunakan nilai khusus UNLICENSED atau cukup lewati seluruh komentar (tidak akan menghasilkan kesalahan, hanya peringatan).

Baris 2: Pada baris pertama kita mendeklarasikan compiler Solidity mana yang ingin kita gunakan. Misalnya, kita menargetkan versi apa pun antara 0.4.0 dan <0.7.0 .

Baris 3: Kita mendeklarasikan kontrak pintar di sini dan menamakannya sebagai Simplestorage. Ini adalah praktik normal untuk menggunakan nama file yang sama dengan nama kontrak. Misalnya - kontrak ini akan disimpan dalam nama file SimpleStorage.sol (.sol adalah ekstensi file untuk kontrak pintar soliditas).

Baris 4 : Kita mendeklarasikan variabel uint (Unsigned Integer) bernama storedData, variabel ini akan digunakan untuk menyimpan data.

Baris 5-7 : Selanjutnya, kita akan menambahkan fungsi set , yang dengannya kita akan mengubah nilai variabel storeData . Di sini fungsi set menerima parameter x yang nilainya, kita simpan ke storeData. Selain itu, fungsi tersebut ditandai sebagai publik yang artinya fungsi tersebut dapat dipanggil oleh siapa saja.

Baris 8-10 : Kita akan menambahkan fungsi get untuk mengambil nilai variabel storeData . Fungsi ini ditandai sebagai tampilan yang memberi tahu kompiler Solidity bahwa ini adalah fungsi hanya-baca. 
Selain itu fungsi get juga memiliki return (uint) , yang artinya fungsi tersebut akan mengembalikan uint 
  • Deploy Smart Contract
Setelah menulis kontrak pintar yang perlu diterapkan di jaringan ethereum, kita akan menerapkan kontrak pintar sederhana tersebut menggunakan Remix. Ada cara lain untuk menerapkan kontrak pintar, tetapi untuk membuatnya ramah bagi pemula, kita akan menggunakan Remix. Remix adalah IDE Ethereum web online. Ini sederhana dan mendukung banyak fungsi. Jadi buka Remix menggunakan tautan ini . Remix memiliki plugin, kita perlu mengaktifkan dua plugin untuk mengkompilasi dan menyebarkan kontrak pintar kita yang dapat kamu lihat pada gambar di bawah..

Sekarang kita telah mengaktifkan kedua plugin

Selanjutnya, buat file di Remix dengan nama SimpleStorage.sol dan salin/tempel kode kontrak pintar kita.

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.0 <0.7.0;
contract SimpleStorage {
    uint storedData;
    function set(uint x) public {
        storedData = x;
    }
    function get() public view returns (uint) {
        return storedData;
    }
}
Sekarang, mari kita kompilasi kontrak pintar kita menggunakan plugin Remix.

Klik “Compile SimpleStorage.sol” untuk mengkompilasi kontrak.

Akhirnya, kita sekarang dapat menerapkan kontrak pintar SimpleStorage. Kemudian kita akan men-deploy kontrak pintar di Ropsten testnet. Blockchain memiliki banyak jaringan publik. Salah satunya adalah jaringan publik utama, yang biasa kita sebut mainnet. Block chain lainnya untuk tujuan pengujian, yang biasanya kita sebut testnets.

Kita dapat menggunakan hampir semua klien Ethereum, seperti Geth atau OpenEthereum (fka Parity), untuk tujuan kita hari ini. Karena itu agak terlalu rumit untuk mengambil log, kita hanya akan mengambil titik akhir gratis dari QuickNodeuntuk membuat ini mudah. Kita memerlukan titik akhir Ropsten untuk mendapatkan data dari rantai karena kita telah menerapkan kontrak kita di testnet Ropsten. Setelah kamu membuat titik akhir ethereum gratis, salin titik akhir Penyedia HTTP kamu:

Sekarang kita akan menyebarkan kontrak pintar buatan sendiri di testnet Ropsten. Untuk memulai, kamu memerlukan ekstensi browser Metamask untuk membuat dompet ETH dan beberapa tes ETH, yang bisa kamu dapatkan dengan membuka faucet Ropsten . Kamu harus memilih Ropsten Test Network di dompet Metamask dan copy-paste alamat dompet ke kolom teks di faucet, lalu klik Send me test Ether.

Sekarang, mari tambahkan node kita ke Metamask:

Langkah 1: Buka Metamask, klik menu jaringan di atas, dan pilih RPC kustom.

Langkah 2: Masukkan nama jaringan (Bisa berupa nama pilihan kamu, QuickNode dalam contoh ini), Tempel URL titik akhir QuickNode kamu di bidang kedua yang bertuliskan URL RPC Baru, Masukkan ID Rantai, yang juga dikenal sebagai jaringan id (3 di sini karena kita menggunakan titik akhir Ethereum Ropsten), dan klik simpan.

Sekarang, kembali ke remix, buka tab ketiga di menu sebelah kiri, dan pilih Injected Web3 di bawah opsi ENVIRONMENT.

Klik deploy, dan sekarang jendela Metamask harus terbuka untuk mengonfirmasi transaksi.

Setelah kamu mengklik konfirmasi, mungkin perlu beberapa saat agar transaksi disetujui. Setelah dikonfirmasi, kamu harus melihat pesan konfirmasi transaksi di konsol remix dan kontrak yang diterapkan di bawah bagian Deployed Contracts.

Jadi sekarang kita telah berhasil membuat dan menerapkan kontrak pintar yang ditulis dalam Solidity ke blockchain, kamu dapat merujuk Dokumentasi Solidity untuk informasi lebih lanjut.

Nah itu tadi adalah pembahasan kita tentang dasar dasar Solidity dan cara membuat smart contract untuk pemula.