Ana içeriğe geç

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

İşlemlerön yüzJavaScriptweb3.js
Acemi
jdourlens
EthereumDev(opens in a new tab)
19 Nisan 2020
2 dakikalık okuma minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

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
Kopyala

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 buradan(opens 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)
Kopyala

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"
Kopyala

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

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ın(opens 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
Kopyala

Ç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 öğrenebilirsiniz(opens 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ğini(opens in a new tab) öğreneceğiz.

Son düzenleme: @UmuTR42(opens in a new tab), 23 Kasım 2023

Bu rehber yararlı oldu mu?