Compile & Deploy Smart Contract pada Cardano IELE Testnet Menggunakan Visual Studio Code

Kembali lagi dengan EMURGO Indonesia edukasi. EMURGO adalah commercial arms dari Cardano blockchain. EMURGO mendorong adopsi ada Ada dan menambahkan value para pemegang Ada.

Kali ini kami akan menjelaskan langkah-langkah bagaimana caranya compile dan deploy smart contract ke testnet IELE milik Cardano. Testnet IELE adalah virtual machine smart contract pertama yang menggunakan formal semantics yang dikembangkan untuk tujuan memberikan keamanan dan kinerja lebih baik. Kita memakai IELE karena itu lebih aman dan lebih mudah untuk memverifikasi kebenarannya.

Baiklah, kita akan compile dan deploy smart contract ke IELE dengan menggunakan aplikasi seperti Visual Studio. Kita akan menggunakan Ubuntu 18.04, library mallet dan Node.js minimal versi 10.4.0.

Jika Anda sudah menginstal node.js, buatlah sebuah directory baru dan beri nama apa saja pada directory tersebut. Kami akan memberi nama project sebagai contohnya.

Buka command line Anda dan ketikkan mkdir project untuk membuat directory baru bernama project.

Image for post
Image for post

Setelah itu buka visual studio code dan buka folder project yang baru kita buat dengan mengklik File -> Open Folder dan pilih folder project.

Image for post
Image for post

Kemudian buka terminal pada vscode, dan ketikkan npm init. Npm akan meminta kita mengisi beberapa data project yang akan kita buat. Anda bisa mengisinya ataupun bisa melewatinya dengan menekan tombol enter. Dan pada pilihan terakhir ketik yes jika semua data sudah benar.

Image for post
Image for post

Command npm init tersebut akan secara otomatis membuat file package.json. File package.json tersebut berisi semua deskripsi dan dependencies pada project node.js kita.

Image for post
Image for post

Sekarang kita akan menginstall modul atau library mallet, karena kita membutuhkan library tersebut untuk koneksi ke IELE testnet Cardano. Ketik perintah berikut pada terminal npm install — save git+https://github.com/input-output-hk/mallet.git. Perintah tersebut untuk menginstall semua library yang ada pada mallet.

Image for post
Image for post

Setelah itu pada file package.json akan muncul dependencies mallet yang tadi kita install.

Image for post
Image for post

Sekarang buatlah directory baru bernama contracts pada project kita, directory contract tersebut akan berisi file Solidity yang nanti akan kita buat untuk menulis smart contract.

Klik icon + new folder untuk membuat folder baru dan beri nama dengan contracts. Buatlah file solidity dalam folder contracts dan beri nama file tersebut dengan readwrite.sol.

Kita akan membuat contract untuk menulis dan membaca data.

pragma solidity ^0.4.17;

contract readwrite {
string x;

function write(string _x) public {
x = _x;
}

function read() public view returns (string) {
return x;
}
}

Pragma solidity 0.4.17 adalah versi solidity yang kita pakai, dan disana kita membuat contract readwrite. Kemudian ada variabel string X. Dan untuk menulis data ke dalam blockchain kita membuat function write yang dimana jika kita input _X, maka nilai X = _X. Dan untuk membaca data yang sudah kita simpan, kita membuat function read yang akan membaca nilai X yang tadi dengan fungsi returns.

Image for post
Image for post

Jika sudah membuat contract, kita akan meng-compile contract tersebut. Buatlah file baru bernama compile.js.

Image for post
Image for post

Ketikkan code berikut pada compile.js

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);

const mallet = new Mallet(‘iele’, path.join(os.homedir()));

const compiled = mallet.iele.compile(‘contracts/readwrite.sol’);
console.log(compiled);

Pada code di atas kita akan menggunakan library mallet untuk mengcompile, dan kita lihat hasil compile nya pada console log. Dan sekarang running file tersebut dengan menggunakan command berikut node compile.js. Dan cek log nya pada terminal.

Image for post
Image for post

