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.:
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
Ismael