コインを動かさずに行う所有証明
ビットコインアドレスの秘密鍵でメッセージに署名すれば、コインを一枚も動かさずにそのアドレスを管理していることを示せる。2011年のsignmessageからBIP-137、2026年に完了したBIP-322まで、そして署名が証明できないことと取引所の個人ウォレット確認までを整理する。
2016年5月2日、クレイグ・ライトは自分がサトシ・ナカモトである証拠として、ブログに一つの署名を掲げた。サルトルの文章にサトシの鍵で署名したという説明が付いていた。ほどなくして、その署名は2009年にブロックチェーンへすでに記録されていた取引からそのまま写してきたものだと判明した。セキュリティ研究者のダン・カミンスキーは彼を、世界初の暗号学的に証明可能な詐欺師と呼んだ。
4年後の2020年5月、ライトが米国の訴訟で自分のものだと提出したアドレス145個で署名されたメッセージが公開された。最初の一文はこうだ。クレイグ・スティーブン・ライトは嘘つきで詐欺師である、彼はこのメッセージに署名した鍵を持っていない。最後の一文は、我々は皆サトシだ、だった。
二つの出来事で使われた道具は同じだ。ビットコインアドレスの秘密鍵で任意の文章に署名する機能である。一度は崩れた偽造に、一度はその主張を退ける証拠に使われた。2027年2月からは、この道具が韓国の普通の利用者にも近くなる。トラベルルールの改正で、個人ウォレットとの移転は送信人と受信人が同一の場合に限って認められ、同一人物であることを確かめる最もきれいな方法がメッセージ署名だからだ。
秘密を見せずに秘密を証明する
ビットコインで所有とは、アドレスに対応する秘密鍵を握っていることを意味する。コインを使うにはその鍵で取引に署名しなければならず、ネットワークは署名が正しいかだけを確かめる。鍵そのものはどこにも送られない。
メッセージ署名は、この構造から取引を外して文章を入れたものだ。取引所が「2026年10月13日、取引所アカウント確認用」という文章を渡すと、私はその文章に自分のアドレスの鍵で署名して返す。取引所はアドレスと文章と署名の三つだけで検証する。正しければ、この文章に署名した者がそのアドレスを使える鍵を持っているという結論になり、コインは一枚も動かない。
ライトの2016年の署名が崩れた地点もここに見える。署名は数学的には有効だった。ただしそれはサルトルの文章ではなく、2009年の取引の内容に対する署名だった。署名はどの文章に対するものかまで含めて検証されるので、検証する側が元の文章を自分で入れて確かめれば一致しない。ライトの説明は、読者がその段階を飛ばすように書かれていた。
2011年のsignmessage
メッセージ署名は2011年9月30日にPieter Wuilleのコードがマージされてビットコインに入り、同年11月のバージョン0.5.0でsignmessageとverifymessageのコマンドとして搭載された。仕組みは単純だ。署名する文章の前に決まった文言を付けてハッシュし、そのハッシュにECDSA署名をする。
Bitcoin Signed Message:\n
この文言が付く理由はBitcoin Coreのソースのコメントに書かれている。署名されたメッセージが続くことを示し、誤って取引に署名することを防ぐためだ。文章への署名がどんな場合にも取引への署名と解釈されないよう、最初から両者を分けておいたのである。
出力は65バイトで、普通はBase64の文字列でやり取りする。ここに公開鍵は含まれていない。先頭バイトに公開鍵の復元情報が入っていて、検証する側は署名と文章だけから公開鍵を計算し直す。その公開鍵のハッシュがアドレスと一致すれば通過だ。
この最後の比較のために、この方式は公開鍵ハッシュがそのままアドレスである場合、つまり1で始まるP2PKHアドレスでしか成り立たない。今もそうだ。2026年10月現在、Bitcoin Coreのsignmessageにbc1アドレスを渡すとこのエラーが返ってくる。
Address does not refer to key
アドレスが増えて形式が分かれた
2017年のSegWit以降、ウォレットの標準アドレスは3で始まるラップドSegWitと、bc1qで始まるネイティブSegWitへ移った。アドレス形式は変わったのに、メッセージ署名は相変わらず1で始まるアドレスしか知らなかった。
ウォレットはそれぞれ回避策を作り、2019年にその慣行を文書にまとめたのがBIP-137だ。動機の節は問題をこう書く。P2PKHアドレスで署名する方法は文書がなくてもよく知られた手順だが、SegWitアドレスの導入で、署名からそれがP2PKHなのかP2SHなのかbech32なのかを見分ける方法が明確でなくなった、と。BIP-137の解決策は先頭バイトの範囲を広げることだった。27から34は従来のP2PKH、35から38はラップドSegWit、39から42はネイティブSegWitである。
これはラベルを付けたのであって構造を変えたのではない。依然として単一鍵のECDSA署名なので、マルチシグのアドレス、スクリプトでロックされたアドレス、シュノア署名を使うTaprootアドレスはこの形式では扱えない。BIP-137の本文も、多くの利点を持つ新しい形式が定義されているとしてBIP-322を指し、一部のソフトウェアは新しい範囲の先頭バイトをエラーとして扱うと書いている。
BIP-322は署名を取引に変えた
BIP-322の発想は、アドレスの種類ごとに署名規則を別々に作る代わりに、ビットコインがすでに持っている検証器をそのまま使おうというものだ。どのアドレスでも、そのコインを使う方法はスクリプトが定義している。ならば、そのアドレスからコインを使うふりをする取引を作り、スクリプトを通せばよい。
そこでBIP-322は仮想の取引を二つ作る。一つ目の取引は存在しない出力を入力にする。前の取引IDがすべて0で出力番号が0xFFFFFFFFという、実際にはあり得ない場所だ。この入力にはメッセージのハッシュが入り、出力は金額0で、署名するアドレスのロックスクリプトを付ける。メッセージハッシュはBIP-340方式のタグ付きハッシュで計算し、タグ文字列はBIP0322-signed-messageである。
二つ目の取引は一つ目の取引のその出力を使う。出力は金額0のOP_RETURNが一つだけだ。署名者は二つ目の取引がスクリプト検証を通るようにウィットネスデータを埋め、それがそのまま署名になる。検証する側は二つの取引を作り直してコンセンサスルールどおりに検査する。唯一の例外は、一つ目の取引の入力が存在しないという点だ。まさにその例外のために、この取引はネットワークに流しても決して有効になり得ない。
この設計の利点は範囲だ。BIP-322の動機の節の表現では、どんなスクリプトで管理されたコインでも原理的には署名できる。マルチシグのアドレスなら複数の署名者が協力してウィットネスを埋め、そのためにPSBTに専用のフィールドが追加された。ハードウェアウォレットは、どのアドレスでどのメッセージに署名するのかを画面に表示するよう推奨されている。
形式は四つある。1で始まるアドレスにだけ使う従来方式、ウィットネスデータだけを含む簡易形式、二つ目の取引全体を含む完全形式、そして資金証明だ。2026年4月15日、BIP-322は完了ステータスになり、署名の前に形式を示す接頭辞smp、ful、pofを付けるよう変わった。後方互換を壊す変更だと文書自身が明記しているので、それ以前に作られた実装が出す署名とは形が違うことがある。6月4日には2.0.0版が出た。
検証結果も二つではなく三つだ。有効、無効、そして判定不能である。検証器がまだ知らないスクリプトのバージョンやアップグレード用のオペコードに出会うと判定不能を返す。将来のソフトフォークを前もって無効と決めつけないための仕掛けだ。
標準は終わってもウォレットはまだだ
BIPの文書は完了したが、実装にはむらがある。Bitcoin CoreにはBIP-322を入れるプルリクエストが2019年、2020年、2022年の3回出され、いずれもマージされずに閉じられた。最後の試みの作者は、ウォレットのコードの変化に追いつくための労力が、機能そのものへの関心とまったく釣り合わなかったと書き残している。Coreから分かれたBitcoin Knotsは、2025年4月のバージョン28.1でBIP-322に対応している。
ウォレットでは、Sparrowが2023年7月のバージョン1.7.8で、Taprootを含むシングルシグのアドレスにBIP-322署名を加えた。Trezor Suiteはメッセージの署名と検証の機能を提供するが、Taprootアカウントでは使えないと案内している。Ledger Liveにはビットコインのメッセージ署名機能がないので、Sparrowのような外部ウォレットにつないで署名する。
実務的に言えば、1で始まるアドレスはほぼどこでも署名と検証ができる。bc1qアドレスはたいていのウォレットでできるが、形式がBIP-137かBIP-322かによって、別のツールでは検証に失敗することがある。bc1pのTaprootアドレスとマルチシグは、BIP-322に対応した少数のツールでしかできない。
署名が証明できないこと
BIP-322は自らの限界を動機の節に直接書いている。どんなメッセージ署名プロトコルも、資金の管理を実際に証明することはできない。署名は作られた瞬間に古くなり、秘密鍵を持つ者が他人の代わりに署名することもあり得るからだ。
一つ目の限界は時間だ。署名は、それが作られた時点で誰かがその鍵を握っていたという事実しか語らない。署名の翌日に鍵が他人に渡っても、署名は有効なままだ。メッセージに日付と相手が決めたランダムな文字列を入れる理由はここにある。少なくとも、その文章ができる前に署名を用意しておくことはできなくなる。
二つ目の限界は人だ。署名が示すのは、この鍵を持つ側がこの文章に同意したということまでだ。鍵を持っているのが誰かは署名の外の問題である。カストディ業者が顧客の代わりに署名することもあれば、人に頼まれて署名することもある。2020年の145個の署名も、正確にはこれらの鍵を持つ側がライトではないことを示しただけで、その鍵を持つのが誰なのかは今も語っていない。
三つ目の限界は範囲だ。署名はそのアドレスを管理していることを示すだけで、それがすべてだということは示せない。2011年6月23日、Mt. Goxはウォレットを管理していることを示すために424,242.42424242 BTCを一度に動かした。そのウォレットが顧客残高のすべてを賄っているかについて、その取引は何も語らなかった。2014年の破綻では約85万BTCが消えていたことが明らかになった。BIP-322の資金証明形式も同じ線を引く。提示したコインがすべてであることも、まだ使われていないことも証明しようとはしないと文書に書かれている。取引所が数千のアドレスのコインをまとめてこのように示そうとするとき、何がさらに必要で、何が最後まで残るのかは準備金証明で続けて扱った。
取引所は何で確かめるのか
欧州はこの問いにリストで答えた。欧州銀行監督局のトラベルルール・ガイドラインは、1,000ユーロを超える自己管理アドレスとの移転で事業者が使える所有確認の方法を五つ挙げている。非対面の本人確認の過程でアドレスを画面に表示して見せる方法、対面での確認、事業者が決めた少額をそのアドレスと事業者の口座のあいだでやり取りする方法、そのアドレスの鍵で特定のメッセージに署名させる方法、そして信頼できるその他の技術的手段だ。一つで十分でなければ複数を組み合わせ、確認済みのアドレスはホワイトリストに載せられる。
韓国はまだ方法を決めていない。改正施行令は送・受信人が同一の場合という要件を置いただけで、同一人物を何で確認するかは監督規定と業界の案内に残されている。現在の慣行は取引所ごとに違う。アップビットは個人ウォレットのアドレスを登録するとき、ウォレットを接続してウォレット所有確認のための署名を求める。案内が例に挙げるのはメタマスクのようなブラウザ拡張ウォレットだ。2022年のホワイトリスト導入当時、コインワンは出金アドレスと本人情報が一緒に写った画面を画像か動画で受け付け、コービットはウォレット画面と身分証を一緒に撮影して提出させた。
署名方式はこの中で最も正確で、最も長く残る。画面キャプチャは取引所のサーバーにある一枚の写真だが、署名は誰でもいつでも検証し直せる数学的なつながりだ。2022年1月、Trezorがウォレット内で署名による所有証明を一度に処理するプロトコルを入れ、ほどなく撤回した理由がそれだった。反対の根拠は技術の欠陥ではなく、そのつながりが強すぎることだった。
署名する前に確かめること
取引所が署名を求めたら、まずメッセージを読む。何に同意するのかわからない文章には署名しない。メッセージ署名は取引の署名と構造的に分けられているので、一度の署名でコインが抜き取られることはないが、署名した文章はそれ自体として残る。
署名用のアドレスは別にする。署名はそのアドレスと自分の身元を永久に結び付ける。長期保管用のアドレス全体ではなく、取引所から受け取るためのアドレス一つを署名に使い、受け取った後は別のアドレスへ移すほうが、セルフカストディの意味を損ないにくい。アドレスを使い回さない習慣と同じ理由だ。
ハードウェアウォレットなら機器の画面を見る。パソコンの画面に出たメッセージと、機器が表示するメッセージとアドレスが同じかを確かめることこそ、ハードウェアウォレットを使う理由である。
最後に自分で検証してみる。署名を渡す前に、同じウォレットか別のツールの検証機能にアドレスと文章と署名を入れて通るかを確かめる。形式が分かれている今は、自分のウォレットが作った署名を相手のツールが読めないことも珍しくない。
署名は名前を語らない
2020年のメッセージは、145個のアドレスが同じ文章に署名した記録だ。その署名が証明したことはただ一つ、これらの鍵を持つ誰かがこの文章に同意したということである。その誰かの名前は署名のどこにもない。
取引所の個人ウォレット確認も同じ構造をしている。署名は鍵と文章を結び、名前はその文章を求めた側が付ける。コインを動かさずに所有を証明できるのは便利なことだ。同時に、その証明は一度渡せば取り戻せない。どのアドレスに名前を付けるかは、署名する人が選べる最後の選択である。