Zum Hauptinhalt springen

Übertragungen und Freigaben von ERC-20-Token aus einem Solidity-Smart-Contract

Smart Contracts
Token
Solidity
erc-20
Fortgeschritten
jdourlens
7. April 2020
7 Minuten Lesezeit

Im vorherigen Tutorial haben wir die Anatomie eines ERC-20-Tokens in Solidity auf der Ethereum-Blockchain untersucht. In diesem Artikel werden wir sehen, wie wir einen Smart Contract verwenden können, um mit einem Token unter Verwendung der Sprache Solidity zu interagieren.

Für diesen Smart Contract erstellen wir eine echte, fiktive dezentralisierte Börse, an der ein Benutzer Ether gegen unseren neu bereitgestellten ERC-20-Token tauschen kann.

Für dieses Tutorial verwenden wir den Code, den wir im vorherigen Tutorial geschrieben haben, als Basis. Unsere DEX wird in ihrem Konstruktor eine Instanz des Vertrags instanziieren und folgende Operationen ausführen:

  • Tauschen von Token gegen Ether
  • Tauschen von Ether gegen Token

Wir beginnen unseren Code für die dezentralisierte Börse, indem wir unsere einfache ERC-20-Codebasis hinzufügen:

Unser neuer DEX-Smart-Contract wird den ERC-20 bereitstellen und das gesamte Angebot erhalten:

Wir haben nun also unsere DEX und sie verfügt über die gesamte Token-Reserve. Der Vertrag hat zwei Funktionen:

  • buy: Der Benutzer kann Ether senden und im Austausch Token erhalten
  • sell: Der Benutzer kann sich entscheiden, Token zu senden, um Ether zurückzuerhalten

Die Buy-Funktion

Lassen Sie uns die Buy-Funktion programmieren. Wir müssen zuerst die Menge an Ether überprüfen, die die Nachricht enthält, und sicherstellen, dass der Vertrag genügend Token besitzt und dass die Nachricht etwas Ether enthält. Wenn der Vertrag genügend Token besitzt, sendet er die Anzahl der Token an den Benutzer und löst das Bought-Ereignis aus.

Beachten Sie, dass bei einem Aufruf der require-Funktion im Fehlerfall der gesendete Ether direkt zurückgesetzt (reverted) und dem Benutzer zurückgegeben wird.

Um es einfach zu halten, tauschen wir einfach 1 Token gegen 1 Wei.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "You need to send some ether");
    require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

Für den Fall, dass der Kauf erfolgreich ist, sollten wir zwei Ereignisse in der Transaktion sehen: Das Token-Transfer- und das Bought-Ereignis.

Zwei Ereignisse in der Transaktion: Transfer und Bought

Die Sell-Funktion

Die für den Verkauf verantwortliche Funktion setzt zunächst voraus, dass der Benutzer den Betrag genehmigt hat, indem er zuvor die approve-Funktion aufruft. Die Genehmigung der Übertragung erfordert, dass der von der DEX instanziierte ERC20Basic-Token vom Benutzer aufgerufen wird. Dies kann erreicht werden, indem zuerst die token()-Funktion des DEX-Vertrags aufgerufen wird, um die Adresse abzurufen, an der die DEX den ERC20Basic-Vertrag namens token bereitgestellt hat. Dann erstellen wir eine Instanz dieses Vertrags in unserer Sitzung und rufen seine approve-Funktion auf. Danach können wir die sell-Funktion der DEX aufrufen und unsere Token wieder gegen Ether tauschen. So sieht das zum Beispiel in einer interaktiven Brownie-Sitzung aus:

Wenn dann die Sell-Funktion aufgerufen wird, überprüfen wir, ob die Übertragung von der Adresse des Aufrufers zur Vertragsadresse erfolgreich war, und senden dann die Ether an die Adresse des Aufrufers zurück.

function sell(uint256 amount) public {
    require(amount > 0, "You need to sell at least some tokens");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Check the token allowance");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

Wenn alles funktioniert, sollten Sie 2 Ereignisse (ein Transfer und ein Sold) in der Transaktion sehen und Ihr Token-Guthaben sowie Ihr Ether-Guthaben sollten aktualisiert sein.

Zwei Ereignisse in der Transaktion: Transfer und Sold

In diesem Tutorial haben wir gesehen, wie man das Guthaben und die Freigabe (Allowance) eines ERC-20-Tokens überprüft und wie man Transfer und TransferFrom eines ERC-20-Smart-Contracts über die Schnittstelle aufruft.

Sobald Sie eine Transaktion durchführen, haben wir ein JavaScript-Tutorial, um zu warten und Details über die Transaktionen zu erhalten (opens in a new tab), die an Ihren Vertrag gesendet wurden, sowie ein Tutorial zum Decodieren von Ereignissen, die durch Token-Übertragungen oder andere Ereignisse generiert wurden (opens in a new tab), sofern Sie über die ABI verfügen.

Hier ist der vollständige Code für das Tutorial:

Letzte Aktualisierung der Seite: 3. März 2026

War dieses Tutorial hilfreich?