こんばんは、
仮想通貨と聞いて、通貨の形をしたファイルがいっぱいあるイメージを思い浮かべた ちきなるです。
最近、仮想通貨と言う言葉を良く聞くのですが、具体的にどんなの?
デジタルなマネーがインスタンスするの?
何て変な想像をしていましたが、具体的にどんなものか調べたので、それをまとめてみます。
仮想通貨って何ぞや?
実際には存在せず、デジタルな情報として存在する仮想の通貨を仮想通貨といいます。
円やドルの様に国が発行している通貨は、硬貨や紙幣のように実物が存在します。仮想通貨の場合、実物は存在せずデジタルな情報だけが存在します。
通貨と言われると、硬貨や紙幣を想像すると思います。
仮想通貨でも、デジタルな情報として硬貨や紙幣があるように思えますが、仮想通貨にはデジタルな情報としても硬貨や紙幣は存在しません。
では、仮想通貨には何が存在するかと言うと、取引情報だけが存在します。
“AさんがBさんに100仮想通貨を送った”
という様な取引の情報だけが存在します。
過去にあった全ての取引を記録して、通貨の管理を行っています。
※あくまでイメージです
どのように通貨を管理しているかというと、まず取引を使用情報と送付情報に分けて管理します。
使用情報で使用する仮想通貨を選択し、送付情報として別の人へ仮想通貨を送ります。使用情報で選択する仮想通貨は、過去に受け取った送付情報です。
送付情報が送付した相手の新たな仮想通貨になり、使用情報が使用する送付情報の選択になります。
※赤い四角は、Aさんから送付情報を受け取り、受け取った送付情報を使用情報で使用しています。
送付を行う時、使用する送付情報に書かれている全ての通貨を使用します。こうすると、1度の取引で送付情報が使用済みとなります。
1度の取引で送付情報が使用済みになると、使用情報で選択されているかどうかで送付情報が使用済みかどうか判断できます。
送付情報に書かれている通貨を全て使用すると、細かな取引ができなくなります。50の仮想通貨を送りたいのに、100の送付情報しかないと、取引が困難になります。
そのため仮想通貨では、1度の取引に複数の送付情報が選択でき、新たに複数の送付情報を作ることができます。
※送付したい額より送付情報の額が多い場合、相手に送る送付情報と、残りの額を自分に送付する送付情報を作ります。
左側は、100の送付情報を選択して、50ずつに分けて送付しています。
右側は、100と50の送付情報を選択して150で送付しています。
通貨を送付する時、使用する送付情報が自分のだと証明する必要があります。証明しなければ、別の人に勝手に使われてしまう危険があります。
仮想通貨では、個人の証明に公開鍵暗号方式を応用したデジタル署名が使用されています。
※公開鍵暗号方式とは、全体に公開された鍵(公開鍵)で暗号化を行い、自分だけが持っている鍵(秘密鍵)で複合化を行います。公開鍵と秘密鍵2つの異なる鍵を1つのセットとして暗号と複合を行う暗号方式です。
※デジタル署名は、秘密鍵と公開鍵を使用し、秘密鍵で署名を作成し、公開鍵で署名の検証を行う技術です。
ビットコインで主に使われている証明方法を例として書きます。
ビットコインでは、ビットコインアドレスと言われる値があります。
ビットコインアドレスは、公開鍵に特定の処理を行い作成されます。
※公開鍵を複数回ハッシュ関数に入力し出力された値を変形して作成されます。
※ハッシュ関数とは、値を入力すると別の値を出力する処理です。いろいろな種類があり、出力した値で入力した値が判別できないこと。少しでも異なる入力を行うと、まったく異なる出力をすること。などの条件を満たすハッシュ関数が使われています。(SHA-256やRIPEMD-160などが使われています。)
送付情報を作る時、ビットコインアドレスを後ろに付けます。
使用情報で、送付情報を選択する時、対応する自分の公開鍵と公開鍵が自分の物であることを証明する署名(秘密鍵を使い作成)を付けます。
使用情報に付いている公開鍵を特定の処理でビットコインアドレスに変形し、送付情報についているビットコインアドレスと比較します。一致した場合、署名を使い公開鍵が自分の物であることを証明すると、送付情報が自分宛に送られた事を証明できます。
※ビットコインアドレスは、1度しか使いません。複数回取引を行う場合、そのたびに新しい秘密鍵と公開鍵で、ビットコインアドレスを作成します。送付情報1つ1つに対応する秘密鍵と公開鍵があります。
これがビットコインで主に使われている証明方法で、他にもいくつかの方法があります。
※複数人で署名を行わなければ使用できないものや、一定の時間が経たないと使用できない物などがあります。
ここまでのまとめ
仮想通貨では、取引を記録することで通貨を管理しています。
取引は、使用情報と送付情報で作られています。
未使用の送付情報が現在所持している仮想通貨を示し、使用情報が送付情報を使用したかどうかを示します。
※取引を作成する時は、自分が受け取った未使用の送付情報を使用情報で選択し、新たな送付情報を作ります。新たな送付情報が送付相手の新たな未使用の送付情報になります。
全ての取引を記録すると、使用情報で使用されていない未使用の送付情報が現在使用可能な全ての通貨を表すことになり、通貨を完全に管理することが出来ます。
取引には、送信者の記録は残らず、受け取った相手の情報も個人が識別できないようになっています。個人が識別されずに自分の物であることを証明するために、デジタル署名を応用した方法で証明できるようになっています。
※仮想通貨の取引情報のイメージです。ビットコインでは、Bへなど相手の情報はビットコインアドレスで表されています。
ここまで、取引に注目して仮想通貨を説明してきました。
ここからは、仮想通貨の目的とともに、それを実現するための技術について説明していきます。
仮想通貨(ビットコイン)の目的
括弧でビットコインと書いていますが、ビットコインは仮想通貨の雛形の様な存在で、他の仮想通貨はビットコインの機能を元に作られています。
そのためビットコインの目的が、仮想通貨全体の目的になると思います。
ビットコインの目的は、インターネットで行われる、第三者機関を通さない二者間の取引です。
ビットコインでは、二重使用の問題の解決と、非可逆的取引の実現を行って、二者間で安全な取引ができるように作られています。
二重使用の問題は、すでに取引で使用している通貨を再度別の取引で使ってしまう問題です。第三者機関を通した場合、第三者機関が二重使用のチェックを行います。二者間の取引の場合、この二重使用のチェックが問題になります。
非可逆的な取引とは、一度承認されると取り消すことができない取引のことです。通貨の取引は、通貨を支払う側と対価を提供する側で行われます。可逆的な取引の場合、提供する対価が1度提供すると元に戻せない物の場合、取引の取り消しで、対価の提供側が一方的に不利益を受ける危険があります。より多くの人が通貨を使用するためには、非可逆的な取引が重要です。
※通貨を支払う側の支払うタイミングを調整出来ると、通貨を支払う側も守られます。ビットコインでは、デジタル署名の部分で調整が出来るようになっています。
インターネットでの二者間の取引で起こる問題を解消し、安全により多くの人が利用できるように考えられたのがビットコインです。
これを実現するためにビットコインに組み込まれた技術をブロックチェーンといいます。
※ブロックチェーンは、ビットコインの論文に書かれていた機能を一つの技術としてまとめたものです。ブロックチェーンを使ってビットコインが出来たのではなく、ビットコインがあって、それをまとめたものがブロックチェーンです。
ブロックチェーンについて
ブロックチェーンとは、第三者機関を通さずに、二者間で安全な取引を行うために考えられた技術です。
ビットコインを参考にブロックチェーンについて説明していきます。
ブロックチェーンは、取引の記録を複数の人で管理します。それぞれ個別に取引を保管し、管理しています。
取引の記録は、ブロックとして管理されます。一定間隔で取引を元に新しいブロックを作成し、作成したブロックを追加していきます。
ブロックについて
ブロックはブロックヘッダと複数の新しい取引で作られます。ブロックヘッダは”一つ前のブロックの情報“と”取引をまとめた値“と”ブロック作成用の特定の値“で出来ています。
一つ前のブロックの情報は、一つ前のブロックのブロックヘッダをハッシュ関数に入力し、出力された値になります。
※ハッシュ関数とは、値を入力すると別の値を出力する処理です。いろいろな種類があり、ブロックチェーンでは、出力した値で入力した値が判別できないこと。少しでも異なる入力を行うと、まったく異なる出力をすること。などの条件を満たすハッシュ関数が使われています。(SHA-256などが使われています。)
※ハッシュ関数から出力される値をハッシュ値といいます。
取引をまとめた値は、ブロックの中の複数の取引からマークルツリーといわれる手法で算出したマークルルートです。
※取引1つ1つをハッシュ関数に入力し、出力されたハッシュ値をつなぎ合わせて一つの値にします。この手法をマークルツリーといい、マークルツリーの頂点の値をマークルルートといいます。
※取引を横に並べ、それぞれをハッシュ値にします。隣り合うハッシュ値をくっつけて、ハッシュ関数に入力し、ハッシュ値にします。これを頂点に着くまで繰り返して、値を算出します。
マークルルートの値の大きさは、ブロック内の取引の数に関係なく一定の大きさになります。
※ブロックチェーンで使用されているハッシュ関数は、出力の値が一定の大きさです。(SHA-256は256bitです)マークルツリーでもハッシュ関数が使用されるため、マークルルートもハッシュ関数が出力する値の大きさになります。
ブロック作成用の特定の値は、ブロックを作成する時に設けられた条件を満たすための値です。
※ブロック作成用の特定の値は、Nonce(ノンス)と呼ばれています。
ブロック作成の条件は、ブロックヘッダをハッシュ関数に入力した時、出力される値が0を複数個並べた値(0000FFFF)(16進数で64桁の値)より小さい値になることです。並べる0の数は、難易度と呼ばれ、ブロックの作成状況によって変更されます。
※難易度は、ブロックの作成が早い時は0の数を増やし、作成が遅い時は0の数を減らします。
※難易度はターゲットで表され”0x00000000FFFFFFF…”のように上に0が並び以降Fで表現される256bit(16進数64桁)の値です。出力されるハッシュ値がターゲットより小さい値になるとブロック作成の条件を満たすことになります。
ハッシュ関数は、特定の値を出力させる事が出来ません。そのため条件を満たす値を出力させるためには、少しずつ入力する値を変更して、条件を満たす出力が出るまで何度も繰り返します。ブロックヘッダは値を変更することが出来ないので、変更できる値として、ブロック作成用の特定の値(ノンス)を追加します。条件を満たす値が出力されるまでノンスを変更していき、条件を満たす値が出力されると、その時のノンスを正式にブロックヘッダに追加します。
ブロックヘッダの主な役割は、一つ前のブロックの安全を確保することです。
ブロックが改ざんされた時、ブロックヘッダのハッシュ値と次のブロックが持つ”一つ前のブロックの情報”が別の値になり、ブロックが改ざんされても気づくことが出来ます。
誰にも気づかれずにブロックを改ざんするためには、改ざん予定のブロックとその後に出来た全てのブロックを改ざんしなければいけません。
ブロックを改ざんするとハッシュ関数で出力される値が変わり、次のブロックが持つ”一つ前のブロックの情報”と違いが出ます。そのため次のブロックが持つ”一つ前のブロックの情報”を書き換える必要があります。”一つ前のブロックの情報”を書き換えるとまたブロックヘッダのハッシュ値が変わります。この様に1つ改ざんすると次のブロック、また次のブロックと改ざんしていかなければ改ざんが見つかってしまいます。
必要なブロックを全て改ざんしようとしても、ノンスが問題になってきます。
ノンスは、ブロックヘッダのハッシュ値がターゲット以下の値になるよう調整された値です。ブロックヘッダの内容が変わるとハッシュ値も変わるため、ターゲット以下の値では無くなってしまいます。その為ブロックヘッダを変更した場合、再度ノンスの値を見つけ出さなければブロックの改ざんがばれてしまいます。
ノンスの計算は、ランダムに出力されるハッシュ値に対して、値を変更しながら何度も繰り返す必要があります。その為ノンスを見つけるには、時間が掛かってしまいます。
時間が掛かれば、ブロックの改ざんが見つかる可能性が増えていきます。ブロックの後ろにブロックが追加されるたび、改ざんに時間が掛かるようになるので、ブロックの安全性が増していきます。
※ブロックは、新しいブロックが追加されるたび確認が行われます。ブロックの追加は、誰かがノンスを見つけたタイミングです。改ざんを行う人がノンスを見つけるたび、別の誰かが新しいブロックを完成させるので、必要な全てのブロックを改ざんすることは非常に困難です。
※ノンスの計算は、ランダムに出力されるため、一人で行うよりも大勢で行った方が見つける可能性が高いです。改ざんを行う人がノンスを見つけるより、ブロックの作成を行っている大勢の内の誰かが先に見つける可能性の方が高いです。
ブロックの改ざんが見つかったら、別の人が管理している、改ざんされていない取引情報をコピーすれば、元通りになります。
※ビットコインでは、Full Nodes(フルノード)と言われる全ての取引を保管している人に確認を行い、改ざんを修正します。
ブロックヘッダの取引をまとめた値は、ブロック作成の時間を均一にするためと、ブロックが持つ情報量を減らすたm。
ハッシュ関数は、入力する値が大きくなると出力までに時間が掛かるようになります。複数の取引をそのままハッシュ関数に入力すると、取引の数で出力までの時間に差がでてしまいます。取引をまとめた値をブロックヘッダに持つと、取引の数が変わってもハッシュ関数の出力までの時間が変わらなくなります。
取引情報を管理する人は、全ての取引を保存する人と、最低限の必要な情報だけを持つ人に分かれます。最低限の必要な情報は、全てのブロックのブロックヘッダのみです。ブロックヘッダさえ持っていれば、最低限のブロックの管理が出来ます。過去の取引の詳細が必要になれば、全ての取引を保存する人に確認を行います。
※ブロックヘッダに取引をまとめた値を持っているため、複数の取引を保管していなくてもブロックヘッダの情報だけで、ブロックの管理ができます。
ブロックのまとめ
取引の記録は、ブロックで管理されています。
ブロックは、それぞれ一つ前のブロックの安全をチェックしています。
ブロックが改ざんされても次のブロックがチェックを行うため、改ざんに気づけます。
ブロックの作成は、時間が掛かるようになっている為、仮に全部のブロックを改ざんしようとしても、改ざんを見つけるほうが早くなります。
ブロックを新しく追加する方法
ブロックを新しく作成し、取引の記録に追加することを”mining(マイニング)”といいます。
マイニングは、マイニングを行う人々の競争になります。同時に新しいブロックの作成を始め、一番最初にブロックを完成させた人がブロックを追加する権利を得ます。
ブロックは、未確認の取引を元に作成します。未確認の取引の中から取引を選択し、選択した取引を元にブロックの作成を行います。
ブロックの作成は、ノンスの発見で競われます。ブロックヘッダにノンスを追加し、ハッシュ関数に入力します。出力される値がターゲット以下の値になるまでノンスを変更しながら、ブロックヘッダをハッシュ関数に入力します。ターゲット以下の値が出力された時、ノンスが決定しブロックの完成となります。
※ターゲットは、”0x00000000FFFFFFF…”のように上に0が並び以降Fで表現される256bit(16進数で64桁)の値です。これは、指定した桁数の最大値を表し、ターゲット以下の値とは、指定した桁数内の値になります。
ブロックが完成すると他の取引の記録を管理している人に伝えます。伝えられた人は、ブロックの検証を行い、問題がなければ新しいブロックとして取引の記録に追加します。
※取引が正常な取引か、ノンスが正しいかなどをチェックします。
ブロックを完成させた人は、ブロックの作成報酬と取引の手数料を取得できます。
ブロックの作成者は、あらかじめ決められたブロックの作成報酬を得ることが出来ます。それ以外に取引毎に設定されている手数料も取得できます。
※使用する送付情報の合計額から作成した送付情報の合計額を引いた額が手数料になります。使用情報の合計額 – 送付情報の合計額 = 手数料
ブロックを作成する時、複数の取引の先頭に自分の報酬の取引を追加してブロックの作成を行います。ブロックが完成すれば、その取引が報酬になり、ブロックが完成できなければその取引を破棄します。
※報酬の取引をコインベーストランザクションといい、使用情報が使用されず、送付情報のみで作られる取引です。(使用情報自体はあるが、コインベーストランザクションであること示し内容自体は確認されません)
フォークについて
ブロックの作成は、複数の人が同時に行っているため、同時に完成することがあります。
同時にブロックが完成した場合、先に通知されたブロックをメインのブロックとし、後から届いたブロックも念のため追加します。
ブロックが分岐することをforks(フォーク)といいます。
フォークが発生した時は、とりあえず先に届いたブロックの後ろにブロックを作成しようとします。ブロックが完成するか、別の誰かが完成させた時、どちらのブロックの後ろに付くか確認し、ブロックを追加します。
新しいブロックを追加すると、フォークしたブロックに差が出来ます。差が出来た段階でより長いほうのブロックをメインのブロックに切り替え、ブロックの管理を行っていきます。
※ブロックの長さは、ブロックの数ではなく、ブロックの難易度を合計した値で決まります。数で長さを見た場合、難易度の低いブロックを大量にくっつけたほうが長くなります。それだと悪意のある誰かに攻撃される危険があるため、ブロックの数ではなく、作成の難易度で長さを確認します。
メインに成れなかったブロックは、放置されます。
放置されたブロックの中にある取引は、未確認の取引に戻されます。その後、別のブロックの新しい取引として取り込まれます。
※ブロック作成の報酬は、破棄されます。
フォークが発生しすぎると、取引が安定しません。
フォークの発生を抑えるには、ブロック作成の難易度を上げれば良いです。難易度が上がるとブロック作成までに時間が掛かるようになり、同時にブロックが完成する可能性を低くすることが出来ます。ですが、ブロックの作成に時間が掛かると、取引が確認されるまで時間が掛かるようになります。取引の確認が遅くなると、取引の待ちが増えてしまいます。
フォークの発生を抑えつつ、取引の確認までの時間が長くならないように難易度は調整されます。
※ビットコインでは、ブロックの作成間隔を1ブロック10分、2016ブロック2週間を目安に調整されています。
ブロックチェーンのまとめ
ブロックチェーンでは、取引を元にブロックを作成し、取引を記録していきます。
ブロックは、それぞれ一つ前のブロックの安全をチェックしているため、ブロックの改ざんは、非常に困難です。
取引の記録は、複数の人で管理されています。ブロックの作成や作成されたブロックの確認を複数で行うため、一人に依存しないで仮想通貨を運用できます。
複数の人で作成されたブロックの確認を行うため、二重取引や不正な取引を拒否し、正常な取引だけが記録されます。
ブロックに組み込まれた取引は、ブロックの性質上、一度組み込まれると変更できないため、非可逆的な取引を実現しています。
※ただし、追加されたばかりのブロックは、フォークなどで取り消される危険があるため、一定数のブロックが後ろに追加されるまで、取引の安全は確保できません。
ブロックチェーンでは、複数の人が関わっているため、関わっている人の過半数が正常に運用する限り安全な取引を提供できます。
※ただし、過半数の人がブロックチェーンを攻撃した場合、危険にさらされる可能性があります。
ブロックチェーンでは、取引の記録を管理する人が攻撃を行わないように、報酬として仮想通貨が支払われます。自分が得た仮想通貨の価値を守るため、ブロックチェーンは正常に運用されます。
※仮にブロックチェーンの攻撃が成功した場合、仮想通貨の信頼性が下がり、通貨としての価値が下がります。通貨としての価値が下がると、自分が得た仮想通貨の価値が下がり、損をすることになります。
悪意のある人がブロックチェーンを攻撃しようとした場合、大量の資金が必要になります。ブロックチェーンを攻撃するには、取引の記録を管理している人々の過半数と同等のコンピュータが必要になります。大量の資金でコンピュータを揃えても、仮想通貨を攻撃すると仮想通貨の価値が下がります。仮想通貨を攻撃して得られる利益はほぼありません。それよりも揃えたコンピュータでブロックチェーンの運用に参加したほうが、利益を得ることが出来ます。結果ブロックチェーンは、攻撃されるリスクを減らしています。
※膨大な損失を無視して、仮想通貨を破綻させたいと考える人が存在しない限り、仮想通貨は安全です。
まとめ
仮想通貨とは、ブロックチェーンという凄い技術を使って、インターネット上で安全な取引が出来る通貨です。
ブロックチェーンは、関わる人が増えれば増えるだけ安全性が増していきます。人が多く関わる限り安全な取引を提供できます。
コメント