ビットコインの署名は、2つの数字、rとsです。それを生成する手順は5行で収まり、検証する手順は3行で収まり、その機能の理由は1つの代数的な置換で説明できます。このレッスンでは、その3つのことを行います。
まず、入力されるものから始めましょう。署名されたメッセージはトランザクションであり、SHA-256で要約され、zという数字として読み取られます。秘密鍵は数字dであり、公開鍵は点Qで、これはd倍のGに相当します。そして、もう1つの要素として、ランダムに選ばれるnonce kがあります。
署名には4つのステップがあります。kを1からn-1の間でランダムに選びます。点k倍のGを計算し、そのx座標をnで割った余りを取ります。これがrです。sを、kの逆数にzとr倍のdを足したものを掛けたものをnで割った余りとして計算します。署名はr, sのペアです。もしrまたはsが0になる場合は、別のkを選び直しますが、実際にはほとんど起こりません。
秘密鍵dは3行目で一度だけ現れ、zと混ざり合い、kの逆数との掛け算で保護されています。rやsにはそれを分離するものは何もありません — kが毎回異なる限り、次のレッスンはそれが同じ場合に何が起こるかについてです。
検証には3つのステップがあります。検証者が持っているのはトランザクション、公開鍵Q、そしてr, sのペアだけです。sの逆数をnで計算します。それにzを掛けてu1とし、rを掛けてu2とします。u1倍のGとu2倍のQの点を足します。計算された点のx座標をnで割った余りがrと等しければ、署名は有効です。

さて、すべてを説明する置換です。検証で計算された点は、u1倍のGとu2倍のQです。Qをd倍のGに置き換えると、これはsの逆数にzとr倍のdを足したものを掛けたものになります。そして、sはまさにkの逆数にその同じ和を掛けたものとして定義されているので、sの逆数にその和を掛けたものは単にkです。検証が生成する点はk倍のGです:これは署名者が2番目のステップで計算した点であり、そのx座標が比較されているrになりました。
これが、何も明らかにせずに検証が機能する理由です。検証者はdを発見せず、kを発見せず、どのように選ばれたかを知ることはありません。ただし、異なる経路で同じ点を再構築し、2つの経路が交わることを確認します。
3つの実用的な詳細がこの話題を締めくくります。
1つ目は、rが点のx座標だけを保持し、高さは捨てられることです。各xは2つの点に対応し、1つは軸の上、もう1つは下にあります。署名だけではどちらであったかはわかりません。これが、署名から公開鍵を復元するために追加の回復ビットが必要な理由であり、通常のトランザクションが公開鍵を推測するのではなく運ぶ理由です。

2つ目は、対称性の不都合な結果です。sの値を持つすべての有効な署名には、n-sの値も有効です — 2つの異なるペアが同じことを証明します。これは、トランザクションの識別子を無効にせずに変更できることを許しましたが、これはブロック戦争で言及された欠陥です。2016年以来、ネットワークは2つの値のうち小さい方を要求し、もう1つの経路は閉じられました。

3つ目はパッケージングです。2つの数字は、証明書の標準から引き継がれた形式であるDERで送信され、長さとタイプのマーカーのために70から72バイトを消費します。TaprootがもたらしたSchnorr署名は、固定された64バイトで装飾がありません — その更新の一部の節約はここにあります。
このレッスンの数学は堅固で、1度も破られたことはありません。実際に破られたのは、3行目のランダムな選択であり、実際の損害を伴い、いくつかの有名なケースで発生しました。次のレッスンでは、繰り返されるnonceと秘密鍵を明かす高校の代数についてです。