Lompat ke konten utama

Memanggil kontrak pintar dari JavaScript

transaksi
frontend
JavaScript
web3.js
Pemula
jdourlens
19 April 2020
3 menit baca

Dalam tutorial ini kita akan melihat cara memanggil fungsi kontrak pintar dari JavaScript. Pertama adalah membaca status kontrak pintar (misalnya, saldo pemegang ERC20), kemudian kita akan memodifikasi status blockchain dengan melakukan transfer token. Anda seharusnya sudah familier dengan menyiapkan lingkungan JS untuk berinteraksi dengan blockchain.

Untuk contoh ini kita akan bermain dengan token DAI, untuk tujuan pengujian kita akan melakukan fork pada blockchain menggunakan ganache-cli dan membuka kunci alamat yang sudah memiliki banyak DAI:

ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81

Untuk berinteraksi dengan kontrak pintar, kita akan membutuhkan alamat dan ABI-nya:

1const ERC20TransferABI = [
2 {
3 constant: false,
4 inputs: [
5 {
6 name: "_to",
7 type: "address",
8 },
9 {
10 name: "_value",
11 type: "uint256",
12 },
13 ],
14 name: "transfer",
15 outputs: [
16 {
17 name: "",
18 type: "bool",
19 },
20 ],
21 payable: false,
22 stateMutability: "nonpayable",
23 type: "function",
24 },
25 {
26 constant: true,
27 inputs: [
28 {
29 name: "_owner",
30 type: "address",
31 },
32 ],
33 name: "balanceOf",
34 outputs: [
35 {
36 name: "balance",
37 type: "uint256",
38 },
39 ],
40 payable: false,
41 stateMutability: "view",
42 type: "function",
43 },
44]
45
46const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
Tampilkan semua

Untuk proyek ini, kami memangkas ABI ERC20 yang lengkap dan hanya menyimpan fungsi balanceOf dan transfer, tetapi Anda dapat menemukan ABI ERC20 lengkap di sini (opens in a new tab).

Kita kemudian perlu menginstansiasi kontrak pintar kita:

1const web3 = new Web3("http://localhost:8545")
2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)

Kita juga akan menyiapkan dua alamat:

  • alamat yang akan menerima transfer dan
  • alamat yang sudah kita buka kuncinya yang akan mengirimkannya:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"

Pada bagian selanjutnya, kita akan memanggil fungsi balanceOf untuk mengambil jumlah token saat ini yang dimiliki oleh kedua alamat tersebut.

Panggilan: Membaca nilai dari kontrak pintar

Contoh pertama akan memanggil metode "konstan" dan mengeksekusi metode kontrak pintarnya di EVM tanpa mengirimkan transaksi apa pun. Untuk ini, kita akan membaca saldo ERC20 dari sebuah alamat. Baca artikel kami tentang token ERC20.

Anda dapat mengakses metode kontrak pintar yang diinstansiasi yang telah Anda berikan ABI-nya sebagai berikut: yourContract.methods.methodname. Dengan menggunakan fungsi call, Anda akan menerima hasil dari eksekusi fungsi tersebut.

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("An error occurred", err)
4 return
5 }
6 console.log("The balance is: ", res)
7})

Ingatlah bahwa DAI ERC20 memiliki 18 desimal yang berarti Anda perlu menghapus 18 nol untuk mendapatkan jumlah yang benar. uint256 dikembalikan sebagai string karena JavaScript tidak menangani nilai numerik yang besar. Jika Anda tidak yakin cara menangani angka besar di JS, periksa tutorial kami tentang bignumber.js (opens in a new tab).

Kirim: Mengirim transaksi ke fungsi kontrak pintar

Untuk contoh kedua, kita akan memanggil fungsi transfer dari kontrak pintar DAI untuk mengirim 10 DAI ke alamat kedua kita. Fungsi transfer menerima dua parameter: alamat penerima dan jumlah token yang akan ditransfer:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("An error occurred", err)
6 return
7 }
8 console.log("Hash of the transaction: " + res)
9 })
Tampilkan semua

Fungsi panggilan mengembalikan hash dari transaksi yang akan ditambang ke dalam blockchain. Di Ethereum, hash transaksi dapat diprediksi - begitulah cara kita bisa mendapatkan hash dari transaksi sebelum dieksekusi (pelajari cara hash dihitung di sini (opens in a new tab)).

Karena fungsi tersebut hanya mengirimkan transaksi ke blockchain, kita tidak dapat melihat hasilnya sampai kita tahu kapan transaksi tersebut ditambang dan dimasukkan ke dalam blockchain. Dalam tutorial berikutnya, kita akan belajar cara menunggu transaksi dieksekusi di blockchain dengan mengetahui hash-nya (opens in a new tab).

Pembaruan terakhir halaman: 21 Oktober 2025

Apakah tutorial ini membantu?