Bitcoinlib bezieht sich auf die Anforderung, dass, wenn s > ORDER / 2
, dann stattdessen das Komplement von s
verwendet werden sollte, da es ein Byte kürzer ist
Das hört sich so an, als würde es sich auf den inversen oder negativen s
Wert beziehen, aber ich weiß auch, dass Komplement ein Begriff aus der Informatik sein kann.
Den relevanten Code finden Sie hier (vielleicht kann sich jemand mit dem Code von Bitcoin Core auskennen, was der Code tut), also worauf bezieht sich das Komplement von s ?
In ECDSA s
kann es sich auf beiden Seiten der Kurve befinden und die Signatur ist immer noch gültig. Der Begriff „niedrig s
“ bezieht sich auf den Wert, der buchstäblich unter der Kurvenreihenfolge liegt ( 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ). Die Anforderung von Low- s
ist willkürlich (High s
hätte auch gut funktioniert) und ist eine der neuen BIP62- Gültigkeitsregeln, die die Veränderbarkeit von Transaktionen bekämpfen sollen.
Ohne diese Regel ist jede Person in der Lage, eine Bitcoin-Transaktion zu nehmen, eine s
ihrer Signaturen einzugeben und die Transaktion mit einer anderen TXID wieder herauszuschieben. Wenn Sie dies tun können, ändert sich nur der Hash der Transaktion und in keiner Weise ihre Gültigkeit. Die Möglichkeit, Transaktionen zu mutieren, unterbricht eine Reihe potenziell interessanter Transaktionstypen in Bitcoin, wie z. B. Zahlungskanäle, bei denen Transaktionsketten plötzlich ungültig werden, indem ein übergeordnetes Element mutiert und eine alternative Form in einen Block aufgenommen wird.
Indem gültige Transaktionen gezwungen werden, immer niedrig zu sein, s
wird diese Fähigkeit entfernt, obwohl eine Person mit dem privaten Schlüssel für eine Transaktion immer noch in der Lage ist, ihre eigenen Transaktionen zu mutieren, indem sie sie mit einer neuen Nonce zurückgibt.
Worauf bezieht sich das Komplement von s?
Ich habe diesen Begriff noch nie so verwendet gehört, aber beim Lesen des Codes scheint es zu vergleichen s
, ob er mehr als n/2
abgerundet ist (wo n
ist die Reihenfolge der Kurve, FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
.)
Wenn dies der Fall ist, wird dies berechnet n - s
und verwendet als s
.
Zauberer von Ozzie
Amaclin
s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1;
Zauberer von Ozzie
Claris
python-bitcoinlib
ist unpythonisch, weil es alle Strukturen emuliert, die Sie in der Codebasis von Bitcoin Cores CPP finden. Sie könnten es pythonischer machen, aber auf diese Weise wäre es nicht so nützlich.