Coin Brief ENDE

Ein BIP-352-Fix verhindert, dass der Silent-Payments-Test auf Nichts prüft

Eine im Referenzcode von BIP-352 (Silent Payments) zusammengeführte Änderung ist eine kleine, aber exemplarische Korrektur. In create_outputs prüfte der Code, dass die Summe der Eingabe-Privatschlüssel einem expected-Wert aus den Testvektoren entspricht:

assert Scalar.from_bytes_checked(bytes.fromhex(expected.get("input_private_key_sum"))) == a_sum

Das Argument expected ist optional. Fehlte es, wurde expected.get(...) auf None aufgerufen — die Assertion verglich nichts Sinnvolles, sie stürzte ab. Der Fix sichert sie ab:

if expected is not None:
    assert Scalar.from_bytes_checked(...) == a_sum
Ein BIP-352-Fix verhindert, dass der Silent-Payments-Test auf Nichts prüft
Ein BIP-352-Fix verhindert, dass der Silent-Payments-Test auf Nichts prüft — Coin Brief

Was das bedeutet

Ein optionales Argument, das der Code bedingungslos dereferenziert, ist nicht optional. Die Signatur sagte, expected dürfe fehlen; der Rumpf nahm an, es fehle nie. Diese Lücke ist der Fehler — einer der häufigsten in jeder Sprache mit nullbaren Werten: Typ oder Docstring versprechen eine Optionalität, die der Code nicht einhält.

In Referenzcode ist der Einsatz höher, als der Diff nahelegt. Die Referenzimplementierung von BIP-352 ist das, woran andere Wallets sich prüfen. Ein Test-Helfer, der beim dokumentierten Aufruf abstürzt, ist ein kleiner Defekt mit großer Reichweite: Jeder Implementierer, der die Vektoren ohne das optionale Feld fährt, läuft hinein.

Die richtige Form ist die dieses Fixes: die Optionalität am Ort der Nutzung einhalten. Nicht „das Argument verpflichtend machen", was Aufrufer bräche, die es zu Recht weglassen, sondern „nur prüfen, wenn das Vergleichsobjekt existiert". Die Assertion feuert weiter, wenn sie kann; sie feuert nur nicht mehr, wenn es nichts zu prüfen gibt.

Quelle: https://github.com/bitcoin/bips/commit/8754690b725e9aa93ca8bd91bf0ac85dc44ce096

Geschrieben von Victoria Shinder.