Lanjut ke konten utama

Memanggil kontrak pintar dari JavaScript

transaksifrontendJavaScriptweb3.js
Pemula
jdourlens
EthereumDev(opens in a new tab)
19 April 2020
3 bacaan singkat minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

Dalam panduan ini kita akan melihat bagaimana cara memanggil fungsi kontrak pintar dari JavaScript. Yang pertama adalah membaca state kontrak pintar (mis. saldo pemilik ERC20), kemudian kita akan mengubah state blockchain tersebut dengan membuat transfer token. Anda seharusnya sudah tidak asing lagi dengan menyiapkan lingkungan JS untuk berinteraksi dengan blockchain.

Untuk contoh ini kita akan menggunakan token DAI, untuk kepentingan pengujian kita akan melakukan fork blockchain menggunakan ganache-cli dan membuka 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 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
Salin

Untuk proyek ini kita membongkar ABI ERC20 yang sudah lengkap dan hanya menyisakan fungsi balanceOf dan transfer tapi Anda bisa menemukan ABI ERC20 yang lengkap di sini(opens in a new tab).

Kita kemudian perlu membuat instance kontrak pintarnya:

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

Kita juga akan menyiapkan dua alamat:

  • satu yang akan menerima transfer dan
  • satu yang kita buka sebelumnya sebagai pengirim:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
Salin

Selanjutnya kita akan memanggil fungsi balanceOf untuk mengambil jumlah token saat ini yang dimiliki kedua alamat tersebut.

Call: Membaca nilai dari kontrak pintar

Contoh pertama akan memanggil metode "konstan" dan mengeksekusi metode kontrak pintarnya dalam EVM tanpa mengirim 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 beserta instancenya yang untuknya Anda menyediakan ABI sebagai berikut: yourContract.methods.methodname. Dengan menggunakan fungsi call Anda akan menerima hasil dari eksekusi fungsi.

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

Ingat bahwa ERC20 DAI memliki 18 desimal yang berarti Anda harus menghapus 18 nol untuk mendapatkan hasil yang benar. uint256 are returned as strings as JavaScript does not handle big numeric values. Apabila Anda tidak yakin cara menangani angka besar dalam JS, lihat tutorial tentang bignumber.js(opens in a new tab).

Kirim: Mengirim transaksi kepada 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 ditransfer:

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

Fungsi call mengembalikan hash transaksi yang akan ditambang ke dalam blockchain. Di Ethereum, hash transaksi dapat diperkirakan - itulah cara kita bisa mendapatkan hash transaksi sebelum eksekusinya (pelajari cara menghitung hash di sini(opens in a new tab)).

Karena fungsi hanya mengirimkan transaksi ke dalam blockchain, kita tidak dapat melihat hasilnya sampai kita tahu kapan transaksi ditambang dan dimasukkan ke dalam blockchain. Dalam tutorial selanjutnya kita akan mempelajari bagaimana cara menunggu transaksi agar dieksekusi dalam blockchain dengan mengetahui hashnya(opens in a new tab).

Terakhir diedit: @reinholland88(opens in a new tab), 15 Agustus 2023

Apakah tutorial ini membantu?