Lewati ke konten utama

Berinteraksi dengan blockchain menggunakan ethers.js

ethers.js adalah sebuah library JavaScript yang memungkinkan developer untuk berinteraksi dengan jaringan blockchain yang kompatibel dengan EVM.

Anda dapat menggunakan ethers.js untuk berinteraksi dengan smart contract yang telah di-deploy di jaringan Lisk.

Instalasi

Untuk menginstal ethers.js, jalankan perintah berikut:

npm install --save ethers

Setup

Sebelum Anda dapat mulai menggunakan ethers.js, Anda perlu mengimpornya ke dalam proyek Anda.

Tambahkan baris kode berikut di bagian atas file Anda untuk mengimpor ethers.js:

const ethers = require('ethers');

Hubungkan ke Lisk

Anda dapat terhubung ke Lisk dengan menginisialisasi objek JsonRpcProvider baru dari ethers.js menggunakan URL RPC jaringan Lisk:

const ethers = require('ethers');

const url = 'https://rpc.sepolia-api.lisk.com';
const provider = new ethers.JsonRpcProvider(url);
catatan

Provider (dalam ethers.js) adalah sebuah kelas yang menyediakan abstraksi untuk koneksi ke Jaringan Ethereum. Provider memberikan akses read-only ke Blockchain dan statusnya.

Membaca data dari blockchain

Setelah Anda membuat provider, Anda dapat menggunakannya untuk membaca data dari jaringan Lisk.

Sebagai contoh, Anda dapat menggunakan metode getBlockNumber untuk mendapatkan block terbaru:

async function getLatestBlock() {
const latestBlock = await provider.getBlockNumber();
console.log("The latest block's number is:", latestBlock);
}

getLatestBlock();
Contoh kode lengkap:
const ethers = require('ethers');

// Untuk jaringan Lisk Sepolia
const url = 'https://rpc.sepolia-api.lisk.com';

// Untuk jaringan Lisk
// const url = 'https://rpc.api.lisk.com';

const provider = new ethers.JsonRpcProvider(url);

async function getLatestBlock() {
const latestBlock = await provider.getBlockNumber();
console.log("The latest block's number is:", latestBlock);
}

getLatestBlock();

Untuk menulis data ke jaringan Lisk, Anda perlu membuat sebuah Signer.

catatan

Signer adalah sebuah kelas yang (biasanya) secara langsung atau tidak langsung memiliki akses ke private key, yang dapat menandatangani pesan dan transaksi untuk mengizinkan jaringan membayar ether dari akun Anda untuk melakukan operasi.

Anda dapat membuat sebuah Signer dengan menginisialisasi objek Wallet baru dari ethers.js, serta memberikan private key dan Provider kepada objek tersebut.

const privateKey = 'PRIVATE_KEY';
const signer = new ethers.Wallet(privateKey, provider);
const receiver = '0x5e1A92F84cA1CE280B3Cb29d79C3368f45b41EBB';
// Kirim 0,01 ether ke alamat yang diberikan.
async function sendTx(to) {
const tx = await signer.sendTransaction({
to: to,
value: ethers.parseEther("0.01")
});

console.log(tx);
}

//sendTx(receiver);
info

PRIVATE_KEY adalah private key dari akun yang akan digunakan saat membuat objek signer.

Saldo akun penerima akan bertambah sebanyak 0,01 ETH setelah eksekusi transaksi berhasil.

Contoh kode lengkap:
const ethers = require('ethers');

// Untuk jaringan Lisk Sepolia
const url = 'https://rpc.sepolia-api.lisk.com';

// Untuk jaringan Lisk
// const url = 'https://rpc.api.lisk.com';

const provider = new ethers.JsonRpcProvider(url);
// Gantilah PRIVATE_KEY dengan private key dari akun Anda.
const privateKey = 'PRIVATE_KEY';
const signer = new ethers.Wallet(privateKey, provider);
const receiver = '0x5e1A92F84cA1CE280B3Cb29d79C3368f45b41EBB';
// Kirim 0,01 ether ke alamat yang diberikan.
async function sendTx(to) {
const tx = await signer.sendTransaction({
to: to,
value: ethers.parseEther("0.01")
});

console.log(tx);
}

sendTx(receiver);

Berinteraksi dengan smart contract

Anda dapat menggunakan ethers.js untuk berinteraksi dengan smart contract di Lisk dengan menginisialisasi objek Contract menggunakan ABI dan alamat dari contract yang telah di-deploy:

tip

ABI dari sebuah contract dapat ditemukan di halaman contract terkait di BlockScout.

Sebagai contoh, Anda dapat menggunakan ABI untuk Contract Hello. Cukup scroll ke bagian Contract ABI dan salin ABI dari contract yang telah di-deploy.

Membaca dari contract
// Gantilah nilai `contractAddress` dengan alamat contract yang diinginkan.
const contractAddress = "CONTRACT_ADDRESS"
// read-only
const contract = new ethers.Contract(contractAddress, abi, provider);
const abi = [
// ABI dari contract yang telah di-deploy.
];

async function getHello() {
const value = await contract.message("0x3C46A11471f285E36EE8d089473ce98269D1b081");
console.log(value.toString());
}

getHello();
info

CONTRACT_ADDRESS adalah alamat dari contract yang telah di-deploy.

catatan

Contract (dalam ethers.js) adalah sebuah abstraksi yang mewakili koneksi ke contract tertentu di Jaringan Lisk, sehingga aplikasi dapat menggunakannya seperti objek JavaScript biasa.

Untuk membaca dan menulis contract, gunakan objek Signer untuk menggantikan objek Provider:

Menulis ke contract
// read & write
const contract = new ethers.Contract(contractAddress, abi, signer);

Setelah Anda membuat objek Contract, Anda dapat menggunakannya untuk memanggil metode yang diinginkan pada smart contract:

async function createHello(message) {
const tx = await contract.createHello(message);
return tx.hash;
}

//createHello("Hello Lisk!");
tip

Untuk gambaran umum tentang fungsi publik yang ada pada contract, silakan cek tab Read Contract dan Write Contract untuk contract spesifik tersebut.

Contoh kode lengkap:
const ethers = require('ethers');

// Untuk jaringan Lisk Sepolia
const url = 'https://rpc.sepolia-api.lisk.com';

// Untuk jaringan Lisk
// const url = 'https://rpc.api.lisk.com';

const provider = new ethers.JsonRpcProvider(url);
const privateKey = 'PRIVATE_KEY';
const signer = new ethers.Wallet(privateKey, provider);
const contractAddress = "0xb18eb752813c2fbedfdf2be6e5e842a85a3b8539"
// Read & Write
const contract = new ethers.Contract(contractAddress, abi, signer);
// Read-only
//const contract = new ethers.Contract(contractAddress, abi, provider);
const abi = [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "message",
"type": "string"
}
],
"name": "NewHello",
"type": "event"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "blacklist",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "counter",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_message",
"type": "string"
}
],
"name": "createHello",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "maxLength",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "message",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "minLength",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string[]",
"name": "_newBlackList",
"type": "string[]"
}
],
"name": "setBlacklist",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint32",
"name": "_newMin",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "_newMax",
"type": "uint32"
}
],
"name": "setMinMaxMessageLength",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]

async function createHello(message) {
const tx = await contract.createHello(message);
return tx.hash;
}

//createHello("Hello Lisk!");

async function getHello() {
const value = await contract.message("0x3C46A11471f285E36EE8d089473ce98269D1b081");
console.log(value.toString());
}

getHello();