Wenn du in deiner Wallet-App auf "Senden" tippst, passiert im Hintergrund mehr, als man vermuten würde. Deine Wallet muss entscheiden, welche deiner "Geldscheine" sie für diese Zahlung verwendet, muss dabei Gebühren und Privatsphäre gegeneinander abwägen, und (falls mehrere Geräte oder Personen gemeinsam unterschreiben müssen) einen sicheren Weg finden, das zu koordinieren, ohne dass private Schlüssel je das eigene Gerät verlassen. Dieser Beitrag zeigt, wie das im Code tatsächlich gelöst ist.
Wallet und Node: zwei getrennte, austauschbare Bausteine
Ein Missverständnis, das sich hartnäckig hält: "Meine Bitcoin-Wallet" und "mein Bitcoin-Node" klingen wie dasselbe, sind es technisch aber nicht zwangsläufig. Bitcoin Core kann komplett ohne aktivierte Wallet-Funktion betrieben werden, als reiner Node, der ausschließlich Regeln prüft und Daten weiterleitet (relevant z.B. für die in Teil 7 dieser Serie beschriebene RPC-Nutzung durch fremde Anwendungen). Umgekehrt kann eine Wallet-Software auch komplett unabhängig von einem selbst betriebenen Node arbeiten und sich stattdessen auf einen fremden, vertrauten Node verlassen (was allerdings mit gewissen Vertrauens- und Privatsphäre-Abstrichen einhergeht, da man dann diesem fremden Node preisgibt, für welche Adressen man sich interessiert). Die meisten Nutzer bemerken diese Trennung nie, weil populäre Wallet-Apps beide Rollen bequem in einer einzigen Anwendung bündeln, im Kern handelt es sich aber um zwei unabhängige, austauschbare Programmbausteine.
Warum Bitcoin keine "Kontostände" im klassischen Sinn kennt
Anders als ein Bankkonto, das einfach eine einzige Zahl speichert, gibt es in Bitcoin technisch gar kein "Guthaben" als solches. Stattdessen besitzt du eine Sammlung einzelner, unverbrauchter Ausgaben aus früheren Transaktionen, ähnlich einem Portemonnaie voller einzelner Geldscheine unterschiedlicher Stückelung. Der in deiner App angezeigte Kontostand ist einfach die Summe all dieser einzelnen "Scheine" (Fachbegriff: UTXOs, "Unspent Transaction Outputs"). Willst du zahlen, muss deine Wallet also entscheiden: Welche dieser einzelnen "Scheine" nehme ich, um genau diesen Betrag zusammenzubekommen?
Drei Strategien, dieselbe Entscheidung zu treffen
Bitcoin Core nutzt für diese Entscheidung mehrere unterschiedliche Strategien (src/wallet/coinselection.cpp), die je nach Situation zum Einsatz kommen:
Branch and Bound ist die bevorzugte Strategie und verfolgt ein klares Ziel: eine Kombination vorhandener UTXOs zu finden, die den Zielbetrag möglichst exakt trifft, ohne dass ein zusätzlicher "Wechselgeld"-Output nötig wird. Das klingt nach einer Kleinigkeit, ist aber gleich doppelt vorteilhaft: Eine Transaktion ohne Wechselgeld-Output ist kleiner und damit in der Gebühr günstiger, und sie hinterlässt weniger sichtbare Spuren, die es Außenstehenden erlauben würden, deine verschiedenen UTXOs miteinander in Verbindung zu bringen. Der Algorithmus bewertet mögliche Kombinationen über eine sogenannte "Waste"-Kennzahl, die unter anderem berücksichtigt, ob die aktuelle Netzwerkgebühr gerade höher oder niedriger ist als langfristig zu erwarten, und probiert dabei bis zu 100.000 verschiedene Kombinationen durch, bevor er aufgibt.
Single Random Draw ist die einfachere Rückfallebene: Findet Branch and Bound keine passende exakte Kombination, wählt diese Methode UTXOs schlicht in zufälliger Reihenfolge aus, bis der Zielbetrag erreicht ist, schneller, aber praktisch immer mit einem Wechselgeld-Output verbunden.
Der Knapsack-Solver ist der älteste der drei Ansätze, historisch vor Branch and Bound eingeführt, und löst eine Variante des aus der Informatik bekannten "Rucksackproblems" (wie packe ich einen Rucksack mit begrenztem Volumen möglichst optimal?), übertragen auf die Auswahl von UTXOs.
In der Praxis probiert deine Wallet mehrere dieser Strategien parallel durch und wählt am Ende die Kombination mit der besten Bewertung.
Descriptor-Wallets: Adressen aus einer Formel statt aus einer Liste
Früher speicherte eine Bitcoin-Wallet jede einzelne Adresse separat, mit allen Nachteilen für Backup und Wiederherstellung, die das mit sich bringt. Moderne Wallets nutzen stattdessen sogenannte Output-Descriptors: kompakte, standardisierte Textformeln, die exakt beschreiben, wie aus einem oder mehreren Schlüsseln eine ganze Serie gültiger Adressen abgeleitet wird (z.B. "SegWit-Einzelsignatur-Adresse, abgeleitet aus diesem einen Hauptschlüssel, fortlaufend durchnummeriert"). Der große Vorteil: Ein einziger Descriptor kann tausende künftige Adressen repräsentieren, dein komplettes Backup reduziert sich auf diese eine, kurze Formel plus deinen geheimen Schlüssel, statt auf eine ständig wachsende Liste einzelner Adressen.
PSBT: Wie mehrere Geräte gemeinsam eine Zahlung unterschreiben, ohne sich gegenseitig zu vertrauen
Bei Hardware-Wallets oder Mehrfachsignatur-Konten (bei denen z.B. zwei von drei Unterzeichnern zustimmen müssen) stellt sich ein technisches Problem: Wie tauschen mehrere Geräte oder Personen eine Transaktion so lange aus, bis genug Signaturen vorliegen, ohne dass irgendwann ein privater Schlüssel unnötig sein sicheres Gerät verlassen muss?
Die Lösung heißt PSBT ("Partially Signed Bitcoin Transaction", offiziell BIP174) und ist ein standardisiertes, austauschbares Dateiformat (erkennbar an den charakteristischen ersten fünf Bytes im Datei-Kopf, PSBT_MAGIC_BYTES in src/psbt.h). Eine PSBT-Datei sammelt schrittweise alle nötigen Informationen (welche UTXOs werden ausgegeben, welche öffentlichen Schlüssel sind beteiligt, welche Teilsignaturen liegen bereits vor) und wird so lange zwischen den beteiligten Geräten hin- und hergereicht, bis am Ende eine vollständig signierte, sendefertige Transaktion daraus entsteht. Genau dieser Mechanismus steckt heute praktisch hinter jeder Kombination aus Hardware-Wallet und Software-Wallet, die du vielleicht selbst schon einmal genutzt hast.
Ein Rechenbeispiel: warum die Wahl der UTXOs echtes Geld kostet
Um zu verstehen, warum sich dieser ganze Aufwand lohnt, hilft ein einfaches Rechenbeispiel. Angenommen, du möchtest 0,05 BTC bezahlen und dein Wallet-Guthaben besteht aus drei einzelnen UTXOs: 0,03 BTC, 0,02 BTC und 0,1 BTC. Branch and Bound würde hier sofort die Kombination aus den ersten beiden erkennen (0,03 + 0,02 = genau 0,05 BTC), kein Wechselgeld nötig, eine schlanke Transaktion mit nur zwei Eingängen. Eine weniger clevere Auswahl könnte stattdessen einfach das große 0,1-BTC-UTXO nehmen, müsste dann aber zusätzlich 0,05 BTC Wechselgeld an eine neue, eigene Adresse zurücksenden, eine Transaktion mit einem zusätzlichen Ausgang, die dadurch spürbar mehr Byte groß und damit bei gleicher Gebührenrate tatsächlich teurer in echten Satoshi ist. Bei einer einzelnen Zahlung mag der Unterschied gering wirken, aber bei einer Wallet, die im Laufe der Zeit tausende Transaktionen abwickelt (etwa bei einem Zahlungsdienstleister), summiert sich eine durchdachte Coin-Selection zu einer handfesten Kostenersparnis.
Der Zielkonflikt zwischen Privatsphäre und Gebühren
Interessanterweise stehen Coin-Selection-Entscheidungen manchmal im Widerspruch zueinander, wenn man sowohl Gebühren sparen als auch möglichst wenig über sich preisgeben möchte. Die "günstigste" Option ist fast immer, möglichst wenige, möglichst große UTXOs zu verwenden, das hält die Transaktion klein. Aus Privatsphäre-Sicht kann es aber sinnvoller sein, gezielt mehrere kleinere, thematisch nicht zusammengehörige UTXOs zu vermeiden, deren gemeinsame Verwendung in einer einzigen Transaktion einem außenstehenden Beobachter verraten würde, dass sie derselben Person gehören ("Common-Input-Ownership-Heuristik" nennen Chain-Analyse-Firmen dieses Prinzip). Eine gut konzipierte Wallet muss also ständig zwischen "möglichst billig" und "möglichst diskret" abwägen; die weiter oben beschriebene Waste-Kennzahl ist letztlich der Versuch, diesen Zielkonflikt in eine einzige, vergleichbare Zahl zu übersetzen.
Warum private Schlüssel niemals den eigenen Rechner verlassen sollten
Ein grundlegendes Sicherheitsprinzip zieht sich durch die gesamte Wallet-Architektur, auch wenn es im bisherigen Text nur zwischen den Zeilen mitschwang: Deine Wallet-Software muss zu keinem Zeitpunkt deinen privaten Schlüssel an irgendeine andere Stelle senden, weder an den Bitcoin-Node selbst (Teil 7 dieser Serie zeigt, dass ein Node theoretisch komplett getrennt von jeder Wallet betrieben werden kann) noch an einen fremden Server. Signiert wird lokal, auf dem Gerät, das den Schlüssel besitzt, bei einer Hardware-Wallet also im kleinen, speziell abgesicherten USB-Gerät selbst, nicht im verbundenen Computer. Genau deshalb ist das im vorherigen Abschnitt beschriebene PSBT-Format so wichtig: Es transportiert alles, was zum Signieren nötig ist, OHNE dass der Schlüssel selbst jemals mitreisen müsste, nur die fertige Signatur wandert zurück.
Eine Warnung aus der Geschichte: wenn Sicherheit zum eigenen Risiko wird
So wichtig der Schutz privater Schlüssel ist, Bitcoins Geschichte kennt auch das gegenteilige Extrem. 2011 verlor ein damals bekanntes Bitcoin-Projekt rund 7.000 Bitcoin unwiederbringlich, nicht durch einen Hack oder Diebstahl, sondern weil die selbst gebaute, absichtlich sehr komplexe Verschlüsselungslösung für die eigenen Backups am Ende schlicht nicht mehr entschlüsselt werden konnte. Die Lehre daraus, die sich bis heute durch seriöse Sicherheitsempfehlungen zieht: Jede zusätzliche Sicherheitsmaßnahme muss gegen das Risiko abgewogen werden, sich am Ende selbst auszusperren. Eine Wallet-Lösung, die so kompliziert ist, dass du sie in einer Stresssituation (oder deine Erben Jahre später) nicht mehr fehlerfrei anwenden kannst, ist keine Sicherheit gewonnen, sondern nur ein anderes Risiko eingetauscht, ein Grund, warum die meisten etablierten Empfehlungen bewusst auf einfache, gut dokumentierte, breit getestete Standardlösungen setzen statt auf selbst gebastelte Speziallösungen.
Was du daraus für die Wahl deiner eigenen Wallet mitnehmen kannst
Praktisch bedeutet das für dich als Nutzer: Nicht jede Wallet-App ist bei der Coin-Selection gleich gut, und ein Blick auf diese Details lohnt sich, bevor du eine Wallet für größere Beträge oder häufige Nutzung auswählst. Unterstützt eine Wallet PSBT, kannst du sie problemlos mit einer Hardware-Wallet kombinieren, ohne beim Anbieter wechseln zu müssen, falls du später mehr Sicherheit möchtest. Zeigt dir eine Wallet transparent, welche UTXOs sie für eine Zahlung verwendet (manche fortgeschrittene Wallets erlauben sogar die manuelle UTXO-Auswahl), kannst du selbst gezielt Einfluss auf die in diesem Beitrag beschriebene Abwägung zwischen Gebühren und Privatsphäre nehmen, statt sie blind der Software zu überlassen.
Fazit: Eine Wallet ist mehr als eine hübsche Oberfläche
Coin-Selection, Descriptors und PSBT laufen im Hintergrund fast unsichtbar ab, aber genau diese drei Bausteine entscheiden darüber, ob eine Zahlung günstig oder teuer, privat oder leicht nachverfolgbar, und ob eine Mehrfachsignatur-Konstruktion praktisch nutzbar oder ein IT-Albtraum ist.
Weiter geht's mit Teil 7: Der Draht nach draußen, wie externe Programme und Apps mit einem Bitcoin-Node sprechen.