Eingabe-/Ausgabeverkettung von korrelierten Rohtransaktionen

Ich bin also dabei, ein BTC-basiertes Zahlungsmodul zu implementieren, bei dem für jede Transaktion auf ein Nicht-Wallet-Konto ein Bruchteil des Betrags auf einem Wohltätigkeitskonto in einem externen Wallet landet, das nicht von diesem Modul kontrolliert wird.

Eine typische Runde dafür wäre:

  • Das Modul erhält die Zahlung vom Benutzer
  • Es leitet die 90 % (dieser Prozentsatz ist willkürlich) des Betrags an seinen endgültigen Bestimmungsort (z. B. einen Händler) weiter.
  • Die verbleibenden 10 % muss er nun an eine Wohltätigkeitsorganisation nach Wahl des Nutzers weiterleiten

Auf einer niedrigeren Ebene, das System:

  • Erhält eine Transaktion TxFromUservom Benutzer mit einem XBTC -Betrag
  • Wartet, bis es 6 Bestätigungen erhält
  • Erstellt eine neue Rohtransaktion, TxToMerchantum die Zahlung an den Händler weiterzuleiten
  • Erstellt eine weitere Rohtransaktion TxToCharity, um die Spende an die Wohltätigkeitsorganisation weiterzuleiten

Etwas tiefer gehen:

TxToHändler:

  • Erstellen Sie eine neue Rohtransaktion
  • Neuen Eingang hinzufügen:TxFromUser
  • Neue Ausgabe hinzufügen: Adresse: Merchant's address, Betrag: 0,9 * TxFromUser.Amount
  • Neue Ausgabe hinzufügen: Adresse: Module's own wallet address, Betrag: 0,1 * TxFromUser.Amount
  • Berechnen Sie die Gebühr für diese Transaktion
  • Ziehen Sie die Gebühr vom Betrag der zweiten Ausgabe ab
  • Erstellen Sie das Hex der Transaktion und signieren Sie es mit dem richtigen Schlüssel
  • Senden Sie die Transaktion und erhalten Sie ihre ID:TxToMerchant.Id

TxToCharity:

  • Warten Sie, bis die obige Transaktion (TxToMerchant) bestätigt wird
  • Erstellen Sie eine neue Rohtransaktion
  • Neue Eingabe hinzufügen: TxToMerchant(dies ist die Änderung, um die wir oben gebeten haben)
  • Neue Ausgabe hinzufügen: Adresse: Charity's address, Betrag: TxToMerchant.Amount = 0.1 * TxFromUser.Amount
  • Berechnen Sie die Gebühr für diese Transaktion
  • Ziehen Sie die Gebühr vom Ausgabebetrag der Transaktion ab
  • Erstellen Sie das Hex der Transaktion und signieren Sie es mit dem richtigen Schlüssel
  • Senden Sie die Transaktion und erhalten Sie ihre ID:TxToCharity.Id

Mir ist bewusst, dass ich diese beiden Transaktionen (TxToMerchant und TxToCharity) zu einer einzigen Transaktion zusammenführen könnte, aber aus verschiedenen Gründen (Geschäftsanforderungen) sagen wir einfach, dass dies im Moment nicht möglich ist.

Das Problem, das ich bei der obigen Implementierung habe, ist folgendes: Das Warten auf die TxToMerchantBestätigung führt zu einer Verzögerung, da ich die Zahlung nicht an die Wohltätigkeitsorganisation weiterleiten kann, TxToCharitybis TxToMerchantsie bestätigt ist (oder kann ich das, ohne mir Gedanken über die Verformbarkeit der Transaktion usw. machen zu müssen?).

Darüber hinaus TxToCharitymuss ich, wenn es an der Zeit ist, die Eingabe von hinzuzufügen, nachverfolgen, wie die Änderung zurückgegeben wurde, TxToMerchantund dann die richtige nicht ausgegebene Transaktion erhalten (wobei listunspent.txid = TxToMerchant.Id), gibt es eine effizientere und weniger fehleranfälliger Weg, dies zu tun?

Nehmen wir an, der Benutzer möchte die Zahlung zwischen 2 Händlern aufteilen (oder einem Händler und einem Frachtdienst, was sinnvoller ist), also gäbe es im obigen Beispiel 1 weitere Transaktion wie TxToMerchant, nennen wir sie TxToFreightService. Sagen wir jetzt, TxToMerchantdas läuft gut und wird bestätigt, schlägt aber TxToFreightServicefehl und wird nie bestätigt, weil die dafür verwendete Eingabe eine doppelte Ausgabe war, unabhängig von den 6 Bestätigungen, die wir (für seine Eingabe) vor der Verarbeitung erhalten haben. TxToCharityhängt von ab, TxToFreightServiceda die angeforderte Änderung in TxToFreightServiceals Eingabe für dient TxToCharity. Wie gehe ich programmgesteuert mit diesem Szenario um, ohne jedes Mal Korrekturen von Hand vornehmen zu müssen, wenn dies passiert?

Antworten (1)

Ich denke, Ihr Geschäftsprozess verwirrt das Problem. Ich gehe davon aus, dass die "Geschäftsseite" auch einen Teil der Transaktion nehmen oder die Zahlung der Wohltätigkeit verzögern möchte, und deshalb ist dies komplizierter geworden.