Hasil compile contract tersebut berisi data object dan bytecode. Bytecode inilah yang akan kita gunakan nantinya untuk men-deploy contract. Setelah kita compile contract, kita akan deploy contract tersebut. Tetapi sebelumnya kita harus mempunyai akun terlebih dahulu. Buatlah file baru bernama getAccount.js kemudian ketikkan code berikut.

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);
const mallet = new Mallet(‘iele’, path.join(os.homedir()));

const getAccount = async () => {
const newAccount = mallet.newAccount(‘samid oitesarp’);
console.log(newAccount);
};
getAccount();

Pada file getAccount.js tersebut kita membuat akun baru dengan command mallet.newAccount(‘samid oitesarp’) “samid oitesarp” adalah password akun tersebut, karena setiap akun wajib mempunyai password. Kemudian running file js tersebut dengan command node getAccount.js.

Image for post
Image for post

Pada terminal bisa kita lihat log nya adalah akun baru kita yang berhasil kita buat. Setelah itu kita akan memilih akun tersebut untuk kita gunakan. Modifikasi code pada file getAccount.js menjadi seperti berikut.

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);

const mallet = new Mallet(‘iele’, path.join(os.homedir()));

const getAccount = async () => {
const selectAccount = mallet.selectAccount(‘0x4ba65c6d3a89e51bb7696507786d678f25798eb4’);
console.log(selectAccount);
};

getAccount();

Kita memilih akun yang akan kita gunakan dengan menggunakan command mallet.selectAccount(‘AKUN YANG ANDA BUAT’). Jalankan file tersebut dengan ketik command berikut pada terminal node getAccount.js.

Image for post
Image for post

Kemudian karena akun tersebut baru kita buat, tidak ada saldo dalam akun tersebut. Kita bisa me-request saldo untuk mengisi saldo pada akun kita. Tapi ingat saldo tersebut hanyalah untuk test, yang berarti hanya bisa digunakan pada testnet, bukan pada mainnet. Modifikasi kembali code yang ada dalam getAccount.js menjadi seperti berikut ini.

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);

const mallet = new Mallet(‘iele’, path.join(os.homedir()));

const getAccount = async () => {
const requestFunds = mallet.requestFunds(‘0x4ba65c6d3a89e51bb7696507786d678f25798eb4’);
console.log(requestFunds);
};
getAccount();

Untuk meminta saldo pada faucet iele, kita menggunakan command mallet.requestFunds(‘AKUN ANDA’). Jalankan command node getAccount.js sebanyak 3 kali untuk me-request saldo sebanyak 3 kali.

Image for post
Image for post

Setelah kita request saldo, kita cek saldo nya apakah sudah masuk ke akun kita atau belum. Modifikasi file getAccount.js lagi menjadi sebagai berikut.

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);

const mallet = new Mallet(‘iele’, path.join(os.homedir()));

const getAccount = async () => {
const getBalance = mallet.getBalance(‘0x4ba65c6d3a89e51bb7696507786d678f25798eb4’);
console.log(getBalance);
};
getAccount();

Untuk mengecek saldo, kita menggunakan command mallet.getBalance(‘AKUN ANDA’). Kemudian running kembali dengan command node getAccount.js.

Image for post
Image for post

Bisa kita lihat saldo pada akun kita sudah bertambah menjadi 60000000000000000. Kita sudah selesai membuat akun dan menambahkan saldo pada akun kita. Sekarang saatnya kita men-deploy contract yang sudah kita buat.

Sebelum kita deploy contract, kita modifikasi terlebih dahulu code dalam compile.js menjadi seperti ini

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);
const util = require(‘util’);
const mallet = new Mallet(‘iele’, path.join(os.homedir()));

module.exports = mallet.iele.compile(‘contracts/readwrite.sol’);

Kita menambahkan module.export karena kita akan menghubungkan file compiler dengan file deploy nantinya.

Image for post
Image for post

Kemudian buatlah file baru bernama deploy.js lalu ketikkan code berikut

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);
const compiled = require(‘./compile’);
const sleep = require(‘sleep’);
const mallet = new Mallet(‘iele’, path.join(os.homedir()));

