Weiter zum Hauptinhalt

Smart Contract aus JavaScript aufrufen

TransaktionenFrontendJavaScriptweb3.js
Beginner
jdourlens
EthereumDev(opens in a new tab)
19. April 2020
3 Minuten Lesedauer minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

In diesem Tutorial zeigen wir, wie Sie eine Smart-Contract-Funktion von JavaScript aus aufrufen können. Zuerst wird der Zustand eines Smart Contracts ausgelesen (z. B. der Kontostand eines ERC20-Inhabers), dann ändern wir den Zustand der Blockchain, indem wir einen Tokentransfer durchführen. Sie sollten bereits mit dem Einrichten einer JS-Umgebung zur Interaktion mit der Blockchain vertraut sein.

Für dieses Beispiel wird ein DAI-Token verwendet. Zu Testzwecken werden wir die Blockchain mit ganache-cli forken und eine Adresse freischalten, die bereits viele DAI hat:

ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81

Für die Interaktoin mit einem Smart Contract benötigen wir seine Adresse und 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"
Alles anzeigen
Kopieren

Für dieses Projekt haben wir die komplette ERC20 ABI gestrippt, um nur die balanceOf- und transfer-Funktion zu behalten. Sie können die komplette ERC20 ABI allerdings hier finden(opens in a new tab).

Anschließend müssen wir unseren Smart Contract starten:

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

Außerdem richten wir zwei Adressen ein:

  • diejenige, die die Übertragung erhält und
  • diejeige, die wir bereits eingerichtet haben, und die die Übertragung senden wird:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
Kopieren

Im nächsten Teil rufen wir die Funktion balanceOf auf, um die aktuelle Menge an Token abzurufen, die beide Adressen enthalten.

Aufruf: Wert aus einem Smart Contract lesen

Das erste Beispiel ruft eine "konstante" Methode auf und führt deren Smart-Contract-Methode im EVM aus, ohne eine Transaktion zu senden. Hierfür lesen wir den ERC20-Saldo einer Adresse aus. Lesen Sie unseren Artikel über ERC20-Token.

Sie können auf die Methoden eines instanziierten Smart Contracts, für den Sie die ABI bereitgestellt haben, wie folgt zugreifen: yourContract.methods.methodname. Durch Verwendung der Aufruf-Funktion erhalten Sie das Ergebnis der Ausführung der Funktion.

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("An error occured", err)
4 return
5 }
6 console.log("The balance is: ", res)
7})
Kopieren

Denken Sie daran, dass DAI ERC20 18 Dezimalstellen hat. Das bedeutet, dass Sie 18 Nullen entfernen müssen, um den richtigen Betrag zu erhalten. uint256 werden als Strings zurückgegeben, da JavaScript keine großen numerischen Werte verarbeiten kann. Wenn Sie nicht sicher sind, wie Sie mit großen Zahlen in JS umgehen sollen, lesen Sie unser Tutorial über bignumber.js(opens in a new tab).

Senden: Senden einer Transaktion an eine Smart-Contract-Funktion

Für das zweite Beispiel rufen wir die Transferfunktion des DAI-Smart Contracts auf, um 10 DAI an unsere zweite Adresse zu senden. Die Übertragungsfunktion akzeptiert zwei Parameter: die Empfängeradresse und den Betrag des zu übertragenden Tokens:

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 })
Alles anzeigen
Kopieren

Die Aufruffunktion gibt den Hash der Transaktion zurück, der in die Blockchain gemined wird. Bei Ethereum sind Transaktions-Hashes vorhersehbar – so können wir den Hash der Transaktion erhalten, bevor sie ausgeführt wird (lernen Sie hier, wie Hashes berechnet werden(opens in a new tab)).

Da die Funktion die Transaktion nur an die Blockchain sendet, können wir das Ergebnis erst sehen, wenn es gemined und in die Blockchain aufgenommen wurde. Im nächsten Tutorial werden wir lernen, wie man auf die Ausführung einer Transaktion auf der Blockchain wartet, indem man ihren Hash kennt(opens in a new tab).

Letzte Änderung: @Rojojue(opens in a new tab), 15. August 2023

War dieses Tutorial hilfreich?