Kombinierte Geschäfte gemeinsam ausgeführt?

Wenn ich richtig liege, ist die Nonce dafür verantwortlich, dass die Ordertransaktionen ausgeführt werden. Angenommen, Sie haben zwei Transaktionen T1 und T2. T1 hängt von T2 ab. Ich möchte also eine Bestellung T1 und dann T2 haben. Dies geschieht, indem T1 die Nonce und T2 Nonce + 1 gegeben wird. (Bitte korrigieren Sie mich, wenn das falsch ist)

Nun kann es in einigen Fällen vorkommen, dass T2 auch vom Zustand eines Vertrags abhängt. Ich möchte also sicherstellen, dass T1 nur dann ausgeführt wird, wenn T2 ausgeführt werden kann. Gibt es eine Möglichkeit, dies zu tun?

Um sicherzustellen, dass T1 und T2 im selben Block enthalten sind. Ich denke, das könnte durch einen Kostümvertrag erfolgen, bin mir aber nicht sicher, ob es eine bessere oder eine Art Standardlösung dafür gibt.

Vielen Dank für jeden Rat!

PS: Beispiel: Ich möchte etwas kaufen. T1 zahlt Geld ein (oder genehmigt) einen Vertrag. T2 etwas mit dem Vertrag kaufen.

Reales Beispiel: Ich möchte einen Token auf Ether Delta kaufen. T1: Anzahlung. T2: Token kaufen. Es macht keinen Sinn einzuzahlen, wenn jemand schneller war und diesen Token bereits für den angegebenen Preis gekauft hat.

Was meinst du damit, dass T1 von T2 abhängt? Wie in A hat kein Geld, B schickt A einige Tokens in T2 und A schickt C im selben Block?
Ja so etwas. Einfaches Beispiel. Ich will etwas kaufen. T1 Geld einzahlen (oder Zustimmung erteilen) zu einem Vertrag. T2 etwas mit dem Vertrag kaufen.
Ich kenne die Antwort nicht, aber Sie können Ihre Frage aktualisieren, um sie zu verbessern. Ich würde vermuten, dass es nicht wirklich machbar ist: Jede der Einzahlungs-/Kauftransaktionen wird wahrscheinlich von verschiedenen Entitäten ausgelöst. Um also zu kaufen, benötigen Sie Daten in der Blockchain, dass jemand eine Einzahlung getätigt hat. Nur wenn Einzahlung und Kauf auf dieselbe Weise von derselben Entität ausgelöst werden, hätten Sie Daten im selben Block - aber ich glaube nicht, dass dies die Art von Vertrag ist, die Sie entwickeln.
Es gibt den „Vertragskonstrukteur-Trick“. Es erlaubt, zwei "Transaktionen" in einem Konstruktor im Namen des Vertrags auszuführen und am Ende wird es sich selbst zerstören. Es ermöglicht die atomare Ausführung von zwei internen Transaktionen, dh beide werden ausgeführt oder ein Fehler in einer von ihnen wird beide rückgängig machen. Es ist möglicherweise nicht billiger und erfordert einige Vorbereitungen, aber es vermeidet Race-Attacken zwischen beiden Transaktionen.

Antworten (1)

Ich möchte also eine Bestellung T1 und dann T2 haben. Dies geschieht, indem T1 die Nonce und T2 Nonce + 1 gegeben wird. (Bitte korrigieren Sie mich, wenn das falsch ist)

Wenn sowohl T1 als auch T2 von demselben Konto gesendet werden, wird die Nonce-Anweisung befolgt, ja.

T2 hängt auch vom Zustand eines Vertrages ab. Ich möchte also sicherstellen, dass T1 nur dann ausgeführt wird, wenn T2 ausgeführt werden kann. Gibt es eine Möglichkeit, dies zu tun?

Szenario 1: Wenn T1 und T2 vom gleichen Konto sind, dann ist diese Order bereits durch die Nonces garantiert.

Szenario 2: Wenn sie von unterschiedlichen Konten stammen, ist T2 nur erfolgreich, wenn es eine gültige Änderung am Status vornimmt. Wenn es keine gültige Änderung am Status vornimmt, schlägt es fehl und wird nicht in einen Block aufgenommen.

