Ist es möglich, eine Transaktionseingabe zu einer Transaktion im Mempool hinzuzufügen?

Ist es möglich, eine Eingabe zu einer Transaktion hinzuzufügen, die sich im Mempool befindet?

Wenn zum Beispiel jemand seinem Freund 1 BTC zahlt, kann ich die rohen Hex-Daten dieser Transaktion aus dem Mempool abrufen, bevor sie abgebaut werden.

Ich kann dann eine nicht ausgegebene Transaktion (sagen wir 3 BTC) mit meinem eigenen privaten Schlüssel signieren, als Eingabe auflisten und die rohen Hex-Daten dafür abrufen. Dann kann ich eine 3-BTC-Ausgabe zur Adresse einer anderen Person hinzufügen (die ich bezahlen möchte) und diese neue Transaktion erneut an das Netzwerk senden.

Was verhindert das?

Antworten (4)

Kurze Antwort: Nein, das ist unmöglich.

Längere Antwort: Bei einigen Transaktionen können die verwendeten Eingaben geändert werden (Anyonecanpay-Eingaben). Es ist auch möglich, Eingänge zu haben, die die erzeugten Ausgänge nicht signieren (SIGHASH_NONE). Eine Transaktion, bei der alle Eingaben dieser Art sind, ist jedoch wertlos, da jeder die Ausgaben ändern könnte, um stattdessen sich selbst gutzuschreiben.

