用語集 / トランザクションと手数料
デジタル署名
別名は署名、ECDSA署名、Digital signatureです。
- デジタル署名とは?
- デジタル署名は、秘密鍵を用いて作成される証明であり、ビットコインのトランザクションを承認した者が、そのコインがロックされていた鍵を管理していたこと、および取引の詳細が改ざんされていないことを示します。
ビットコインはもはやECDSAだけではありません。1、3、またはbc1qで始まるアドレスのコインは、71または72バイトのECDSA署名で解錠されます。bc1pで始まるアドレスのコインは、2021年11月から稼働している64バイトのSchnorr署名を使用します。いずれの場合も、署名は鍵の管理を証明するものであり、その人物が誰であるかを証明するものでは決してありません。
仕組み
署名の作成には3つの要素が必要です。秘密鍵、nonceと呼ばれる使い捨ての乱数、そしてそのインプットに選ばれたフラグによって切り詰められたトランザクションのダイジェストです。
結果は、ビットコインが最初のリリース以来使用している楕円曲線secp256k1上で計算された2つの数値の組になります。検証では、公開鍵を用いて同じ演算を逆方向に実行し、ノードはそれをscriptのオペコードOP_CHECKSIGの中で行います。どの段階でも暗号化は行われず、署名はその背後にある秘密鍵について何も開示しません。
使用されている2つの方式は、その数値の組を異なる形でまとめます。ECDSA署名はDERで包まれているため、固定長ではなく71または72バイトになり、最後のバイトは署名の一部ではまったくありません。それはトランザクションのどの部分が対象に含まれたかを示すフラグです。BIP340に基づくSchnorr署名は、包みのない64バイトそのままであり、既定値が適用される場合はフラグのバイトが完全に省略されるため、65バイトになるのは署名者が通常とは異なることを望む場合だけです。
問題が起きるのはnonceの部分です。同じ鍵で同じnonceを2回使うと、秘密鍵は中学校で習う代数で割り出されてしまいます。これは理論上の心配ではありません。2013年8月11日に、bitcoin.orgは、影響を受けた端末のウォレットアプリが繰り返し同じ値を生成してしまうAndroidの不具合についての注意喚起を公開し、その結果コインが盗まれました。現在のウォレットは、鍵とメッセージから決定論的にnonceを導出しており、ECDSAではRFC 6979に、BIP340では同等の規則に従っています。
目にする場所
行うすべての支払いには、少なくとも1つの署名が含まれています。ブロックエクスプローラーでは、segwitインプットのwitnessまたはレガシーインプットのアンロックスクリプトの中にある長い16進数の文字列であり、ECDSA署名の末尾の01はフラグであって、数学の一部ではありません。
署名はトランザクション以外でも機能します。アドレスの背後にある鍵で平文メッセージに署名すれば、1サトシも動かすことなくそのアドレスを管理していることを証明でき、取引所が出金先を確認する方法、準備金証明の証明書が組み立てられる方法、個人間取引のマーケットプレイスの売り手がアドレスが本当に自分のものであることを示す方法がこれにあたります。元の形式は1で始まるアドレスにしか機能しませんでしたが、BIP322はメッセージ署名を現在使用されているすべてのアドレス形式に拡張します。
この区別は、誰かが署名を求めてきたときには常に重要です。署名されたメッセージはコインを動かせません。トランザクションに対する署名はすべてのコインを動かせるため、どちらを求められているかを確実に知る唯一の方法は、ウェブサイトの画面ではなくハードウェアウォレットの画面を読むことです。
デジタル署名vs署名ハッシュ
署名ハッシュは入力であり、署名は出力です。ウォレットはまずトランザクションの特定の一部分を対象とするダイジェストを構築し、そのダイジェストに署名するため、署名はダイジェストが除外した部分について一切何も示しません。これは技術的な細かい話ではありません。sighashフラグが存在する理由そのものであり、1つのトランザクションに対する2つの署名がまったく異なるものを保護し得る理由を説明するものです。