Wenn T1 den Status "gültig" machen muss, bevor T2 eintrifft, können Sie einfach sicherstellen, dass es erneut gesendet wird, wenn T2 fehlschlägt (weil T1 noch nicht passiert ist).

Wenn T1 nicht erforderlich ist, um den Status "gültig" zu machen, und T2 funktionieren könnte, ohne dass T1 passiert ist, müssen Sie vorsichtig sein, um die Reihenfolge sicherzustellen.

Um sicherzustellen, dass T1 und T2 im selben Block enthalten sind.

Es ist nicht klar, warum Sie möchten, dass sie in denselben Block aufgenommen werden. Solange T1 vor T2 liegt – auch in einem früheren Block – funktionieren die Zustandsänderungen.

Außerdem können Sie nicht garantieren, dass sie in denselben Block aufgenommen werden. Es liegt an den Bergleuten. Sie könnten versuchen , dies mit den Gaspreisen zu erreichen, aber auch hier gibt es keine Garantie.

Hi. Danke für die Erklärung. Ich habe meine Frage aktualisiert. Das konkrete Szenario ist, etwas zu kaufen, wo zuerst eine Anzahlung erforderlich ist. Es kann aber vorkommen, dass T1 ausgeführt wird (Einzahlung 1 ETH). Aber dann wird T2 nicht sofort ausgeführt und der Artikel wird von jemand anderem gekauft.
Handelt es sich bei T1 und T2 um dieselbe Person (Konto) oder um zwei verschiedene Personen?
Ja dieselbe Person! Aber der Artikel könnte von einer anderen Person gekauft werden. T2 kann also nur ausgeführt werden, wenn niemand den Kauf getätigt hat.
Okay, T2 wird immer nach T1 kommen, wenn sie von derselben Person stammen. Wenn ich Sie richtig verstehe, könnte Ihr Vertrag die Einzahlung des ersten Benutzers (T1) erkennen und dann das Gebot für alle anderen einfrieren, um sie daran zu hindern, es mit ihrem T2 zu kaufen. Das Einfrieren kann nach einer bestimmten Zeit oder Anzahl von Blöcken ablaufen. Aber es würde ganz von der Gestaltung Ihres Vertrages abhängen.
Entschuldigung, ich war nicht präzise genug. Ich schließe mich einem ausländischen Vertrag an. Kann also vertragsseitig nichts machen. Meine Idee war, dass ich meinen eigenen Vertrag schreiben könnte und er eine Funktion haben würde, die T1 und T2 ausführt und mit dem ausländischen Vertrag verbunden ist.
Ah, okay. Sobald T1 und T2 erstellt und gesendet wurden – auch wenn Sie dies über einen von Ihnen erstellten Vertrag tun – gibt es keine Garantie, dass sie schnell hintereinander und vor der Kauftransaktion einer anderen Person geliefert werden können. (Die Reihenfolge wird durch die Nonces garantiert, wie in Szenario Nr. 1 in meiner Antwort.)
Ok aber wenn ich doch beide Funktionen in einer Funktion aufrufe sollte es doch funktionieren oder? Oder zumindest sollte diese Funktion fehlschlagen. Aber vielleicht ist mein Verständnis nicht gut genug. Ich gehe davon aus, dass jeder Funktionsaufruf atomar ausgeführt wird.
Wenn Ihr Vertrag den ausländischen Vertrag zweimal aufruft, selbst wenn diese Aufrufe in einer einzigen Funktion in Ihrem Vertrag enthalten sind, handelt es sich um zwei Transaktionen. deposit()Der ausländische Vertrag müsste das und in einer einzigen kombinierten Funktion implementieren buy()(einen einzigen Anruf entgegennehmen), damit er das tun kann, was Sie verlangen. (Was sich anhört, als wäre es nicht der Fall.)
Ok, ich verstehe ... hmm, hoffte, dass es einen Workaround gibt ... aber es scheint nicht der Fall zu sein