見出し画像

PKHとビットコインアドレス|詳解ビットコイン④

『詳解ビットコイン』(Kalle Rosenbaum著、オライリージャパン)を読んでいます。その個人的なまとめとして書いていきます。

ビットコインでは利用者名を用いない

ビットコインネットワーク上で行われたすべての取引は、専用の台帳に記録されています。この取引記録は、利用者名を用いることなく記されます。

利用者名を用いないことでプライバシーを保護できます。また、ほかの方法を使う場合と比べて、検証者の負担を減らせる可能性があります。

逆にいえば、利用者名を用いるとプライバシー保護が難しくなり、検証者の負担を増やす可能性があります。

利用者名を用いるとどうなる?

詳解ビットコインでは、利用者名を用いる場合の運用方法が示されています。その方法を紹介していきます。ジョンが1BTCを送りたいという状況を考えてみましょう。

ジョンは以下のようなトランザクションを作ります。送信者の名前(ジョン)と受取人の名前(アリス)、送金額、署名が含まれています。

トランザクションを受け取った検証者は、ジョンが1BTC以上の有効な残高を持っているのか、署名に問題がないかの2点を検証します。

この検証をするためにはジョンの公開鍵が必要です。そこで検証者は、別途管理している名前と公開鍵の対応表を使い、ジョンの公開鍵を見つけて検証を進めます。

トランザクションに問題がなかったなら、検証者はアリスの公開鍵を調べ、1BTCをアリスが利用できる残高に加えます。また、台帳に記録を付け足します。

利用者名を用いる場合、上記のような台帳が作られることになります。透明性向上のためにこの台帳が公開されているなら、他人にプライベートな情報を知られてしまいます。利用者は良い気分ではないでしょう。

また、このような運用では検証者が大変そうです。検証者は取引記録の台帳だけでなく、利用者名と公開鍵の付け合わせ表の管理もしないといけません。

利用者名の代わりにPKHを使う

ビットコインでは、利用者名ではなくPKHが使われています。例えば、ジョンがアリスに1BTCを送りたいなら、ジョンは宛先欄に「アリス」と入力するのではなく、アリスから教えてもらったPKHを入力するというイメージです。

そもそもPKHとは?

PKHとは、公開鍵を暗号学的ハッシュ関数にかけた結果に得られるものです。以下のように、SHA-256とRIPEMDー160という2種類の関数を用いて出力します。

公開鍵を直接使うほうがシンプルですが、わざわざハッシュ関数にかけて得られた値を使っています。公開鍵ではなくPKHを使っているのは、セキュリティを向上させるためだと考えられています。

前提として、公開鍵自体は知られても問題ありません。公開鍵は秘密鍵を元として生成されていますが、公開鍵の生成には一方公的関数である公開鍵生成関数が使われているので、公開鍵が知られたとしても秘密鍵を算出することは困難だからです。

しかし、今後量子コンピュータの登場などによって公開鍵生成関数が破られることがあるかもしれないので、公開鍵を知られてしまうことに抵抗を感じる人もいるでしょう。その点、公開鍵を暗号学的ハッシュ関数で処理して作ったPKHであればより安心です。PKHを知られたとしても、秘密鍵は暗号学的ハッシュ関数と公開鍵生成関数によって2重に保護されている状態だからです。

SHA-256とRIPEMD-160の2種類の関数が使われている理由は不明です。本書では、SHA-256はセキュリティを高める目的で、RIPEMD-160は値のサイズを小さくする目的で使われたのではないかと指摘されています。ちなみに、SHA-256の出力のサイズは32バイト(256ビット)であり、16進数なら64文字分です。一方、RIPEMD-160の出力のサイズは20バイト(160ビット)であり、16進数なら40文字で表せます。

PKHを使う場合の運用

ジョンが1BTCを送りたいという状況があったとして、PKHがどのように活用されるのかを見てみましょう。

