msg.sender vs. tx.origin auf ERC-20-Token-Vertrag

Bei der Verwendung von Vertragsanrufen mit einem ERC-20-Token wird es chaotisch. Lassen Sie mich erklären:

Es gibt 3 Szenarien für Token-Transfers:

1.- Benutzer A sendet Token an Benutzer B

2.- Ein ICO-Vertrag sendet Token an einen Käufer

3.- Ein Asset-Vertrag sendet Käufer-Token an einen Asset-Verkäufer

Durch die Verwendung der ERC-20 Token transfer() Methode werden die Fälle 1 und 2 abgedeckt.

function transfer(address _to, uint256 _amount) public returns (bool success) {
    ...
    balances[msg.sender] -= _amount;
    balances[_to] += _amount;
    ...
}

Als msg.sender, Benutzer A (Fall #1) und ICO-Vertrag (Fall #2) werden die Token erfolgreich übertragen.

Aber die Methode transfer() kann Fall Nr. 3 nicht lösen, da msg.sender nicht der Benutzer (mit Token) ist, der die Transaktion sendet, sondern der Asset-Vertrag (ohne Token), der als Mittelsmann fungiert.

Dieser dritte Fall erfordert die Verwendung von tx.origin anstelle von msg.sender, sodass die Token von dem Benutzer stammen würden, der die Transaktion initiiert hat.

Irgendeine Idee, wie man die 3 Fälle lösen kann, um die ERC-20-Übertragungsmethode als einzigartig zu erhalten? Danke!

Ref.:

Dies ist eine Einschränkung von ERC-20. Es gibt einen Vorschlag in ERC-223, einen Rückrufmechanismus hinzuzufügen, um einen externen Vertrag zu benachrichtigen, wenn er genehmigt wurde. Auch von der Verwendung von tx.origin wird von Ethereum-Entwicklern abgeraten, zum Beispiel funktioniert es in diesem Fall nicht mit Multisig-Wallets.

Antworten (1)

Ich bin mir etwas unsicher, was du fragst. Nehmen wir Etherdelta als Beispiel für einen „Vermögensvertrag“. Etherdelta fungiert als Mittelsmann, ja, aber um eine Bestellung für einen Ethereum-Token aufzugeben, senden Sie Ethereum an ihren Vertrag. Der Etherdelta-Vertrag selbst überträgt also tatsächlich die Token an Sie und das Ethereum an die Person, von der Sie die Token gekauft haben.

Wie Sie gezeigt haben, würde ein Mittelsmann-Vermögensvertrag, der nicht auf die Token zugreift, auf diese Weise nicht funktionieren. Vielleicht könnten Sie die ERC20-Funktionen „approve()“ und „transferFrom()“ verwenden, wenn Sie verlangen, dass der Asset-Vertrag die Token nicht berührt.

Hier ist der ERC20-Token-Standard als Referenz: https://theethereum.wiki/w/index.php/ERC20_Token_Standard

Danke für deine Antworten. Durch das Senden der Token an den Vertrag würde der Vorgang zum Kauf von Vermögenswerten zwei Transaktionen erfordern: 1.- Senden von Token an den Vertrag und 2.- Vertrag sendet Token an den Verkäufer. Aber ich brauche diese Operation, um mit nur 1 atomaren Transaktion durchgeführt zu werden. Die andere Lösung, die die Endpunkte „approve()“ und „transferFrom()“ verwendet, verhält sich insofern ähnlich, als dass 2 Transaktionen erforderlich sind.
Ich bin mir nicht sicher, ob dies in einer Transaktion so möglich ist, wie Sie eine Transaktion definieren. Der Käufer könnte die Token jedoch an die Vertragsadresse senden, und der Vertrag führt einen Code aus, der die Token dann an den Verkäufer weiterleitet. Dies würde alles in einem Block und in einer in sich geschlossenen Ausführung des Vertragscodes geschehen. Effektiv wäre dies also eine Transaktion, je nachdem, wie Sie eine Transaktion definieren.