Warum unterscheiden sich Smart-Contract-Outputs von gewöhnlichen Transaktionen?

Ein Börseningenieur von Coinbase sagte:

"Die Einzahlung von Smart Contracts ist schwierig. Smart Contract-Ausgaben sind nicht wie normale ETH-Transaktionen und es ist nicht trivial, benachrichtigt zu werden, wenn wir Coins von Smart Contracts erhalten."

Ähnlich sagt die Bitfinex-Börse:

„Derzeit unterstützt Bitfinex keine Ethereum-Transaktionen, die aus Smart Contracts generiert wurden. Um fehlende Einzahlungen oder Einzahlungsverzögerungen zu vermeiden, sollte ETH nur in traditionellen Transaktionen gesendet werden. Wenn Sie sich nicht sicher sind, dass Ihre Einzahlung nicht im Rahmen einer Ethereum-Vertragsausführung gesendet wird, Bitte informieren Sie sich genau, bevor Sie Ihre Anzahlung senden."

Was ist der technische Unterschied zwischen Transaktionen, die von Smart Contracts generiert werden, und Transaktionen, die von Menschen generiert werden? Warum ist es schwieriger, benachrichtigt zu werden, wenn eine Münze von einem Smart Contract empfangen wird (wie würde eine Börse benachrichtigt werden, wenn sie Münzen von einem Menschen erhält, und wie würde sie benachrichtigt, wenn sie Münzen von einem Smart Contract erhält, und warum ist das so? anders)? Was war die Motivation für diese Designwahl der Ethereum-Designer? Wo kann ich mehr Details lesen?

Ich habe https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions überflogen , aber dort keine Antwort gesehen.

Das ist eine gute Frage, für mich lag das Problem nur an höheren Gebühren, die eine Rückerstattung verweigern könnten. Aber wenn ich sage, dass die Ausgabe anders ist, kann ich den Unterschied zwischen einer TX von einem Konto und einer von einem Vertrag nicht erkennen.

Antworten (2)

Hier ist eine Intuition. Die einfachste Transaktion in Ethereum kostet 21000 Gas und sieht so aus:

{from: '0x from', to: '0x to', value: web3.toWei(1, "ether")}

Wenn Sie todie Börse einzahlen, kann die Börse nach Transaktionen Ausschau halten, die an todiese Einzahlungsadresse gesendet werden. Zum Beispiel könnten sie für Block 99 verwenden web3.eth.getBlock(99, true, ...)und für jedes Transaktionsobjekt prüfen, ob es togleich der Einzahlungsadresse und der value(Menge an Ether in Wei) ist, die gesendet wurde. Relativ einfach für die Börse, um zu sehen, was Sie eingezahlt haben.

Wenn Sie jedoch einen Vertrag verwenden, um eine Einzahlung vorzunehmen, toist dies nicht mehr die Einzahlungsadresse, die Ihnen die Börse gegeben hat. Das toist die Adresse Ihres Vertrages, und in der Transaktion wird es ein zusätzliches dataFeld geben. Dieser datagibt dem Kontrakt Anweisungen, Code auszuführen, der dann den Ether an die Einzahlungsadresse transferieren kann. Die Börse muss den Code auch ausführen, wenn sie sicher sein will, dass sie Gelder aus einer solchen Ausführung erhalten hat. (Eine Börse könnte web3.eth.getBalance verwenden , um die Salden von Einzahlungsadressen zu überwachen, aber wenn sie genau wissen möchte, woher die Gelder stammen, muss sie den Code aller Transaktionen ausführen.)

Das ist ein Überblick und um mehr zu lesen, hat das Ethereum-Wiki Links zu anderem Material wie dem Yellow Paper und dem White Paper. Das Lesen dieses StackExchange für häufig gewählte Fragen und Antworten mit Tags wie und ist ebenfalls hilfreich.

Technisch gesehen werden Transaktionen nur von Menschen initiiert: Ein Vertrag, der einen anderen Vertrag aufruft, ist message call(wie im Yellow Paper definiert) keine Transaktion. Auf der Blockchain wird nur die Transaktion aufgezeichnet, da alle weiteren Ausführungen aus der Transaktion abgeleitet werden können.


Der Grund, warum das Abheben von einer Börse auf ein Vertrags-Wallet/-Konto nicht einfach ist, liegt daran, dass mehr Gas benötigt wird als das grundlegende 21000-Gas. Unterschiedliche Kontrakte könnten unterschiedliche Gasmengen verbrauchen, und die Börse muss ausreichend Gas bereitstellen, sonst kommt die Transaktion nicht zustande: Die verbleibenden Mittel verbleiben bei der Börse.

Entschuldigen Sie, wenn ich wiederhole, was Sie geschrieben haben, aber Sie müssen bestätigen, dass das, was ich aus Ihrem Beitrag verstanden habe, richtig ist. Sobald also der Ether vom Vertrag auf das Konto übertragen wurde, müssen Sie alles von der ersten Transaktion, die den Vertrag aufgerufen hat, wiederholen, um den endgültigen Kontostand zu bestimmen, da Verträge keinen Status im Netzwerk haben, nur Transaktionen haben einen? Ist das richtig?
@NicolasMassart Kommentar ist etwas unklar, aber ich versuche es. Verträge haben einen Status. Aber als Börse müssen Sie Transaktionen wiederholen oder ausführen, um herauszufinden, welcher Vertrag das Geld eingezahlt hat. Ein Vertrag könnte aufzeichnen, welche Konten er bezahlt hat, aber als Börse wissen Sie nicht, welche Verträge dies tun und wie Sie auf den Status eines solchen Vertrags zugreifen können. Dort gibt es Benutzerkonto->Vertrag->evtl. viele weitere Verträge->Einzahlungsadresse tauschen. Als Tauschbörse wissen Sie nur vom allerletzten Artikel.
Ich glaube, ich verstehe immer noch nicht, warum eine Börse wissen muss, woher eine Einzahlung kommt. Es scheint mir, dass die Überprüfung von web3.eth.getBalance ausreichen sollte. Vielleicht ist der Rechenaufwand für das einmalige Ausführen von web3.eth.getBalance für jede Einzahlungsadresse, jeden Block größer als der Rechenaufwand für den Vergleich jeder Einzahlungsadresse mit jeder Transaktion? Aber warum sollte das sein?

ETHEREUM HAT ZWEI METHODEN, UM GELD ZU SENDEN:

Normale Transaktion: Ein Datenelement, das von einem externen Akteur signiert wurde. Es repräsentiert entweder eine Nachricht oder ein neues autonomes Objekt. Transaktionen werden in jedem Block der Blockchain aufgezeichnet.

Dies bedeutet, dass eine Transaktion entweder eine Nachricht oder einen neuen Vertrag darstellt.

Interne Transaktion (Nachricht): Daten (als Satz von Bytes) und Wert (angegeben als Ether), die zwischen zwei Konten weitergegeben werden, entweder durch die deterministische Operation eines autonomen Objekts oder die kryptografisch sichere Signatur der Transaktion

Dies bedeutet, dass eine interne Transaktion die Daten und die Menge an Ether sind, die zwischen zwei Konten übertragen werden. Eine interne Transaktion entsteht durch Verträge, die miteinander interagieren, oder durch eine Transaktion.

Ein Vertrag kann nur eine interne Transaktion senden.

Einige Exchange-Geldbörsen können nur normale Transaktionen empfangen. SENDEN SIE KEINE Gelder aus einem Smart Contract an diese. Die Börsensoftware, die mit der Wallet-Adresse interagiert, nimmt keine internen Transaktionen auf.