Sapper

June 23, 2019 ~ 1 min read

秘密鍵・公開鍵・アドレスとトランザクション【ブロックチェーン】


暗号通貨の所有権は、デジタル鍵、アドレス、デジタル署名に基礎を置いています。

まず、デジタル鍵とは、秘密鍵とか公開鍵のことです。

そして、公開鍵、秘密鍵はどういうものなのか簡単にいうと、公開鍵は銀行の口座番号、秘密鍵は銀行のPINコードや小切手への署名という風に考えることができます。

次に、アドレスは小切手の受取人名と考えることができます。

以下に実際の仕組みを見て上の例えがどういうことなのかを確かめていきます。

用途

暗号通貨を送る際にはトランザクションを作成するのですが、トランザクションは簡略化するとインプットとアウトプットで構成されています。

アウトプットには暗号通貨の額とlocking script(別名scriptPubKey)と呼ばれるアウトプットを使用するために必要な条件を定義したscriptが含まれています。

ここでlocking scriptにはいくつか形式があり、決まっているみたいなのですが、一般的には公開鍵にハッシュ関数を用いたもの(アドレス)となっているみたいです。

話がそれるんですが、他にも公開鍵そのものが格納される形式もあり、これを見て公開鍵とアドレスの違いというかアドレスの必要性に少し疑問を持ちました。

読みやすくするために公開鍵からアドレスに変換していることも考えられるのですが、読みやすくするためにはBase58Checkエンコードという変換だけをすれば良いと思い、ハッシュ関数を使う理由には弱いかなと思いました。

他に何とか絞り出した理由としてハッシュ関数は一方向にしか計算できないものなんですが、アドレスから公開鍵は特定できないことを利用して1つの公開鍵からアドレスを多く作り、安全性を高めるといったことも考えられるのかなと思いました。

まあどちらにしても公開鍵(アドレス)はトランザクションのアウトプットをロックするために使われていることが分かりました。

次にインプットにはUTXO(未使用アウトプット)へのポインタとunlocking script(別名scriptSig)と呼ばれるUTXOのロック(locking script)を解除するscriptが含まれています。

unlocking scriptが(使いたいUTXOのlocking scriptに含まれる公開鍵(アドレス)に対応している)秘密鍵から作られた有効な署名を持っていればそのUTXOを使うことができます。

以上から秘密鍵はトランザクションのインプットに含まれていることが分かり、小切手に署名することで、そのお金が使えるようになるのと同じであることが分かりました。

unlocking scriptのスマートな記述方法

ちなみに、上ではlocking scriptにはアドレスとがが入っていると書いたのですが、例えばUTXOを何人かの人が使えるようにしたいときは、その人たちのアドレスを並べる必要は無くまとまった形にする方法があり、このことから、アウトプット=アドレスと考えるよりはアウトプット=locking scriptと考えるべきで、取引の相手方を柔軟に表現できる仕組みとなっています。

では、そのいわゆるマルチシグをスマートに表現できる方法ですが、P2SHというスクリプトの設定方式を使っています。

この方式では、redeem scriptという考えを使っており、locking scriptにredeem scriptのハッシュ(これは分かりやすい形にできる)を入れておき、reddem scriptをunlocking scriptで提示することで、資金をアンロックすることができます。

しかし、別に複雑な表現がどこかにいったわけではなく、redeem script自体は複数のアドレスを含む必要があるので、負担が受け手に回った形です。

ただ、トランザクションの多くはP2PKHというscriptの形式が使われており、これはアドレスをそのままlocking scriptに格納しているみたいです。

署名の仕組み

秘密鍵から作られた有効な署名ってどういうことだと思ったかもしれないので以下で説明します。

まず、電子署名はトランザクションの一部(電子署名以外、電子署名を作るのだからそもそもまだ存在していない)をSHAダブルハッシュで変換して、それと秘密鍵をECDSA署名器に入れて、その出力結果の後ろにsignature hash typesを付けることで作成されます。

私は初め、署名は上で説明したようなUTXOを使うためにだけ必要と思っており、何故、こんな一見面倒なことをするのか不思議で、秘密鍵を入力すれば良いんじゃないのか?と思っていました。

しかし、実はそれと同時に、署名後にトランザクションの内容が不当に変更されていないことも検証できるのです。

その方法は、電子署名以外のトランザクションデータのハッシュ値と電子署名(unlocking script)を公開鍵によって復号したものとを比較するという風になっています。

生成方法

次に秘密鍵、公開鍵、アドレスがどのように生成されるかですが、まず秘密鍵は数値で通常ランダムに選ばれます。

公開鍵は一方向性関数である楕円曲線上のスカラー倍算を用いて、秘密鍵から生成されます。

続いて、一方向性ハッシュ関数を用いて、公開鍵からアドレスを生成します。

以上からデジタル鍵はユーザのウォレットでインターネットにつながっていなくても生成と管理ができることが分かりました。

そして、ウォレットには暗号通貨そのものではなくキーペアリストが格納されており、各ペアは公開鍵と秘密鍵で構成されています。

秘密鍵が流出してしまうと、この鍵に紐づく未使用の暗号通貨を誰でも使うことができてしまうので秘密鍵の管理はとても重要です。

まとめ

秘密鍵→公開鍵→アドレスの順で作られ、あるアドレス宛てのUTXO(使われていないアウトプット)を使うにはそのアドレスに対応する電子署名を持っている必要があります。

電子署名は実行しようとするトランザクションデータのハッシュ値と秘密鍵から作成されますが、それを公開鍵によって復号したものとトランザクションデータのハッシュ値を比較することで、トランザクションを検証できます。


Keitaro Yamaguchi

ケイタロです. うどん・寿司・天ぷらが好きです.
Twitter, GitHub, Instagram.