Wie gebe ich Bitcoins aus mehreren Wallets in einer einzigen Transaktion aus?

Wie könnte ich beispielsweise mit der Bitcoin Core-Befehlszeile Bitcoins aus mehreren Wallets in einer einzigen Transaktion ausgeben?

Dieser Kommentar sagt:

Anstatt die Transaktion an das Netzwerk zu senden, senden Sie sie an die nächste Person, die ihre Eingaben und Ausgaben hinzufügt und sie ebenfalls signiert, und so weiter. Die letzte Person würde dann die Transaktion im Netzwerk übertragen.

Ich nehme an, ich benutze createrawtransactionund signrawtransactionirgendwie, aber wie genau mache ich das eigentlich?

vgl. Mastering Bitcoin (1. Aufl.), § „Verwenden der JSON-RPC-API von Bitcoin Core über die Befehlszeile“ , §§ „Erstellen, Signieren und Senden von Transaktionen basierend auf nicht ausgegebenen Ausgaben“

...Oder geben Sie Bitcoins aus mehreren Wallets in einer einzigen Transaktion mit einem beliebigen Tool aus.
@zylstra danke. Ich habe meine Frage verallgemeinert.

Antworten (2)

Derzeit gibt es drei verschiedene Möglichkeiten, dies zu tun: Rohtransaktionen, PSBT in 0,17 und PSBT in 0,18. Ich empfehle Ihnen, PSBT in 0.18 zu verwenden, da dies den geringsten Aufwand darstellt, aber ich werde alle drei hier für Sie beschreiben.


Traditionell würden Sie dies mit createrawtransaction, fundrawtransaction, und signrawtransactionwithkey/ tun signrawtransactionwithwallet. Eine Person müsste alle Eingaben kennen, die in der Transaktion verwendet wurden, oder alle in ihrer Brieftasche gespeichert haben (dh sie hat die öffentlichen Schlüssel und/oder Einlöseskripte aller anderen in ihre Brieftasche importiert) und kann dann createrawtransactionoder fundrawtransactionverwenden Erstellen Sie die Rohtransaktion.

createrawtransactionNimmt einfach Eingaben und Ausgaben, die vom Benutzer angegeben werden, und gibt die resultierende Transaktion so aus, wie sie ist (Sie müssen also auf Gebühren und Änderungen achten). fundrawtransactionkann die Eingaben auswählen, die für Sie mit Ihrer Brieftasche verwendet werden sollen, und es wird Gebühren verarbeiten und Ausgaben selbst ändern. Muss jedoch fundrawtransactionalle Informationen kennen, die zum Erstellen der endgültigen Transaktion erforderlich sind (außer dem privaten Schlüssel, es kann nur eine Dummy-Signatur verwendet werden), um die Transaktionsgebühren korrekt zu schätzen, weshalb Sie die öffentlichen Schlüssel und Skripte importieren müssen in deine Brieftasche.

Sobald Sie die Rohtransaktion haben, senden Sie sie an alle anderen an der Transaktion beteiligten Personen. Sie signieren es dann mit signrawtransactionwithwallet(wenn sich die Schlüssel und Skripte in ihrer Brieftasche befinden) oder signrawtransactionwithkey(wenn sich ihre Schlüssel und Skripte nicht in ihrer Brieftasche befinden). Die meisten Leute werden signrawtransactionwithwallet. Sie senden dann das Ergebnis an Sie zurück, wo Sie alle unterzeichneten Transaktionen mit zur endgültigen Transaktion kombinieren müssen combinerawtransaction. Dann kannst du es mit übertragen sendrawtransaction.

Anstatt die Transaktionen an alle gleichzeitig zu unterzeichnen, könnten Sie sie an eine Person senden, die unterzeichnet, die dann an die nächste Person sendet und so weiter. Dies würde nicht erfordern combinerawtransaction. Die letzte Person würde unterschreiben und dann sendrawtransactionzum Senden verwenden.

Dieser Prozess ist ziemlich sperrig und erfordert, dass eine Person einige (oder alle) Informationen für die verwendeten Eingaben kennt (mit Ausnahme der privaten Schlüssel).


Seit Bitcoin Core 0.17 können Sie die verschiedenen *psbtRPCs verwenden, um dasselbe zu erreichen. Mit 0,17 ist der Fluss dem zuvor beschriebenen Rohtransaktionsfluss ziemlich ähnlich. Sie müssten alle Informationen zum Erstellen der endgültigen Transaktion in Ihrer Brieftasche haben (mit Ausnahme der privaten Schlüssel), damit die Gebührenschätzung für die Münzauswahl richtig durchgeführt werden kann, oder Sie müssen wissen, welche Eingaben zu verwenden sind. In beiden Fällen verwenden walletcreatefundedpsbtund spezifizieren Sie die gewünschten Eingaben und die gewünschten Ausgaben. Bitcoin Core wählt dann automatisch zusätzliche Eingaben aus, wenn die Ausgabemenge nicht ausreicht, und erstellt eine Änderungsausgabe für Sie. Da es auch Transaktionsgebühren umrechnen muss, muss es über die gleichen Informationen verfügen, die Sie benötigen fundrawtransaction, um die Gebühren für die von ihm ausgewählten Eingaben schätzen zu können.

