function () öffentlich zahlbarer Modifikator kann beim Senden von Token Aktionen auslösen oder funktioniert nur beim Senden von Ether?

Modifikator zahlbar löst eine Aktion aus, wenn eine Adresse Ether an einen Vertrag sendet.

Zum Beispiel:

function () public payable {
      require(msg.data.length == 0);
      DoSomething();
    }

Wird diese Aktion auch ausgelöst, wenn der msg.sender Tokens sendet? Meine Frage ist, ob es möglich ist, Aktionen durch Zahlung auszulösen, wenn eine Adresse auch Token sendet, oder ist ein anderer Modifikator oder eine komplexere Problemumgehung erforderlich, um dies zu erreichen?

Normalerweise gibt es stattdessen eine Einzahlungsfunktion für Token, in die Sie Ihr DoSomething() einfügen können

Antworten (2)

Um mit dem Empfang von Token umgehen zu können, können Sie Ihre Klasse vom ERC223ReceiverStandard erben lassen:

contract ERC223Receiver
{
    function tokenFallback(address _from, uint _value, bytes _data);
}

contract YourContract is ERC223Receiver
{
    function tokenFallback(address _from, uint _value, bytes _data)
    {
        // Handle receiving tokens
    }
}

Das habe ich selbst nicht getestet.

Quelle: https://github.com/ethereum/EIPs/issues/744

Danke @Jesse, sieht nach einer brauchbaren Antwort aus. Aber wo definiere ich, welches Token ich erhalte? Es sollte einen Ort geben, an dem die Token-Adresse definiert werden kann?
Wenn tokenFallbackvom Token-Vertrag selbst aufgerufen wird, msg.senderist dies die Adresse des Token-Vertrags. Sie sollten wahrscheinlich werfen, wenn tokenFallbacknicht von einem vertrauenswürdigen Token-Vertrag aufgerufen wird.
Achten Sie auch darauf, sich mit der Einführung von ERC223 zu befassen. Ich bin mir nicht sicher, ob viele Token bereits mit diesem Standard erstellt wurden.
@JesseBusman, aber das bedeutet, dass nur der Token-Vertrag mit dem anderen Vertrag interagieren kann. Was ich möchte, ist, dass Token-Inhaber meines Tokens in der Lage sein könnten, Token an den anderen Vertrag zu senden und mit ihm zu interagieren. Ist das möglich?
@MoisésBriseñoEstrello Nein, das ist nicht gemeint. Immer wenn ein Token-Inhaber Token an Ihren Vertrag sendet, interagiert er mit Ihrem Vertrag, wobei der Token-Vertrag als Vermittler fungiert. Wenn Sie Token senden, rufen Sie wirklich nur die Übertragungsfunktion in einem Token-Vertrag auf. Der Token-Vertrag wiederum ruft tokenFallbackIhren Vertrag auf. Die Tatsache, dass der Aufruf tokenFallbackaus dem Token-Vertrag kam, beweist, dass echte Token übertragen wurden. Die Aufrufkette sieht so aus: USER --> TokenContract.transfer(..) --> YourContract.tokenFallBack(...)
Ok, aber dann muss tokenFallback in den Tokenvertrag geschrieben werden? ist es möglich, diese Funktion in einem anderen Vertrag zu haben? Grundsätzlich möchte ich, dass Token-Inhaber Token an ANDERE Verträge von mir senden und damit interagieren können. Ist es möglich oder muss eine Funktionalität innerhalb dieser Token im ursprünglichen Token-Vertrag enthalten sein?
@MoisésBriseñoEstrello Der empfangende Vertrag muss einen haben, function tokenFallback(...)wenn er Code ausführen möchte, wenn er Token empfängt. tokenFallback(...)Der Token-Vertrag muss innerhalb seiner aufrufenfunction transfer(...)

Der zahlbare Modifikator ermöglicht es der Funktion, Äther zu erhalten. Die Funktion in Ihrem Beispiel ist eine standardmäßige zahlbare Fallback-Funktion, die jedes Mal aufgerufen wird, wenn jemand Ether an Ihren Vertrag sendet.

Sie können auch jede andere Funktion als zahlbar implementieren, damit diese Funktion Ether akzeptieren kann.

Payable erlaubt der Funktion nur, Ether zu akzeptieren, und es steht in keiner Weise im Zusammenhang mit Token-Transfers.

Das Senden von Token ist nur eine Übertragungsfunktion im ERC20-Standard. Standardmäßig ändert es nur das Gleichgewicht innerhalb des Tokens. Wenn Sie also 1 Token von A nach B senden, ändert sich nur Folgendes:

token.balances[A] = token.balannces[A] - 1
token.balances[B] = token.balances[B] + 1

Um tun zu können, was Sie wollen, haben Sie zwei Möglichkeiten.

  1. Implementieren Sie Ihre Token so, dass sie die tokenFallback-Funktion aufrufen, wenn die Übertragung aufgerufen wird. Bitte beachten Sie, dass das sendende Token die tokenFallback-Funktion im empfangenden Vertrag aufrufen muss. Das standardmäßige Open Zeppelin ERC20-Token tut dies nicht. Sie müssen eine Änderung daran vornehmen.

  2. Schreiben Sie einen Javascript- oder Python-Code mit der web3-Bibliothek, der auf Übertragungsereignisse von Ihrem Token lauscht und eine Funktion im empfangenden Vertrag aufruft, wenn die Übertragung durchgeführt wird.