Skip to main content

JavaScript'ten bir akıllı sözleşme çağırmak

İşlemler
ön yüz
JavaScript
web3.js
Acemi
jdourlens
19 Nisan 2020
3 dakikalık okuma

Bu öğreticide, JavaScript'ten bir akıllı sözleşme fonksiyonunun nasıl çağrılacağını göreceğiz. İlk önce bir akıllı sözleşmenin durumunu okuyoruz (örneğin bir ERC20 sahibinin bakiyesi), ardından bir token transferi yaparak blok zincirinin durumunu değiştireceğiz. Blok zinciri ile etkileşim kurmak için bir JavaScript ortamı kurmaya önceden aşina olmalısınız.

Bu örnekler için DAI token'ını ele alacağız, test amacıyla ganache-cli kullanarak blok zincirini çatallayacağız ve zaten çok fazla DAI içeren bir adresin kilidini açacağız:

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

Akıllı bir sözleşmeyle etkileşim kurmak için bir adrese ve ABI'ye ihtiyacımız olacak:

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"
Tümünü göster

Bu proje için, sadece balanceOf ve transfer fonksiyonunu korumak için tam ERC20 ABI'den bazı şeyleri çıkardık, ancak eksiksiz ERC20 ABI'ye buradanopens in a new tab ulaşabilirsiniz.

Daha sonra akıllı sözleşmemizi somutlaştırmamız gerekiyor:

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

Ayrıca iki adres kuracağız:

  • transferi alacak olan ve
  • zaten kilidini açtığımız, gönderecek olan:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"

Sonraki bölümde, her iki adresin de tuttuğu mevcut token miktarını almak için balanceOf fonksiyonunu çağıracağız.

Call: Bir akıllı sözleşmeden değer okuma

İlk satır bir "sabit" yöntemi getirecek ve akıllı sözleşme yöntemini herhangi bir işlem göndermeden EVM'de çalıştıracaktır. Bunun için bir adresin ERC20 bakiyesini okuyacağız. ERC20 token'ları hakkındaki makalemizi okuyun.

ABI'yi sağladığınız somutlaştırılmış akıllı sözleşme yöntemlerine aşağıdaki şekilde erişebilirsiniz: yourContract.methods.methodname. call fonksiyonunu kullanarak fonksiyonu yürütmenin sonucunu alacaksınız.

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})

DAI ERC20'nin 18 ondalık basamağa sahip olduğunu unutmayın; bu, doğru miktarı elde etmek için 18 sıfırı kaldırmanız gerektiği anlamına gelir. uint256, JavaScript büyük sayısal değerleri işlemediğinden dizgi olarak döndürülür. JS'de büyük sayılarla nasıl başa çıkacağınızdan emin değilseniz, bignumber.js hakkındaki öğreticimize bakınopens in a new tab.

Send: Akıllı sözleşme fonksiyonuna bir işlem gönderme

İkinci örnek için, ikinci adresimize 10 DAI göndermek için DAI akıllı sözleşmesinin transfer fonksiyonunu çağıracağız. Transfer fonksiyonu 2 parametreyi kabul eder: alıcı adres ve transfer edilcek token miktarı:

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 })
Tümünü göster

Çağırma fonksiyonu, blok zincirine kazılacak işlemin hash değerini döndürür. Ethereum'da işlem hash değerleri tahmin edilebilirdir: Bu sayede işlem yapılmadan önce işlemin hash değerini alabiliriz (hash değerinin nasıl hesaplandığını buradan öğrenebilirsinizopens in a new tab).

Fonksiyon yalnızca işlemi blok zincirine gönderdiğinden, ne zaman çıkarıldığını ve blok zincirine dahil edildiğini öğrenene kadar sonucu göremeyiz. Bir sonraki öğreticide, bir işlemin hash değerini öğrenerek işlemin blok zincirinde yürütülmesinin nasıl bekleneceğiniopens in a new tab öğreneceğiz.

Page last update: 23 Kasım 2023

Bu rehber yararlı oldu mu?