Dann würden Sie die Transaktion an alle anderen senden, die ihre Signaturen (und andere Metadaten) mit hinzufügen würden walletprocesspsbt. Sie können dies auch tun walletprocesspsbt, bevor Sie die Transaktion an alle senden, damit verschiedene Metadaten, die zum Signieren benötigt werden (wie das UTXO, das für jede Eingabe ausgegeben wird), vorher hinzugefügt werden. Nach der Unterzeichnung sendet jeder die Transaktion an Sie zurück und Sie kombinieren sie mit. combinepsbtsDann erstellen Sie die endgültige Transaktion für die Übertragung mit finalizepsbtund senden das Ergebnis mitsendrawtransaction.

Natürlich können Sie mit PSBTs dasselbe wie oben beschrieben tun, wobei jede Person die Transaktion an die nächste zu unterzeichnende Person sendet, anstatt sie zum Kombinieren an Sie zurückzusenden.

Auch dieser Prozess ist ziemlich sperrig und erfordert, dass eine Person einige (oder alle) Informationen für die verwendeten Eingaben kennt (mit Ausnahme der privaten Schlüssel). Es ist jedoch etwas weniger wahrscheinlich, dass ein Fehler auftritt als bei der Rohtransaktionsmethode. Mit PSBTs können Sie auch andere Nicht-Bitcoin-Core-Wallets verwenden, die PSBT unterstützen, und Sie können diese Methode mit Wallets verwenden, die nicht mit dem Internet verbunden sind oder anderweitig nicht über die Blockchain oder die UTXOs verfügen, die bei der Transaktion ausgegeben werden.


Allerdings macht Bitcoin Core 0.18 diesen ganzen Prozess tatsächlich viel einfacher. Bitcoin Core 0.18 führt ein paar neue *psbtRPCs ein, die dafür sorgen, dass eine Person nicht alle verwendeten Eingaben und alle Informationen für jede Eingabe kennen muss. Der einzige Vorbehalt ist, dass diese Methode davon ausgeht, dass jede Person ihre eigenen Ausgaben hat, die sie erstellen möchte, anstatt dass mehrere Personen ihre Bitcoins zu einer großen Ausgabe zusammenlegen.

Mit 0.18 würde jeder sein eigenes PSBT mit walletcreatefundedpsbt. Sie geben alle ihre eigenen Eingaben an, die sie verwenden möchten, und alle ihre Ausgaben. Alle Änderungsausgaben werden hinzugefügt, und zusätzliche Eingaben aus der Brieftasche werden hinzugefügt, um den Ausgabebetrag und die Transaktionsgebühr zu decken, wenn der Benutzer nicht genug angegeben hat. Da dies jeder Benutzer mit seiner eigenen Brieftasche tut, muss niemand etwas darüber wissen, was die anderen Benutzer in ihren Brieftaschen haben.

Dann würde jede Person den PSBT an einen bestimmten Koordinator senden, der joinpsbtsjeden PSBT zu einem großen PSBT zusammenfügt. Dieses PSBT wird alle Inputs und Outputs haben, die jede Person ausgeben und erstellen möchte. Anstatt also viele einzelne PSBTs mit eigenen Ein- und Ausgängen zu haben, gibt es jetzt ein großes PSBT mit allen Ein- und Ausgängen.

Dieses PSBT wird dann an jede Person zurückgesendet, die verwendet wird walletprocesspsbt, um das PSBT zu aktualisieren und ihre Eingabeinformationen zu dem PSBT hinzuzufügen und es zu signieren. Selbst wenn ein Benutzer ein Airgapped-Setup hat, bei dem sich seine privaten Schlüssel an einem Ort befinden, der keinen Zugriff auf die Blockchain hat, kann er das PSBT von einer Online-Wallet aktualisieren und das PSBT zum Signieren an den Offline-Computer senden.

Sobald jeder das PSBT unterzeichnet hat, wird es an den Koordinator zurückgesendet, der verwendet combinepsbt, um alle Signaturen und Eingabeinformationen in demselben PSBT zu kombinieren, dann die endgültige Netzwerktransaktion mit erstellt finalizepsbtund sie mit sendet sendrawtransaction.

Auch dies kann wie die anderen zuvor beschriebenen Methoden seriell erfolgen und somit die Notwendigkeit von combinepsbt.

Ich habe den Bitcoin-Core-Befehl nicht überprüft, wenn es darum geht, alle Guthaben aus allen Brieftaschen in einer einzigen Transaktion abzuheben - Aber ich weiß, dass die Struktur und der Ablauf davon sind, ich nehme an, es ist dasselbe (DIES IST NICHT DIE ANTWORT, DAS IST NUR EIN LOGISCHER ABLAUF) :

/api/v2/withdraw_from_addresses/?api_key=API KEY&from_addresses=ADDRESS1,ADDRESS2,...&to_addresses=ADDRESS1,ADDRESS2,...&amounts=AMOUNT1,AMOUNT2,...&pin=SECRET PIN

Der Code stammt von block.io