Wywołanie inteligentnego kontraktu z JavaScript
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]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"47Pokaż wszystkoKopiuj
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")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)4Kopiuj
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"2Kopiuj
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)})2Kopiuj
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.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("An error occured", err)6 return7 }8 console.log("Hash of the transaction: " + res)9 })10Pokaż wszystkoKopiuj
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.