ジョンは以下のようなトランザクションを作ります。トランザクションは送信者の名前(ジョン)や受取人の名前(アリス)を含みません。名前の代わりに送信者の公開鍵や受取人のPKHが含まれています。

送信者であるジョンは、自分のPKHではなく公開鍵をトランザクションに含めています。公開鍵がないと、検証者がデジタル署名を検証できないからです。ちなみに先述したように、公開鍵は知られても大丈夫ではありますが、なるべくなら知られないほうが安心です。そこでビットコインでは、公開鍵を一度公開したアドレスがそれ以降に使われないような仕組みが採用されています。

トランザクションを受け取った検証者は、ジョンが1BTC以上の有効な残高を持っているのか(※実際にはUTXOが未使用かを確認します)、署名に問題がないかの2点を検証します。

この検証をするためにはジョンの公開鍵が必要ですが、公開鍵はもともとトランザクションに含まれています。検証者は自前の管理シートをチェックして、ジョンの公開鍵を探す必要がありません。

トランザクションに問題がなかったなら、検証者はPKHが管理する残高を増やし、以下のように台帳に記録を付け足します。利用者名を使っていたときは、ここでも名前と公開鍵の参照表を確認する必要がありましたが、PKHを使う場合はその必要がありません。

上記のイラストでは「From:」と「To:」にPKHを入力しています。この運用をする場合、ジョンのPKHはトランザクションに含まれていないので、検証者がSHA-256とRIPEMD-160を使って作る必要があります。

(おそらくですが、ビットコインの台帳はPKHではなく、ビットコインアドレスによって送信元と宛先を管理しています。)

透明性向上のためにこの台帳が公開されていると考えたとき、利用者名がそのまま出るよりはマシだといえそうです。しかし、PKHと名前を一度照合されてしまったら、利用者名を使っていたときと同じようにプライベートな情報を知られてしまいます。これについての対策は、次回見ていくことになります。

PKHを使うことで誤入力が増えるかも

利用者名ではなくPKHを使うようにしたことで、プライバシーの点でマシになりましたし、検証者が名前と公開鍵の参照表を作る必要がなくなります。

このように、PKHを用いることでネットワークは使いやすくなるのですが、これによるデメリットも考えられます。それは、PKHを誤入力して送金ミスをするリスクが高まることです。

宛先欄に書くのが利用者名であれば、間違える人はそこまで多くなさそうだと思われますが、PKHを入力するとなると間違えてしまう人が増える恐れがあります。PKHは人間にとって識別しづらいからです。

意図しないPKHを宛先に入力してしまった場合、トークンは誰にも使えない状態になってしまいます。つまり、誤入力したらお金を捨ててしまうことになります。

ビットコインアドレスを使うことで誤送金を減らせる

利用者たちがビットコインアドレスを使ってやりとりすれば、誤送金を減らせます。ビットコインアドレスとは、PKHに一定の処理を施して作るものです。

ビットコインアドレスを使う場合でも、送金のやり方は大きく変わりません。ジョンがアリスに1BTCを送りたいという状況なら、ジョンはアリスにPKHではなくビットコインアドレスを教えてもらうことになります。そしてジョンは、トランザクション作成時に宛先欄にPKHではなくビットコインアドレスを入力します。

正しいビットコインアドレスが入力されたなら、ウォレットは自動でそれをPKHに変換してトランザクションを作ってくれます。誤りが確認されるビットコインアドレスが入力されたなら、ウォレットはそれを検知して送金を中止してくれます。

ビットコインアドレスからPKHに戻す作業をする中では、変化が加えていないか(入力したアドレスにおかしい点がないか)のチェックもできます。完璧にチェックしきれるわけではありませんが、多くのミスを防ぐことができます。

なお、PKHからビットコインアドレスを作ったり、ビットコインアドレスからPKHを求めたりするのはウォレットがやって入れます。ユーザーが小難しい処理をする必要はありません。


この記事が気に入ったらサポートをしてみませんか?