Przejdź do głównej zawartości

Pomóż nam zaktualizować tę stronę

🌏

Dostępna jest nowsza wersja tej strony, ale tylko w języku angielskim. Pomóż nam przetłumaczyć najnowszą wersję.

Przetłumacz stronę
Zobacz wersję po angielsku

Brak błędów!🐛

Ta strona nie jest tłumaczona. Na razie celowo zostawiliśmy tę stronę w języku angielskim.

Wywołanie inteligentnego kontraktu z JavaScript

transakcje
frontend
JavaScript
web3.js
Początkujący
✍jdourlens
📚EthereumDev
📆19 kwietnia 2020
⏱️3 minuta czytania
Autor porady 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"
47
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.

Następnie musimy utworzyć instancję inteligentnego kontraktu:

1const web3 = new Web3("http://localhost:8545")
2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)
4
📋 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"
2
📋 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)})
2
📋 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.

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 })
10
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).

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.

Ostatnia edycja: , Invalid DateTime
Edytuj stronę

Czy ta strona była pomocna?