JavaScript'ten bir akıllı sözleşme çağırmak
Bu öğreticide, 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 ERC20 sahibinin bakiyesi), ardından bir jeton transferi yaparak blokzincirin durumunu değiştireceğiz. Blokzincir ile etkileşim kurmak için bir JS ortamı kurma konusuna zaten aşina olmalısınız.
Bu örnek için DAI jetonu ile oynayacağız, test amacıyla ganache-cli kullanarak blokzinciri çatallayacağız ve halihazırda çok fazla DAI'si olan bir adresin kilidini açacağız:
ganache-cli -f https://mainnet.infura.io/v3/[INFURA ANAHTARINIZ] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81Bir akıllı sözleşme ile etkileşim kurmak için adresine ve ABI'sine 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]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"Tümünü gösterBu proje için, yalnızca balanceOf ve transfer işlevini tutmak üzere ERC20 ABI'sinin tamamını çıkardık, ancak tam ERC20 ABI'sini burada (opens in a new tab) bulabilirsiniz.
Daha sonra akıllı sözleşmemizin bir örneğini oluşturmamız gerekiyor:
1const web3 = new Web3("http://localhost:8545")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)Ayrıca iki adres ayarlayacağı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 sahip olduğu mevcut jeton miktarını almak için balanceOf işlevini çağıracağız.
Çağrı: Akıllı sözleşmeden değer okuma
İlk örnek, "sabit" bir metodu çağıracak ve akıllı sözleşme metodunu herhangi bir işlem göndermeden EVM'de yürütecektir. Bunun için bir adresin ERC20 bakiyesini okuyacağız. ERC20 jetonları hakkındaki makalemizi okuyun.
ABI'sini sağladığınız, örneği oluşturulmuş bir akıllı sözleşmenin metotlarına şu şekilde erişebilirsiniz: yourContract.methods.methodname. call işlevini kullanarak, işlevi yürütmenin sonucunu alırsınız.
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("Bir hata oluştu", err)4 return5 }6 console.log("Bakiye: ", 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. JavaScript büyük sayısal değerleri işlemediğinden uint256 değerleri dizge 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 göz atın (opens in a new tab).
Gönderme: Bir akıllı sözleşme işlevine işlem gönderme
İ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 jeton miktarı:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("Bir hata oluştu", err)6 return7 }8 console.log("İşlemin karması: " + res)9 })Tümünü gösterÇağrı işlevi, blokzincire kazılacak olan işlemin karmasını döndürür. Ethereum'da, işlem karmaları tahmin edilebilirdir - bu sayede, bir işlemin karmasını daha yürütülmeden alabiliriz (karmaların nasıl hesaplandığını buradan öğrenin (opens in a new tab)).
İşlev, işlemi yalnızca blokzincire gönderdiğinden, ne zaman kazıldığını ve blokzincire dahil edildiğini bilene kadar sonucu göremeyiz. Sonraki öğreticide, karmasını bilerek bir işlemin blokzincirde yürütülmesini nasıl bekleyeceğimizi (opens in a new tab) öğreneceğiz.
Sayfanın son güncellenmesi: 21 Ekim 2025