Sollte ich unterschiedliche Absenderadressen für mehrere Transaktionen im selben Block verwenden?

Ich entwerfe einen Off-Chain-Service, der Anfragen verarbeitet und eine Transaktion an die Blockchain sendet, wenn jede Anfrage abgeschlossen ist. Während des Zeitintervalls eines einzelnen Blocks kann der Dienst viele Anforderungen für viele Benutzer verarbeiten. Die Abschlusstransaktionen sind funktional voneinander unabhängig und die Reihenfolge, in der sie ausgeführt werden, spielt keine Rolle. Ich möchte jede Transaktion zuverlässig veröffentlichen, ohne mir Gedanken über Interaktionen machen zu müssen, die zu Fehlern führen könnten.

In Mehrere Transaktionen von derselben Adresse schreibt Paul S.:

Wenn Sie Transaktionsabhängigkeiten in Ihrer Off-Blockchain-Anwendung haben, sollten Sie warten, bis die vorherige Transaktion abgebaut wurde, bevor Sie die nächste Transaktion einreichen.

Ich habe keine funktionalen Transaktionsabhängigkeiten, aber dennoch: Als Beispiel für die Art von Problem, das ich vermeiden möchte, nehmen wir an, ich sende gleichzeitig N Transaktionen von derselben Adresse und erhöhe die Nonce für jede korrekt. Wenn alle diese Transaktionen in denselben Block aufgenommen werden sollen, muss der Miner sicherstellen, dass sie in aufsteigender Nonce-Reihenfolge auftreten, um einen gültigen Block zu bilden. Oder wenn nur eine Teilmenge von K < N Transaktionen enthalten ist, muss die Teilmenge die ersten K Transaktionen sein, wiederum in der Reihenfolge. Angesichts der Art und Weise, wie ausstehende Transaktionen wahrscheinlich im gesamten Netzwerk weitergeleitet werden, mache ich mir Sorgen, dass ein Burst von Transaktionen von derselben Adresse möglicherweise nicht zuverlässig in einen Block abgebaut wird.

Ist es am besten, für jede Transaktion eine andere Absenderadresse zu verwenden?

Das scheint das Transaktionspool- und Nonce-Problem zu lösen, verkompliziert aber andere Aspekte der DAPP, wie z. B. die Verwaltung privater Schlüssel und Whitelists für Absenderadressen in Verträgen.

Antworten (1)

Ich bin mir nicht sicher, ob dies in der Praxis notwendig ist; Der Rat, den Sie zitieren, gilt für eine Situation, in der Sie Rohtransaktionen offline durchführen und möglicherweise einige davon löschen, aber wenn Sie Ihre Transaktionen nur über Geth senden, sollte es die Übertragung der Transaktionen und die Nonce-Inkrementierung übernehmen, und die Dinge sollten im Allgemeinen gerecht sein Arbeit. Es ist jedoch zumindest theoretisch wahr, dass das Senden der Transaktionen von demselben Konto dazu führt, dass Übertragungsfehler auf eine Weise kaskadieren, die Sie nicht benötigen.

Wenn Sie Ihre Transaktionen von verschiedenen Konten senden möchten, aber den Rest Ihrer App nicht zwingen möchten, mit Hunderten von verschiedenen Kontoadressen umgehen zu müssen, können Sie diesen Teil abstrahieren: Verwenden Sie einen einzigen Schlüssel, um eine separate zu erstellen Unterschrift, die Sie im Datenteil der Transaktion übermitteln. Senden Sie das an einen Zwischenvertrag, der Transaktionen von jeder Adresse akzeptiert und stattdessen überprüft, ob die als Parameter übergebene Signatur mit Ihrem einzigen Signaturschlüssel übereinstimmt. Lassen Sie dann den Zwischenvertrag das tun, was Sie ursprünglich beabsichtigt hatten. Für alle nachfolgenden Kontrakte scheint dies aus dem Zwischenkontrakt zu stammen, sodass Sie eine einzige gemeinsame Verbindung haben, msg.sendergenau wie wenn Sie alle Transaktionen von derselben Adresse senden würden.