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:
- Lisk
- Lisk Sepolia
const ethers = require('ethers');
const url = 'https://rpc.api.lisk.com';
const provider = new ethers.JsonRpcProvider(url);
const ethers = require('ethers');
const url = 'https://rpc.sepolia-api.lisk.com';
const provider = new ethers.JsonRpcProvider(url);
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();
Menulis data ke blockchain
Untuk menulis data ke jaringan Lisk, Anda perlu membuat sebuah Signer
.
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);
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:
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.
// 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();
CONTRACT_ADDRESS
adalah alamat dari contract yang telah di-deploy.
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
:
// 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!");
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();