function awaitReceipt(hash) {
let h = hash;
let rec = mallet.getReceipt(h);
if (rec) {
return rec;
} else {
console.log(“awaiting receipt for “ + h);
sleep.sleep(5);
return awaitReceipt(h);
}
}

const deploy = async () => {

mallet.selectAccount(‘0x4ba65c6d3a89e51bb7696507786d678f25798eb4’);
const tx = {gas: 1000000, value: 0, code: compiled.bytecode, args: []}
const password = ‘samid oitesarp’;
Const deployedContract = await mallet.iele.deployContract(tx, password);
const callReceipt = awaitReceipt(deployedContract);
console.log(callReceipt);
};
deploy();

Ingatlah hal pertama yang kita lakukan adalah pilih akun yg akan kita gunakan terlebih dahulu dengan command selectAccount. Setelah itu buatlah konstanta tx yang berisi data object. Pada tx tersebut kita masukkan jumlah gas, value, code, dan args. Kita masukkan angka 1000000 untuk gas, karena jika kita mau deploy contract itu diperlukan gas. Setelah itu isi value : 0 karena kita tidak mentransfer apapun. Lalu isi code dengan compiled.bytecode. Compiled didapat dari file compile.js, hasil dari compile contract adalah data object yang di dalamnya terdapat bytecode. Yang kita gunakan untuk mengisi code hanyalah bytecode nya saja, maka code kita isi dengan compiled.bytecode. Kemudian buatlah konstanta password yang berisi password akun Anda. Setelah itu masukkan konstanta tadi ke dalam command mallet.iele.deployContract(tx, password). Command tersebut untuk mendeploy contract. Setelah mendeploy contract kita memerlukan contract address yang bisa kita dapat dengan menggunakan function awaitReceipt. Dalam function awaitReceipt itu kita terdapat command mallet.getReceipt(h) yang berarti kita akan menampilkan data object dari hash yang didapat setelah kita deploy contract.

Image for post
Image for post

Kemudian run pada terminal dengan menggunakan command node deploy.js

Image for post
Image for post

Bisa kita lihat di atas ada contract address, kita akan menggunakan contract address tersebut untuk memanggil fungsi dalam contract. Dan juga ada transaction hash, kita bisa mengecek contract yang telah kita deploy tersebut sudah masuk ke dalam testnet blockchain cardano. Buka IELE explorer pada link berikut https://iele-testnet.iohkdev.io

Image for post
Image for post

Kemudian copy transaction hash dari hasil deploy contract tadi, dan paste ke dalam kolom search pada IELE explorer.

Image for post
Image for post
Image for post
Image for post

Contract yang kita deploy sudah berada dalam blockchain. Sekarang kita lanjut untuk menjalankan fungsi dalam contract.

Buatlah file baru bernama callWrite.js dan ketikkan code berikut

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);
const sleep = require(‘sleep’);
const mallet = new Mallet(‘iele’, path.join(os.homedir()));

function awaitReceipt(hash) {
let h = hash;
let rec = mallet.getReceipt(h);
if (rec) {
return rec;
} else {
console.log(“awaiting receipt for “ + h);
sleep.sleep(5);
return awaitReceipt(h);
}
}

const callWrite = async () => {
mallet.selectAccount(‘0x4ba65c6d3a89e51bb7696507786d678f25798eb4’);
const password = ‘samid oitesarp’;
const fName = ‘write(string)’;
const args = [‘We are Emurgo !!!’];
const types = [‘string’];
const encodedArgs = args.map((v, i) => mallet.iele.enc(v, types[i]));
const txCallFunc = {to: ‘0xc1f6c1b326de576706bed41a6f9a0765ec08c18d’, value: 0, gas: 1000000, func: fName, args: encodedArgs};
const calledFunction = mallet.iele.callContract(txCallFunc, password);
const callReceipt = awaitReceipt(calledFunction);
console.log(callReceipt);
};
callWrite();

