Welcher Algorithmus wird beim Erstellen einer Transaktion im Standard-Client verwendet, um zu bestimmen, welche nicht verbrauchten Ausgaben als Eingaben verwendet werden?
Hat sich das seit der ersten Version geändert? Welche unterschiedlichen Algorithmen werden von alternativen Kunden verwendet?
Unternimmt der Kunde einen Versuch, zu optimieren, welche „Coins“ verwendet werden, basierend auf der Minimierung der Transaktionsgröße, der daraus resultierenden Fragmentierung oder des „Alters“ der Coins (Wert/Transaktionen), die als Quelle verwendet werden?
Ich konnte die Ergebnisse der Münzauswahl nirgendwo aufgeschrieben finden und habe sie gerade aus dem Code zusammengesetzt. Es funktioniert wie von David erwähnt , aber hier sind mehr Details.
Andernfalls führt Bitcoin Core 1000 Runden durch, in denen nicht ausgegebene Transaktionsausgaben zufällig kombiniert werden, bis ihre Summe größer oder gleich dem Ziel ist. Wenn es zufällig eine genaue Übereinstimmung findet, stoppt es früh und verwendet diese.
Ansonsten begnügt man sich schließlich mit dem Minimum von
Wie David erwähnt, beschränkt sich das Teilmengenproblem zunächst auf UTXO, die mindestens eine Bestätigung haben, wenn sie von Ihnen selbst gesendet werden, oder sechs Bestätigungen, wenn sie von einer anderen Brieftasche empfangen werden, und lockert diese Anforderungen später in zwei weiteren Durchgängen, wenn kein geeigneter Satz von UTXO entdeckt werden konnte .
Alice hat vier UTXO:
• UTXO_A 0,1
BTC
• UTXO_B 0,3 BTC • UTXO_C 0,5 BTC
• UTXO_D 1 BTC
Ich werde Transaktionsgebühren der Einfachheit halber ignorieren.
Alice möchte 0,3 BTC senden .
Bitcoin Core entdeckt, dass UTXO_B mit dem Ziel übereinstimmt, und verwendet nur UTXO_B als Eingabe.
Alice möchte 0,4 BTC senden .
Bitcoin Core stellt fest, dass UTXO_C das kleinste UTXO ist, das größer als das Ziel ist, und dass die Summe aller UTXO, die kleiner als das Ziel sind (dh UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4
), hier mit dem Ziel übereinstimmt. Als Eingänge werden sowohl UTXO_A als auch UTXO_B verwendet.
Alice möchte 0,45 BTC senden .
Bitcoin Core stellt fest, dass UTXO_C das kleinste UTXO ist, das größer als das Ziel ist, und dass die Summe aller UTXO, die kleiner als das Ziel sind (dh UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4
), das Ziel nicht übersteigt. UTXO_C wird als einzige Eingabe verwendet, wobei es sich um die nächstkleinere Eingabe handelt, die größer als das Ziel ist.
Alice möchte 0,35 BTC senden .
Bitcoin Core stellt fest, dass UTXO_C das kleinste UTXO ist, das größer als das Ziel ist, und dass die Summe aller UTXO, die kleiner als das Ziel sind (dh UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4
), nicht mit dem Ziel übereinstimmt. Es addiert zufällig ausgewählte UTXO 1000 Mal, bis sie das Ziel übertreffen, wobei es sich an die kleinste ausreichende Kombination erinnert. Die kleinste ausreichende Kombination wird dann mit der kleinsten einzelnen Eingabe verglichen, die größer als das Ziel ist. Unter der Annahme, dass es hier die beste Kombination findet, die wäre UTXO_A + UTXO_B
, findet es das Target < UTXO_A + UTXO_B < UTXO_C
und verwendet UTXO_A und UTXO_B als Eingaben.
Alice möchte 0,6 BTC senden .
Bitcoin Core stellt fest, dass UTXO_D das kleinste UTXO ist, das größer als das Ziel ist, und dass die Summe aller UTXO, die kleiner als das Ziel sind (dh UTXO_A + UTXO_B + UTXO_C = 0.1 + 0.3 + 0.5 = 0.9
), nicht mit dem Ziel übereinstimmt. Es beginnt wie zuvor, zufällige Kombinationen auszuprobieren, und in dieser Situation würde es wahrscheinlich feststellen, dass UTXO_A + UTXO_C = Target
. Wenn es eine Kombination findet, die dem Ziel entspricht, bricht es und geht sofort mit dieser Kombination weiter. Als Eingänge werden UTXO_A und UTXO_C verwendet.
¹ „Ziel“ wird hier für den auszugebenden Betrag verwendet.
² UTXO = Nicht ausgegebene Transaktionsausgabe
Ja, genau das macht der Kunde. Dazu verwendet es Heuristiken, um ein Teilmengen-/Summen- oder Rucksackproblem zu lösen.
Es verwendet einen Multi-Pass-Ansatz und versucht zunächst, nur Coins mit mindestens sechs Bestätigungen zu verwenden. In den nächsten beiden Durchgängen lockert es diese Anforderungen. In jedem Durchlauf versucht es, die Anzahl der beanspruchten Transaktionsausgaben und dann die zurückgegebene Wechselgeldmenge zu minimieren.
Beachten Sie, dass alle Münzen in Ihrer Brieftasche berücksichtigt werden. In dem vom Bitcoin-Client verwendeten Abrechnungsmodell gehören bestimmte Coins nicht zu bestimmten Konten.
Wenn Sie den Code selbst überprüfen möchten, suchen Sie nach SelectCoins
in wallet.cpp
.
foreach address in account { foreach transaction { foreach output ...if spent?... }}}
aber einige Werte könnten zwischengespeichert/denormalisiert werden. Vielen Dank!
Meni Rosenfeld
Stefan Gornik