Ein Withdrawal-Timeout sollte keine neue Identität erzeugen
Ein Abhebungsauftrag läuft ab. Die verlockende Antwort ist einfach: Die Transaktion erneut erstellen und wieder versenden.
Auf Dusk kann das das operative Problem jedoch verschärfen.
Bei Moonlight-Abhebungen sagt die Integrationsanleitung, dass die Transaktion einmal erstellt und signiert werden soll – mit ihren serialisierten Bytes und der Transaktions-ID, die vor dem Broadcast gespeichert werden. Wenn beim Senden ein Transport-Timeout auftritt, ist der sichere Retry, diese exakt signierten Bytes erneut auszustrahlen. Die Transaktion behält dieselbe Identität, während ihr On-Chain-Status untersucht wird.
Warum ist das wichtig? Weil ein Timeout nicht beweist, dass der erste Versuch fehlgeschlagen ist. Selbst ein „202 Accepted“ bestätigt nur das Routing, nicht jedoch Einschluss oder Endgültigkeit. Eine weitere Transaktion zu erstellen, bevor diese Ungewissheit geklärt ist, führt zusätzlich zu einem weiteren Objekt, das das Abhebungssystem nachverfolgen muss.
Moonlight macht den Unterschied explizit. Transaktionen verwenden sequentielle Kontononce-Werte, und eine konkurrierende Transaktion mit derselben Nonce ersetzt den vorhandenen Mempool-Eintrag nur dann, wenn ihr Gas-Preis strikt höher ist. Dieser Austausch hat eine andere Transaktions-ID. Dusk weist daher Exchange-Betreiber an, beide IDs abzugleichen und eine doppelte Belastung zu vermeiden.
„Retry“ und „Replacement“ sind also keine austauschbaren Backend-Aktionen. Ein Retry bewahrt die Identität des Zahlungsversuchs. Ein Replacement erzeugt bewusst eine neue Identität für dieselbe Nonce.
Für Custody-Infrastruktur geht Idempotenz daher über das Datenbankdesign hinaus: Transaktionskonstruktion, Nonce-Zuteilung, signierte Bytes und Buchungsprotokolle müssen alle dieselbe Abhebung beschreiben.
@Dusk $DUSK #dusk
Ein Abhebungsauftrag läuft ab. Die verlockende Antwort ist einfach: Die Transaktion erneut erstellen und wieder versenden.
Auf Dusk kann das das operative Problem jedoch verschärfen.
Bei Moonlight-Abhebungen sagt die Integrationsanleitung, dass die Transaktion einmal erstellt und signiert werden soll – mit ihren serialisierten Bytes und der Transaktions-ID, die vor dem Broadcast gespeichert werden. Wenn beim Senden ein Transport-Timeout auftritt, ist der sichere Retry, diese exakt signierten Bytes erneut auszustrahlen. Die Transaktion behält dieselbe Identität, während ihr On-Chain-Status untersucht wird.
Warum ist das wichtig? Weil ein Timeout nicht beweist, dass der erste Versuch fehlgeschlagen ist. Selbst ein „202 Accepted“ bestätigt nur das Routing, nicht jedoch Einschluss oder Endgültigkeit. Eine weitere Transaktion zu erstellen, bevor diese Ungewissheit geklärt ist, führt zusätzlich zu einem weiteren Objekt, das das Abhebungssystem nachverfolgen muss.
Moonlight macht den Unterschied explizit. Transaktionen verwenden sequentielle Kontononce-Werte, und eine konkurrierende Transaktion mit derselben Nonce ersetzt den vorhandenen Mempool-Eintrag nur dann, wenn ihr Gas-Preis strikt höher ist. Dieser Austausch hat eine andere Transaktions-ID. Dusk weist daher Exchange-Betreiber an, beide IDs abzugleichen und eine doppelte Belastung zu vermeiden.
„Retry“ und „Replacement“ sind also keine austauschbaren Backend-Aktionen. Ein Retry bewahrt die Identität des Zahlungsversuchs. Ein Replacement erzeugt bewusst eine neue Identität für dieselbe Nonce.
Für Custody-Infrastruktur geht Idempotenz daher über das Datenbankdesign hinaus: Transaktionskonstruktion, Nonce-Zuteilung, signierte Bytes und Buchungsprotokolle müssen alle dieselbe Abhebung beschreiben.
@Dusk $DUSK #dusk
