Korrekter Ethereum-Austausch-Workflow

Ich habe kürzlich herausgefunden, dass es keine bequeme Möglichkeit gibt, Transaktionen zu einem „externen Konto“ zu überwachen, die durch einen Vertrag generiert wurden. Ich ging zu verschiedenen Foren und Ethereum-Bugtrackern, um eine Antwort zu erhalten, und sah viele Anfragen, einige API-Aufrufe hinzuzufügen, um alle Transaktionen aufzulisten, normale und aufgerufene Verträge. Einige der Leute beschrieben reale Situationen, in denen sie ETH verloren haben, weil die von ihnen verwendete Börse solche internen Transaktionen nicht unterstützte. Aber in allen Fällen sagten die eth-Entwickler dasselbe – „Börsenentwickler verstehen die Grundlagen von Ethereum nicht, sie sollten Verträge anstelle von EOAs verwenden“.

OK, ich versuchte zu verstehen, was sie hätten tun sollen. Die Verwendung von EOA ist wirklich einfach - erstellen Sie ein neues Konto, geben Sie es dem Benutzer und warten Sie auf einige Transaktionen. Wie ich es sehe, müssen Sie bei Verwendung der einfachsten Verträge Ihrem Benutzer 2 Entitäten zur Verfügung stellen - die Adresse Ihres Vertrags und einige verschlüsselte Daten, die die Methodensignatur und die generierte Benutzer-ID enthalten, und dann hören Sie sich einfach die Protokolle an. Aus Benutzersicht sehe ich es als ziemlich unpraktisch an, mit 2 Instanzen zu arbeiten, wenn ich nur Geld auf mein Konto einzahlen möchte - es wird viel fehleranfälliger. Und ich bin mir nicht sicher, dass die Verträge aller Benutzer das Senden an solche Austauschverträge ohne zusätzliche Codierung unterstützen.

Gibt es ein offensichtliches Szenario, das ich übersehe?

Entschuldigung für die lange Frage und mögliche Duplikate, aber ich konnte keine Beispiele finden, wie man es richtig macht.

BEARBEITEN: Ich habe nicht genug Ruf, um Tjadens Antwort zu kommentieren (danke dafür, übrigens), also hier "kommentieren". Ja, ich habe auch an diese Version gedacht, aber vergessen, sie in der ursprünglichen Frage hinzuzufügen. Die Verwendung der Fallback-Funktion ist nett und einfach, ABER - wie ich es verstehe - in diesem Fall sollten Sie einen Vertrag für jeden Benutzer erstellen, was zu 2 Problemen führt:
- Jedes Mal Geld ausgeben (nicht viel, aber immer noch - nur für die Kontoerstellung bezahlen erscheint nicht sehr fair)
- Sie sollten jeden Vertrag an die Blockchain senden und dann einige Zeit warten, bis er bestätigt wird, bevor Sie einem Benutzer seine Adresse mitteilen.

Denkt die Mehrheit der Ethereum-Community genauso wie Tjaden?

Antworten (1)

Der Benutzer muss nichts extra tun, da alle Verträge eine Fallback-Funktion haben, die aufgerufen wird, wenn sie eine Transaktion ohne Daten erhält. zum Beispiel:

contract DepositAddress{
    string username;
    address exchange;
    event ReceivedEther(uint amount, uint time, string username);

    function DepositAddress(string _username, address _exchange){
        exchange =_exchange;
        username = _username;
    }

    function(){
        ReceivedEther(msg.value,block.timestamp,username);
        exchange.send(msg.value);
    }
}

Dann wird jedes Mal, wenn ein Benutzer Ether an seine Einzahlungsadresse sendet, ein Ereignis ausgegeben und der Ether an das Hauptbörsenkonto weitergeleitet.

Alternativ, und wahrscheinlich am besten, könnten Sie die gesamte Buchhaltung in einem Smart Contract erledigen. Wenn ein Benutzer ETH einzahlt, wird sein Konto mit einem Token belastet. Wenn sie einen Teil ihres Guthabens aufbrauchen, geben sie den Token aus. Auf diese Weise benötigen Sie überhaupt keine Protokolle. Sie verwenden einfach die aktuelle Menge an Token, die sie besitzen.

Ich bin noch sehr neu bei Verträgen, aber wo wird der ReceivedEther()-Body des Ereignisses implementiert?
Es gibt keinen Funktionskörper, er wird automatisch von der Ereignisdeklaration generiert. Der Aufruf RecievedEtherschreibt einfach in einem einfachen Format in das Protokoll