Przejdź do głównej zawartości

Wywołanie inteligentnego kontraktu z JavaScript

transakcjefrontendJavaScriptweb3.js
Początkujący
jdourlens
EthereumDev(opens in a new tab)
19 kwietnia 2020
3 minuta czytania minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

W tym samouczku zobaczymy, jak wywołać funkcję inteligentnego kontraktu za pomocą JavaScript. Najpierw odczytam stan inteligentnego kontraktu (np. saldo posiadacza ERC20), a następnie zmodyfikujemy stan blockchain poprzez transfer tokenów. Powinieneś być już zaznajomiony z konfiguracją środowiska JS, aby wchodzić w interakcje z blockchainem.

W tych przykładach pobawimy się tokenem DAI, w celach testowych rozwidlimy 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 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81

Aby wchodzić w interakcje z inteligentnym kontraktem, potrzebujemy 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"
Pokaż wszystko
Kopiuj

W przypadku tego projektu usunęliśmy kompletny ABI ERC2, aby zachować tylko funkcje balanceOf i transfer, ale znajdziesz pełny ABI ERC20 tutaj(opens in a new tab).

Następnie musimy utworzyć instancję inteligentnego kontraktu:

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

Ustawimy też dwa adresy:

  • ten, który otrzyma transfer i
  • ten, który już odblokowaliśmy, który go wyśle:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
Kopiuj

W następnej części wywołamy funkcję balanceOf, aby pobrać aktualną ilość tokenów z obu posiadanych adresów.

Call: Odczyt wartości z inteligentnego kontraktu

Pierwszy przykład wywoła metodę „stałą” i wykona metodę inteligentnego kontraktu w EVM bez wysyłania żadnej transakcji. W tym celu odczytamy saldo adresu ERC20. Przeczytaj nasz artykuł o tokenach ERC20.

Możesz uzyskać dostęp do metod utworzonej instancji kontraktu inteligentnego, 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) { if (err) { console.log("An error occured", err) return } console.log("The balance is: ", res)})
Kopiuj

Pamiętaj, że DAI ERC20 ma 18 miejsc po przecinku, co oznacza, że ​​musisz usunąć 18 zer, aby uzyskać prawidłową kwotę. uint256 są zwracane jako ciągi, 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 na temat bignumber.js(opens in a new tab).

Send: Wysyłanie transakcji do funkcji inteligentnych kontraktów

W drugim przykładzie wywołamy funkcję transferu inteligentnego kontraktu DAI, aby wysłać 10 DAI na nasz drugi adres. Funkcja trasferu przyjmuje dwa parametry: adres odbiorcy oraz ilość tokenu do transferu:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("An error occured", err)
6 return
7 }
8 console.log("Hash of the transaction: " + res)
9 })
Pokaż wszystko
Kopiuj

Funkcja wywołania zwraca skrót transakcji, która zostanie wykopana w blockchain. W Ethereum skróty transakcji są przewidywalne — w ten sposób możemy uzyskać skrót transakcji przed jej wykonaniem (dowiedz się, jak obliczane są skróty(opens in a new tab)).

Ponieważ funkcja przesyła transakcję tylko do łańcucha bloków, nie możemy zobaczyć wyniku, dopóki nie wiemy, kiedy został wydobyty i włączony do łańcucha bloków. W następnym samouczku nauczymy się, jak poczekać aż transakcja zostanie wykonana na blockchainie, wiedząc, że jest skrótem(opens in a new tab).

Ostatnia edycja: @Beas(opens in a new tab), 15 sierpnia 2023

Czy ten samouczek był pomocny?