Wenn normale SIGHaSH_ALL-Signaturen verwendet werden, wird normalerweise so ziemlich alles an einer Transaktion signiert (welche Input-Coins werden verwendet (und in welcher Reihenfolge), welche Output-Skripte werden erstellt, welcher Wert wird ihnen zugewiesen, ... Alles außer den Signaturen sich wirklich selbst (was zu einer unfreiwilligen Formbarkeit führt).

Wenn eine Eingabesignatur mit ANYONECANPAY markiert ist, signiert sie nicht die anderen verwendeten Eingabemünzen. Dies bedeutet, dass Sie eine Transaktion erstellen können, die bedeutet: "Ich möchte, dass x und y bezahlt werden, aber es ist mir egal, wer die Mittel dafür bereitstellt". Wenn alle Unterschriften in einer Transaktion JEDERKANNPAY lauten, könnten Sie zusätzliche Eingaben hinzufügen (oder vorhandene Eingaben entfernen. Eine bloße Erhöhung der Eingabegelder würde sie jedoch nur als Gebühr verbrennen.

Auf der anderen Seite gibt es SIGHASH_NONE, wodurch eine Signatur die Ausgaben der Transaktion nicht signiert. Dies scheint zu erlauben, was Sie wollen, aber falls jede Signatur SIGHASH_NONE ist, ist die Transaktion völlig unsicher, da jeder ersetzen könnte, wohin die Ausgaben gehen.

Selbst wenn eine Kombination davon theoretisch das zulassen würde, was Sie vorschlagen, trifft dies nicht auf typische Straßenbahnaktionen zu und wäre tatsächlich völlig unsicher.

Vielen Dank. Ich habe mir den Code über eine Stunde lang angesehen und sehe immer noch nicht, wo die Ausgaben signiert sind. Ich suche speziell hier: github.com/bitcoin/bitcoin/blob/master/src/… ... es scheint, dass nur Eingaben signiert sind? Können Sie auf eine Codezeile verweisen, die deutlich macht, dass Transaktionsausgaben ebenfalls signiert sind?
Außerdem kann ich Ihnen "einfach glauben", aber ich sehe nichts im Code, der die Art von Verhalten verhindert, nach der ich frage. Was hindert insbesondere jemanden daran, eine Eingabe zu einer nicht geminten SIGHASH_ALL-Transaktion hinzuzufügen? Zu sagen "alles ist unterschrieben" beantwortet meine Frage nicht vollständig, ich habe das Gefühl, dass mir etwas Wichtiges fehlt. Sind alle Eingaben mit jedem privaten Schlüssel signiert, der in der Transaktion aufgeführt ist? Soweit ich das beurteilen kann, wird jede Eingabe einzeln signiert und die Daten dieser Signatur werden unabhängig von den anderen Eingabesignaturen gespeichert.
Jede Eingabe enthält eine Signatur, die den Schlüssel verwendet, der vom Skript der Ausgabe benötigt wird, die von dieser Eingabe ausgegeben wird. Die signierten Daten sind jedoch (eine modifizierte Version) der gesamten Transaktion. Das Hinzufügen einer zusätzlichen Eingabe zu einer Transaktion würde alle SIGHASH_ALL-Eingaben ungültig machen, da sich die zu signierenden Daten ändern.

Es ist nicht möglich, den Transaktionen einer anderen Person eine zusätzliche Eingabe (oder Ausgabe) hinzuzufügen, ohne sie dazu zu bringen, die neue Transaktion zu signieren, da ihre Signatur nur für die angegebenen zugrunde liegenden Eingaben und Ausgaben gültig ist.

Eine mögliche Quelle der Verwirrung ist, dass andere Aspekte einer Transaktion tatsächlich formbar sind (sie können geändert werden, bis sie durch die Integration in die Blockchain im Mining-Prozess abgeschlossen sind). Beispielsweise gibt es eine triviale Transformation zum Bilden einer neuen gültigen Signatur aus einer vorhandenen gültigen Signatur, die im Wesentlichen das Negativ davon nimmt, und führende Nullen können ebenfalls vorangestellt werden. In gewisser Weise ist dies ein Altlastenproblem, da Signaturen vor Bitcoin als wertvoll angesehen wurden, um die Authentizität anderer Daten zu bestätigen, und nicht, um selbst einzigartig zu sein, so dass in dem unerwarteten Fall, dass diese nicht standardmäßigen Formate angezeigt werden Unterschriften, war es eine vernünftige Entscheidung, sie nicht zu akzeptieren.

Keine solche Änderung ändert die zugrunde liegende Übertragung von Bitcoin, sie ändert nur den Hash (Transaktions-ID oder txid) der bestehenden Transaktion. Dies bedeutet, dass eine solche Änderung die beteiligten Parteien verwirren könnte, da die Transaktion unter einer unerwarteten txid bestätigt wird, aber sie haben keinen Einfluss darauf, wie viele Bitcoins von welchen Eingängen zu welchen Ausgängen übertragen werden.

Sie können nicht, es würde eine völlig andere Transaktion erstellen und die andere würde ungültig werden, sobald eine es zu einem Miner und in einen Block schafft.

Ich bin verwirrt, sagen Sie, dass dies nicht möglich ist, oder sagen Sie, dass es möglich ist und es einfach die erste Transaktion ungültig machen würde?
Mein Fehler, der zweite Absatz war verwirrend. Ich sage, dass die zweite Transaktion wegen widersprüchlicher Eingaben ungültig sein wird.
Ich hatte den Eindruck, dass eine Transaktionsformbarkeit möglich war, da keine Reihenfolge der Transaktionen erzwungen wurde (bevor ein Block mit dieser Transaktion darin abgebaut wird). Ist es möglich, die zweite größere Transaktion in einen Block zu legen?
Sobald sich eine Transaktion in einem Block oder sogar im Speicherpool eines Miners befindet, sind alle widersprüchlichen Transaktionen ungültig. Es gibt niemals Duplikate von Eingaben in der Blockchain. Durch die Transaktionsverformbarkeit werden zwei TXIDs erstellt, die auf dieselbe Transaktion verweisen, aber nur eine kann gültig sein und in einem Block platziert werden. Wenn beide als gültig akzeptiert werden, verlieren Börsen Geld.
Meine Frage bezieht sich speziell auf Transaktionen, die noch nicht abgebaut wurden. Die Frage ist, ob es möglich ist, die Rohtransaktion zu bearbeiten, um Eingaben und Ausgaben hinzuzufügen, bevor die Transaktion abgebaut wird, da jede Eingabe einzeln signiert wird. Ich frage nicht nach doppelten Eingaben, ich frage, ob es möglich ist, Eingaben und Ausgaben zu einer Transaktion hinzuzufügen, die noch nicht abgebaut wurde, in der Hoffnung, sie erneut an Pools zu senden, damit sie vor der " host"-Transaktion wird abgebaut. Ich kann im Protokoll nichts finden, was dies technisch verhindern würde.

Diese Dinge können sich nicht ändern:

Normalerweise* enthält eine Bitcoin-Transaktion eine Unterschrift, um die folgenden Dinge zu bestätigen:

  1. Eingang
  2. Ausgabe

Eine Eingabe oder Ausgabe gibt sowohl eine Adresse als auch einen Betrag an. Wenn sich eines dieser Dinge ändert, wird eine neue Signatur benötigt, die nur von jemandem erstellt werden kann, der über den privaten Schlüssel verfügt. Durch das Ändern der Eingabe oder der Ausgabe wird die Signatur ungültig. Nur der Besitzer des privaten Schlüssels kann eine solche Änderung vornehmen, da er der einzige ist, der die neue Signatur erstellen kann. Selbst dann würde dies eine völlig neue Transaktion schaffen, die nicht mit dem Original verwechselt werden könnte.

Das , was geändert werden kann , bevor die Transaktion in die Blockchain aufgenommen wird, ist die Transaktions-ID. Dies zu ändern, kann für jeden, der unbestätigte Transaktionen akzeptiert, zu Verwirrung führen, aber es kann die Eingabe oder Ausgabe nicht ändern – es ist nur eine Bezeichnung. Für Personen, die nur bestätigte Transaktionen akzeptieren, befindet sich die Transaktion bereits in der Blockchain, wo nichts geändert werden kann, sodass keine Verwechslungsgefahr besteht.

Abschließend:

  • Ihre Transaktion, die noch nicht in die Blockchain aufgenommen wurde, ist sicher, dass ihre Ein- oder Ausgabe geändert wird. Weder Adressen noch Beträge können geändert oder ergänzt werden.
  • Sobald Ihre Transaktion in die Blockchain** aufgenommen wurde, ist sie sicher vor Änderungen , sodass Sie sicher über ihre Transaktions-ID darauf verweisen können, ohne dass es zu Verwechslungen kommen kann.

Zusatzinformation

Ich wollte eine einfache Erklärung, also habe ich keine Details zu Transaktionen mit mehreren Eingaben mit unterschiedlichen privaten Schlüsseln aufgenommen, aber das Gleiche gilt. Außer der Transaktions-ID kann kein Dritter Änderungen vornehmen, die keinen Einfluss darauf haben, welcher Bitcoin-Betrag übertragen wird oder wohin er übertragen wird.

Die obige Erklärung gilt für Standardtransaktionen. Die Erstellung einer Transaktion, für die diese Schutzmaßnahmen nicht gelten, würde entweder eine spezielle Software oder ein tiefgreifendes Verständnis erfordern. Weitere Einzelheiten zu Transaktionen finden Sie im Folgenden:

* Während es möglich ist, absichtlich eine Transaktion zu erstellen, die keine Eingaben oder sogar keine Ausgaben angibt, gehe ich davon aus, dass die Frage den üblichen Prozess der Erstellung einer Transaktion von bestimmten Eingaben zu bestimmten Ausgaben betrifft ).

** Mit "in die Blockchain aufgenommen" meine ich mit so vielen Bestätigungen, wie Sie es für Ihre Zwecke als ausreichend erachten. Wenn eine Transaktion nur eine Bestätigung hat, ist es immer noch möglich, dass der Block, in den sie aufgenommen wurde, später verwaist. Mit jeder weiteren Bestätigung sinkt das Risiko dafür erheblich.