Seperti biasa kita tentukan terlebih dahulu akun yg digunakan. Untuk memanggil fungsi pada contract kita bisa menggunakan akun mana saja, karena contract sudah berada dalam blockchain jadi yang kita perlukan hanyalah contract address. Jika tidak ada contract address kita tidak akan tahu contract mana yang kita tuju. Pada code di atas terdapat konstanta fName yang berisi nama function dalam contract yaitu write(string).

Image for post
Image for post

Kemudian ada konstanta args yang berfungsi sebagai inputan untuk function write. Jadi kita ingin memasukkan sebuah tulisan “We are Emurgo !!!” kedalam blockchain melalui function write tersebut. Lalu ada txCallFunc yang berisi data object, di dalam nya kita isi to dengan contract address, lalu value kita isi 0 saja, gas kita isi 1000000, func kita isi dengan konstanta fName yang sudah kita buat tadi, lalu args kita isi dengan konstanta encodedArgs. Setelah itu kita jalankan function dengan menggunakan command mallet.iele.callContract dan kita panggil kembali function awaitReceipt untuk menampilkan hasil data object nya.

Image for post
Image for post
Image for post
Image for post

Sekarang kita cek kembali pada IELE explorer dengan transaction hash.

Image for post
Image for post

Yap, transaksi sudah berhasil. Dan sekarang kita akan membaca data yang tadi kita masukkan. Buatlah fie baru bernama callRead.js dan ketikkan code berikut

const Mallet = require(‘@iohk/mallet/lib/mallet.js’);
const path = require(‘path’);
const os = require(‘os’);
const mallet = new Mallet(‘iele’, path.join(os.homedir()));

const callRead = async () => {
const txCallFunc = {to: ‘0xb29d4a60698211904d514b3b9102ad9eee738730’, value: 0, gas: 1000000, func: ‘read()’, args: []};
const result = mallet.iele.constantCall(txCallFunc);
const decode = mallet.iele.dec(result[0], ‘string’)
console.log(decode);
};
callRead();

Sebenarnya untuk menjalankan function read ini kita bisa menggunakan cara yg sama dengan function write, hanya dibedakan saja function nya pada konstanta fName dan args nya di kosongkan. Tetapi untuk menjalankan function read ini, saya akan menggunakan command mallet.iele.constantCall. Karena pada function read kita hanya akan view data atau return data.

Image for post
Image for post

Dan hasilnya sebagai berikut

Image for post
Image for post
Image for post
Image for post

Yes, bisa kita lihat function read nya berfungsi, data “we are emurgo !!!” yang kita input tadi bisa kita tampilkan kembali.

Demikian EMURGO Indonesia Edukasi kali ini. Follow social media EMURGO Indonesia untuk mendapatkan informasi tentang Cardano blockchain, EMURGO Indonesia Edukasi tiap minggu nya dan informasi tentang EMURGO Indonesia dan EMURGO Global.

Tentang EMURGO

EMURGO mendorong adopsi Cardano dan menambah nilai bagi pemegang ADA dengan

membangun, berinvestasi, dan memberi masukan kepada proyek atau organisasi yang

mengadopsi ekosistem blockchain yang terdesentralisasi dari Cardano. EMURGO

memanfaatkan keahliannya dalam R&D blockchain serta jaringan global mitra blockchain dan industri terkait untuk mendukung usaha secara global.

EMURGO adalah badan komersial dan ventura resmi dari proyek Cardano, terdaftar di Tokyo,

Jepang sejak Juni 2017 dan di Singapura sejak Mei 2018. EMURGO berafiliasi secara unik dan

bekerja sama dengan IOHK untuk menumbuhkan ekosistem Cardano secara global dan

mempromosikan adopsi blockchain Cardano. .

Pelajari lebih lanjut tentang proyek ini di

https://emurgo.io

Untuk informasi lebih lanjut follow social media EMURGO Indonesia :

Twitter: https://twitter.com/emurgo_id

Facebook: https://www.facebook.com/emurgo.id/

Instagram: https://www.instagram.com/emurgo.id/

Medium : https://medium.com/@emurgo_id/

Written by

EMURGO Solusi Indonesia

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store