Ana içeriğe atla

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

işlemler
ön yüz
JavaScript
web3.js
Başlangıç
jdourlens
19 Nisan 2020
3 dakikalık okuma

Bu eğitimde JavaScript'ten bir akıllı sözleşme işlevinin nasıl çağrılacağını göreceğiz. İlk olarak bir akıllı sözleşmenin durumunu okuyacağız (örneğin, bir ERC-20 sahibinin bakiyesi), ardından bir Token transferi yaparak Blokzincir durumunu değiştireceğiz. Blokzincir ile etkileşime girmek için bir JS ortamı kurma konusuna zaten aşina olmalısınız.

Bu örnek için DAI Token'ı ile oynayacağız, test amacıyla ganache-cli kullanarak Blokzincir'de çatallanma yaratacağız ve halihazırda çok fazla DAI'ye sahip olan bir adresin kilidini açacağız:

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

Bir akıllı sözleşme ile etkileşime girmek için onun adresine ve ABI'sine ihtiyacımız olacak:

Bu proje için tam ERC-20 ABI'sini sadece balanceOf ve transfer işlevini tutacak şekilde kırptık, ancak tam ERC-20 ABI'sini burada bulabilirsiniz (opens in a new tab).

Daha sonra akıllı sözleşmemizin bir örneğini oluşturmamız gerekiyor:

const web3 = new Web3("http://localhost:8545")

const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)

Ayrıca iki adres ayarlayacağız:

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

Bir sonraki bölümde, her iki adresin de elinde tuttuğu mevcut Token miktarını almak için balanceOf işlevini çağıracağız.

Çağrı: Bir akıllı sözleşmeden değer okumak

İlk örnek "sabit" (constant) bir metodu çağıracak ve herhangi bir işlem göndermeden akıllı sözleşme metodunu EVM'de yürütecektir. Bunun için bir adresin ERC-20 bakiyesini okuyacağız. ERC-20 Token'ları hakkındaki makalemizi okuyun.

ABI'sini sağladığınız örneklendirilmiş bir akıllı sözleşme metoduna şu şekilde erişebilirsiniz: yourContract.methods.methodname. call işlevini kullanarak işlevin yürütülmesinin sonucunu alacaksınız.

daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
  if (err) {
    console.log("An error occurred", err)
    return
  }
  console.log("The balance is: ", res)
})

DAI ERC-20'nin 18 ondalık basamağa sahip olduğunu unutmayın, bu da doğru miktarı elde etmek için 18 sıfırı kaldırmanız gerektiği anlamına gelir. JavaScript büyük sayısal değerleri işlemediği için uint256 dize (string) olarak döndürülür. Eğer JS'de büyük sayılarla nasıl başa çıkacağınızdan emin değilseniz bignumber.js hakkındaki eğitimimize göz atın (opens in a new tab).

Gönder: Bir akıllı sözleşme işlevine işlem göndermek

İkinci örnek için, ikinci adresimize 10 DAI göndermek üzere DAI akıllı sözleşmesinin transfer işlevini çağıracağız. Transfer işlevi iki parametre kabul eder: alıcı adresi ve transfer edilecek Token miktarı:

Çağrı işlevi, Blokzincir'e kazılacak olan işlemin hash'ini döndürür. Ethereum'da işlem hash'leri öngörülebilirdir; bu sayede işlemin hash'ini yürütülmeden önce alabiliriz (hash'lerin nasıl hesaplandığını buradan öğrenin (opens in a new tab)).

İşlev yalnızca işlemi Blokzincir'e gönderdiğinden, ne zaman kazıldığını ve Blokzincir'e dahil edildiğini bilene kadar sonucu göremeyiz. Bir sonraki eğitimde hash'ini bilerek bir işlemin Blokzincir'de yürütülmesini nasıl bekleyeceğimizi (opens in a new tab) öğreneceğiz.