Es gibt eine Reihe von Überlegungen, nicht zuletzt die Tatsache, dass Sie eine Eingabe verwenden, um den Händler zu bezahlen, und das Wechselgeld, um die Fracht zu bezahlen, und das Wechselgeld, um die Wohltätigkeitsorganisation zu bezahlen.

Worüber Sie sich Sorgen machen, ist die Unfähigkeit , die Sie eingebaut haben, um die eine Partei aufgrund einer vorangegangenen Transaktion zu bezahlen, aber das ist Ihr Geschäftsprozess, der dafür verantwortlich ist, nicht das Bitcoin-Protokoll.

Sie sollten auch den Mindestzahlungsbetrag und die eventuelle Netzwerkgebühr berücksichtigen, die beide nicht prozentual sind.

Diese werden nicht erwähnt, und tatsächlich entstehen Ihnen durch zwei (oder möglicherweise vier) Transaktionen bis zu 4x die Transaktionsgebühren des Bitcoin-Netzwerks.

Dies ist einer der Hauptgründe, warum Sie (aus geschäftlicher Sicht) die Transaktionen nicht aufteilen sollten, dh es ist teurer und wer trägt die Kosten? Die Wohlfahrt? der Händler? die Fracht? Du?

Kann ich auch vorschlagen, dass Sie die "Bestätigungen" als etwas anderes missverstanden haben, als dass Ihre Transaktion in einen Block aufgenommen wurde? Wenn eine Transaktion von einem Peer angefordert wird, bevor sie in einen Block aufgenommen wird, validiert der Peer die Transaktion unabhängig, und wenn sie aus irgendeinem Grund nicht gut ist, wird sie abgelehnt. Dies ist NICHT der Prozess der „Bestätigung“.

Alle effektiven Peers führen dieselbe Validierung Ihrer Transaktion durch, während sie sich durch das Netzwerk ausbreitet (was übrigens extrem schnell ist).

Die Bestätigung hingegen erfolgt, wenn die Transaktion in einen Block aufgenommen wurde, und das wird nur dann zu einem Problem, wenn es einen Fork in der Blockchain gibt. Aber selbst dann können Sie eine Transaktion erneut übertragen, wenn die „andere Gabelung“ die endgültige wird, vorausgesetzt, die Grundlage, auf der sie erstellt wurde, ist gut.

Der Punkt, den ich machen möchte, ist, dass Sie zu viel Wert auf Bestätigungen für Transaktionen legen, die Sie selbst erstellt haben, und dann warten, bis jemand anderes bestätigt, was Sie bereits als wahr kennen, und das scheint völlig sinnlos.

Vielleicht können Sie Ihre Frage erweitern, um die "geschäftlichen Gründe" zu erläutern?

+1 Für die umfangreiche Analyse. Die verspäteten Zahlungen an die Wohltätigkeitsorganisationen und die Frachtdienste sind der Ort, an dem die Einnahmequelle generiert wird. Mir ist völlig bewusst, dass dies kein Problem des Bitcoin-Protokolls ist, aber ich bin mir sicher, dass mehr Unternehmer, die die integrierten Kreditmöglichkeiten nutzen möchten, mit denselben Problemen konfrontiert werden. Die Gebühren sind in unserem Modell enthalten (obwohl oben nicht erwähnt) und Dust-Zahlungen sind nicht qualifiziert und werden intakt an den Händler weitergeleitet.
In Bezug auf die Bestätigungen war ich auch derselben Meinung wie Sie, bis ich auf Beiträge einiger Veteranen stieß, die deutlich machten, dass wir nicht davon ausgehen sollten, dass diese Änderung sicher ist, nur weil wir Transaktionen basierend auf Änderungen aus einer früheren In-Wallet-Transaktion erstellt haben ausgeben. Bitte schau mal hier: reddit.com/r/Bitcoin/comments/1xm49o/…
@DougPeters Es ist nicht so, dass Sie warten müssen, um frühere In-Wallet-Transaktionen auszugeben, sondern dass Sie dazu verpflichtet sind. Andernfalls wird keine nachfolgende Transaktion validiert. Nebenbei bemerkt, Sie befinden sich wahrscheinlich auf rutschigem Boden, wenn Sie glauben, dass Bitcoin jede Form von Kredit unterstützen kann. Sie werden sich sofort mit einem Konkurrenten konfrontiert sehen, der sofortigen Vertrieb anbietet, nur weil er es kann. Es ist ein strittiger Punkt, aber keiner, den ich gerne versuchen würde, zum Funktionieren zu bringen;)
Mit Rohtransaktionen können Sie eine Zahlung senden, die als Eingabe eine unbestätigte Änderung enthält, sodass ich nicht wirklich verpflichtet bin zu warten, die Sache ist, dass dies nicht wirklich eine gute Praxis ist. Bitcoin unterstützt bereits eine Form des Kredits mit der Verwendung von Escrow, ich habe mich entschieden, dies in meine Bewerbung aufzunehmen, aber bleiben wir vorerst wieder bei den Hauptantwortfragen.