Wywołanie inteligentnego kontraktu z JavaScript
W tym samouczku zobaczymy, jak wywołać funkcję inteligentnego kontraktu za pomocą JavaScript. Najpierw odczytamy stan inteligentnego kontraktu (np. saldo posiadacza ERC20), a następnie zmodyfikujemy stan blockchaina, dokonując transferu tokena. Powinieneś już znać konfigurację środowiska JS do interakcji z blockchainem.
W tym przykładzie pobawimy się tokenem DAI, w celach testowych sforkujemy blockchain za pomocą ganache-cli i odblokujemy adres, który ma już dużo DAI:
ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81Aby wejść w interakcję z inteligentnym kontraktem, będziemy potrzebować jego adresu i ABI:
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"Na potrzeby tego projektu okroiliśmy kompletne ABI ERC20, aby zachować tylko funkcje balanceOf i transfer, ale pełne ABI ERC20 można znaleźć tutaj (opens in a new tab).
Następnie musimy utworzyć instancję naszego inteligentnego kontraktu:
1const web3 = new Web3("http://localhost:8545")2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)Skonfigurujemy również dwa adresy:
- ten, który otrzyma transfer, oraz
- ten, który już odblokowaliśmy i który go wyśle:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"W następnej części wywołamy funkcję balanceOf, aby pobrać aktualną liczbę tokenów posiadanych przez oba adresy.
Wywołanie: odczytywanie wartości z inteligentnego kontraktu
W pierwszym przykładzie zostanie wywołana „stała” metoda i jej metoda inteligentnego kontraktu zostanie wykonana w EVM bez wysyłania jakiejkolwiek transakcji. W tym celu odczytamy saldo ERC20 adresu. Przeczytaj nasz artykuł o tokenach ERC20.
Możesz uzyskać dostęp do metod utworzonej instancji inteligentnego kontraktu, dla którego podano ABI, w następujący sposób: yourContract.methods.methodname. Używając funkcji call, otrzymasz wynik wykonania funkcji.
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("Wystąpił błąd", err)4 return5 }6 console.log("Saldo wynosi: ", res)7})Pamiętaj, że DAI ERC20 ma 18 miejsc po przecinku, co oznacza, że musisz usunąć 18 zer, aby uzyskać prawidłową kwotę. Wartości uint256 są zwracane jako ciągi znaków, ponieważ JavaScript nie obsługuje dużych wartości numerycznych. Jeśli nie masz pewności, jak radzić sobie z dużymi liczbami w JS, sprawdź nasz samouczek o bignumber.js (opens in a new tab).
Wyślij: wysyłanie transakcji do funkcji inteligentnego kontraktu
W drugim przykładzie wywołamy funkcję transferu inteligentnego kontraktu DAI, aby wysłać 10 DAI na nasz drugi adres. Funkcja transferu przyjmuje dwa parametry: adres odbiorcy i liczbę tokenów do transferu:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("Wystąpił błąd", err)6 return7 }8 console.log("Hasz transakcji: " + res)9 })Funkcja wywołania zwraca hasz transakcji, która zostanie wydobyta w blockchainie. W Ethereum hasze transakcji są przewidywalne – w ten sposób możemy uzyskać hasz transakcji przed jej wykonaniem (dowiedz się, jak obliczane są hasze, tutaj (opens in a new tab)).
Ponieważ funkcja jedynie przesyła transakcję do blockchaina, nie możemy zobaczyć wyniku, dopóki nie dowiemy się, kiedy zostanie ona wydobyta i dołączona do blockchaina. W następnym samouczku dowiemy się, jak czekać na wykonanie transakcji w blockchainie, znając jej hasz (opens in a new tab).
Strona ostatnio zaktualizowana: 3 marca 2026