ビットコインの原点であるサトシ・ナカモトの論文「Bitcoin: A Peer-to-Peer Electronic Cash System」を仮想通貨初心者向けに解説していこうと思います。
※個人的な解釈な上、かなり噛み砕いて書いています。気になる点・誤っている点ががあれば是非ご指摘ください。
コンテンツ
はじめに
インターネットでの商取引の問題点
インターネットでの商取引は、ほぼ例外なく、電子取引を処理する信用できる第三者機関としての金融機関に頼っているのが現状である。大多数の取引においてはこのシステムで十分であるものの、信頼に基づくモデルであるがゆえの弱点は残っている。金融機関は争議の仲裁を避けて通ることができないため、完全に非可逆的な取引を扱うことができない。仲裁コストが取引のコストを引き上げることで、取引規模は限定され、小額取引の可能性が失われる。また、非可逆的サービスに対する非可逆的支払いを提供することができないことによる損失はより広範にわたる。可逆的取引を扱うためには信用が問われる。商業主は顧客に対し用心深くあらねばならず、顧客から多くの情報を求める。一定の割合の詐欺は避けられないものとして受け入れられている。対個人におけるこれらの損失や支払いの不確さは有形通貨を使うことで避けられるが、第三者機関を通さずに通信チャンネル経由で支払いを可能にするメカニズムは存在していない。
ネット上での物やお金のやり取りは、信用できる銀行やクレジットカード会社に頼っているのが現状です。銀行振り込みや、クレジットカードを介しての支払いなど、第三者機関(取引する者以外の立場)に頼っている状態です。これは、取引する人が第三者機関を信頼しているから成り立つ形です。
しかし、「信頼に基づくモデル」であるからこその弱点がいくつかあります。
- 完全な送金キャンセルなどができない
- 手数料のせいで、小さい取引の可能性が潰される
こういった弱点は、実際の通貨をその場で支払うことで避けることができます。当時、銀行などの機関を通さずにネット上で支払いが可能なシステムは存在していませんでした。
必要な電子取引システム
必要なのは、信用ではなく暗号化された証明に基づく電子取引システムであり、これにより希望する二者が信用できる第三者機関を介さずに直接取引できるようになる。コンピュータ的に事実上非可逆的な取引は売り手を詐欺から守り、容易に実施できる習慣的なエスクロー(第三者預託)メカニズムにより買い手も守られる。
上にあげたような「第三者機関を通さずにネット上で支払いが可能」なシステムに必要なのは、「暗号化された証明に基づく電子取引システム(=ビットコイン)」です。ビットコインを使えば、第三者機関を通さず、物を売る人・買う人が直接取り引き出来るようになります。
ビットコインは、第三者に頼った送金システムの弱点を克服することができます。エスクロー(第三者預託)なども容易に行えます。
エスクロー(第三者預託)は、メルカリの取引を想像してください。メルカリで物を買うとき、お金をメルカリに払いますよね。そのとき、売り手(出品者)にすぐにお金は払われず、買い手(購入者)が商品を受け取り、評価した時点でお金が払われます。そのため、「売り手がお金だけ受け取って、商品を送らない(送ったと言い張る)」といったことを避けることができます。逆に、商品が届かなかったら、お金は購入者に戻されます。
このように、買い手の保護などを目的として、取引においてお金を第三者に預託するシステムを「エスクロー(第三者預託)」と言います。
二重支払いの解決策
この論文では、時系列取引のコンピュータ的証明を作成するP2P分散型タイムスタンプ・サーバーを用いた、二重支払い問題の解決策を提案する。本システムは、良心的なノードが集合的に、攻撃者グループのノードを上回るCPUパワーをコントロールしている限り安全である。
サトシ・ナカモトの論文では、インターネットでの直接取り引きにつきものの「二重支払い問題」の解決策を提案します。
この論文の中で紹介するシステムを用いれば、たとえ悪者が参加していたとしても、良い人達で集まってみんなで頑張れば、ビットコインは通貨として機能します、といった内容です。
二重支払い問題とは、お金を複数回支払ってしまう問題です。100円しか持っていないのに、AくんとBくんにそれぞれ100円を支払う、ということが、直接の電子取引では割と簡単に実現してしまうのです。
銀行振込では、第三者機関がその数字を監視でき、また、実際の通貨のやりとりであれば、複製が難しいため二重支払い問題は起こりにくいです。しかし、データ上の数値をお金として扱う場合、「受け取ったお金が本当に使えるのか」を検証することが難しいため、二重支払い問題が起きてしまいます。
電子上の直接取り引きにおいて、この「二重支払い問題」の解決が重要な要素となります。
取引
ここから本格的にビットコイン、ブロックチェーンの説明に入ります。
一つの電子コインは、連続するデジタル署名のチェーンと定義される。電子コインの各所有者は、直前の取引のハッシュと次の所有者のパブリック・キー(公開鍵)をデジタル署名でコインの最後に加えることにより、電子コインを次の所有者に転送する。受取人は一連の署名を検証することで、過去の所有権を検証できる。
この論文では電子コインを「連続するデジタル署名のチェーン」と定義しています。つまり、コインは取引履歴そのもの。
ひとまず、電子コインを「テキストデータ」のようなものと考えてください。文字が書かれたファイルですね。そして、コインを誰かに送るときは、送りたい相手の名前をそのテキストの最後に書きます。つまり、コインを受け取ったとき、最後の行に自分の名前が書かれているわけですね。
つまり、そのテキストファイルには「歴代のコインの所有者の名前」が連なっていることになります。これを、「連続するデジタル署名のチェーン」と定義しているわけです。署名が連続しているため、その署名を見れば、コインの今までの所有権がわかります。
コインの使用履歴そのものを、コインとして定義しています。つまり、コインを送る作業=コインに署名(使用履歴に送金の痕跡を残すこと)、と解釈できますね。
この「テキストデータ」がコインとして使われるわけです。より具体的には、電子コインには名前ではなく、以下の2つが署名されます。
- 直前の取引のハッシュ
- 次の所有者のパブリックキー
ハッシュは後ほど詳しく解説します。簡単には、送金の情報(日付や時刻、送金先など)をひとまとめにした目印のようなものですね。
パブリックキー(公開鍵)とは、ここではウォレットのデータ上における住所です。銀行で言えば口座番号のようなものと考えてください。つまり、コイン(=連続するデジタル署名のチェーン)には、口座番号である公開鍵が羅列されていくイメージですね。
ちなみに、「署名」にはパブリックキー(公開鍵)と結びつくプライベートキー(秘密鍵)が必要です。公開鍵を口座番号とすると、秘密鍵はその人しか知り得ない暗証番号のようなものです。
論文中の実際の図がこちら。まだわからなくてかまいません。
無論、問題は受取人には過去の所有者がコインを二重使用していないことを検証できないことにある。一般的な解決法は信用のおける中央機関もしくは造幣局を間に入れ、全取引を監視させることである。取引の度にコインは造幣局に戻され、新しいコインが発行され、造幣局から新しく発行されたこのコインのみが二重使用されていないものとして信用される。この解決法の問題は、全取引が造幣局を通じて行われるため、銀行と同様に造幣局を運営している企業に、金融システム全ての運命が左右されることである。
ここでは、先程の電子コインをそのまま使用したとしても、依然として「二重支払い」の問題は起きると言っています。
造幣局の例を出しています。二重支払いの一般的な解決策として、銀行や造幣局に全部監視してもらう、といったものがありますが、それではその企業が倒産した場合、危ないよね、と言っています。※これを「造幣局モデル」と呼んでいます。
必要なのは、コインの受取人に今までの所有者らが二重署名していないことを知らせる方法である。この目的においては、最初の取引だけが論点であるので、後の二重支払いの試みについては関係のないものとする。取引がなかったことを明確にするには全取引を監視する必要がある。造幣局モデルでは造幣局が全取引を監視し取引の順番を決定していた。これを第三者機関なしに行うには、取引が公開され、参加者たちが受け取った順番の唯一の取引履歴に合意することのできるシステムが必要となる。受取人は取引毎に、取引が行われた時点で大多数のノードがそのコインが初めて使用されたことに賛同したという証明を必要とする。
AさんがBさんにコインを送るとき、Bさんは「最後にAさんの署名がされたコイン」を受け取ります。しかしBさんにとっては、「Aさんが他にも同じコインに署名してないか」を確かめる方法が無いですよね。
電子コインは実際の物体ではなくデータなので、使用済みの電子コインを複製して、Aさんが署名する(=二重署名)ことが起こりえます。
このような「コインが二重署名されていないこと」を確かめる方法が必要だと言っています。実際には、「コインが署名された順番」を確かめるのですが、先程の造幣局モデルでは、造幣局が全部の取引を開始して順番を決定していました。
これを第三者機関無しに行う方法として、「取引が公開され、参加者たちが受け取った順番の唯一の取引履歴に合意することのできるシステム」が挙げられています。ざっくり言えば多数決ですね。コインを受け取ったとき、「これは二重署名されていないと、多数決で証明されました!」とわかるシステムが必要、と言っています。
タイムスタンプ・サーバー
提案する解決法は、まずタイムスタンプ・サーバーから始まる。タイムスタンプ・サーバーは、タイムスタンプされる複数アイテムを含むデータブロックをハッシュとして処理し、そのハッシュを新聞やUsenetポストのように広範囲に公開する。
タイムスタンプとは、日付や時刻を刻印できる機能のようなものです。これは、第三者の証明があれば簡単に実装できます。「この書類は◯時◯分に作成されたものです」と第三者が証明すればいいわけですから。この「時間」が、「取引の順番」を決定するのに重要な要素となります。
第三者機関に頼らずに、取引の順番を決定するためには、時間をどのように証明すれば良いのでしょうか。
複数の物をダンボールに入れて、そのダンボールに「衣類」「書類」といったラベルをつけますよね。このように、データをひとまとめにして、そこに通し番号を付けたものを「ハッシュ」と呼びます。ひとまとめにすることを「ハッシュ化」と呼びます。
タイムスタンプにより、そのデータがタイムスタンプされた時点でハッシュとなるために存在していたことが証明される。各タイムスタンプはそのハッシュの中に直前のタイムスタンプを含んでいくことでチェーンを形成し、タイムスタンプが増えるたびに以前のタイムスタンプを強化していく。
ハッシュ化(ひとまとめに)してタイムスタンプすることで、そのハッシュ(ダンボール)の中のデータがその時刻に存在していたことがわかります。
これから、ブロックの順番を決定付けるための、タイムスタンプの方法について紐解いていきます。
プルーフオブワーク
P2Pベースで分散型サーバーを実行するには、新聞やUsenetポストというよりはアダム・バックのハッシュキャッシュに似た、プルーフ・オブ・ワークシステムを使用する必要がある。プルーフ・オブ・ワークには、例えばSHA-256のような、ハッシュ化された時に0ビットの番号で始まるハッシュ値のスキャンが含まれる。通常作業に要求されるのは、必要な0ビットの番号の指数関数であり、これはハッシュ一つを実行することで検証される。我々のタイムスタンプネットワークでは、ハッシュ化の際に要求される0ビットを与える値が見つかるまでの間、データブロックにワンタイムパスワードを足すことでプルーフ・オブ・ワークを実現している。一度プルーフ・オブ・ワークを満たすべくCPUパワーが費やされると、この作業をやり直さない限りそのデータブロックを変更することはできない。その後のデータブロックもチェーン化されて後に連なるため、該当ブロックを書き換えようとするならば、それ以降の全てのブロックを書き換えなくてはならない。
ついにブロックチェーンの根幹とも呼べる「プルーフ・オブ・ワーク(PoW)」が出てきました。プルーフ・オブ・ワークは、以下の2つの作業から成り立ちます。
- ブロックの生成
- ブロックの承認、追加
ブロックチェーンについて、今の段階では「電子コインの取引履歴が書かれているながーーーい紙」「みんなの取引履歴が書かれたどでかい通帳」のようなものと解釈しておいてください。実際には紙同士がチェーンでつながっていて、そのつながっている紙はブロックと呼ばれます。
ハッシュについて
プルーフ・オブ・ワークについて理解するためには、ハッシュ化についてもう少し詳しく理解する必要があります。
ハッシュ化とは、あるデータを暗号化(ごちゃまぜ)して、ある文字列にすることを指します。ハッシュ関数とは、そこに通せば暗号化できるゲートのようなものと考えてください。
実際に見てみましょう。論文の中で述べられている、SHA-256というハッシュ関数を使用してみます。
データ | ハッシュ値 |
snsdays | AAF0CF23C2782B…… |
snsday | 58FE845D8701D1…… |
snsdaysというデータを、SHA-256というハッシュ関数に通すと、AAF0CF23C……というハッシュ値が得られました。少しでもデータを変えると、ハッシュ値も全く違ったものになりますね。同じデータに対して、毎回同じハッシュ値が返ってきます。
ハッシュ化において大事なのは、「データをハッシュ値へ変えるのは簡単だが、ハッシュ値からデータを導くのは困難」ということですね。つまり、ハッシュ値から元のデータを推測できない点が重要です。
何故ハッシュ値からデータを逆算できないのか。
例えば、6を分解すると2×3ですね。簡単にわかります。しかし、大きな素数×大きな素数となると、分解(逆算)が途端に難しくなります。かなりざっくりとした説明になりますが、こういった「逆算が困難」なシステムはいくつか存在します。
ブロックの生成
プルーフオブワーク(PoW)の前半の作業として、ブロックの生成があります。
この論文では、電子コインを「連続するデジタル署名のチェーン」と定義していました。そして、ここでは便宜的に、以下の3つを組み合わせたものを「ブロック」と呼ぶことにしましょう。このブロックを次々につなげていって、「ブロックチェーン」と呼ばれる取引履歴の塊を作っていきます。
- 前ブロックのハッシュ値
- ナンス(後述)
- 取引データ
それでは、ブロック生成の過程を実際に見てみましょう。
前ブロックのハッシュ値 | 056E5C8F25B0A…… |
取引データ | A send B 100BTC |
これをハッシュ化してみます。すると……
- DB2E30E34F96F42B5EA9F168D2C81953D27A5D6FAF150F1A6B8F5FFF2D808B54
このようなハッシュ値が得られました。実は、ブロックとして認められるには以下のような条件があります。
「ハッシュ値の前半に0が10個以上並ぶこと」
つまり、ハッシュ化したとき、そのハッシュ値が「0000000000AJSVNKJV……」のような値になっていなければなりません。
そして、ハッシュ値がそうなるように、ブロックチェーンではハッシュ化する際に「ナンス」と呼ばれる値をデータに付け足します。
前ブロックのハッシュ値 | 056E5C8F25B0A9B8…… |
取引データ | A send B 100BTC |
ナンス | 1234 |
具体的には、このようにデータにナンスを付け足し、これをハッシュ化してみます。するとハッシュ値は……
- 000034F96F42B5EA9F168D2C8195……
ゼロが4個並びましたね!この要領で、ナンスを書き換えていきましょう!(データは同一です)
ナンス | ハッシュ値 |
1234 | 000034F96F42B5EA9F168D2C895…… |
2987 | 00000006F42B5EA9F168D2C8195…… |
6701 | 000000000034F96F42B5E2C8195…… |
ナンスを6701にしてハッシュ化してみると、ハッシュ値にゼロが10個以上並びました!「ブロックチェーンに追加できるブロックのルール」に当てはまりますね!(※例です。ハッシュ値も適当に書いています。実際にはこんな簡単にゼロの並ぶナンスを見つけることはできません)
「ハッシュ値の前半に0が10個以上並ぶこと」
データに6701というナンスを付けてハッシュ化してみると、ハッシュ値の前半にゼロが10個以上並びました。つまり、6701が「正しいナンス」と呼べます。
ハッシュ値からデータを逆算できないことは前述しました。つまり、ナンスを見つけるには、総当たり的に計算するしかないわけです。具体的にはデータに様々なナンスを付け加えてみて、ハッシュ値を出す、という作業を繰り返しています。
ブロックチェーンを支えるハッシュ化について復習しておきましょう。
- データをハッシュ化したものがハッシュ値
- 同じデータなら同じハッシュ値
- ハッシュ値からデータを逆算することは困難
- 実際にはデータにナンスを加えている
実際には、P2Pネットワークと呼ばれるネットワーク上で、色んな人がパソコンを使ってこの総当り計算をします。ずばり、このナンスを見つける作業が「マイニング」であり、「ブロックの生成作業」であると言えます。
プルーフ・オブ・ワークは、2つの作業から成り立っていました。
- ブロックの生成
- ブロックの承認
次は、生成されたブロックの承認作業にうつります。
実際には、ブロックの条件とされるハッシュ値は「ゼロが10個以上」ではなく、ターゲットと呼ばれる小さい数値以下とされています。ターゲットが小さければマイニング(ナンスを見つける作業)が難しくなり、ターゲットが大きければ簡単になります。ビットコインでは、ターゲットは「平均10分で解ける」ように設定されています。
ブロックの承認
このプルーフ・オブ・ワークはまた、多数決で意思決定をする際の代表をどうするかという問題を解決する。もし1IPアドレスにつき一票としたならば、多くのIPアドレスを取得できる者は誰でもシステムを乗っ取ることができてしまう。プルーフ・オブ・ワークは原則的に1CPUにつき一票である。多数決の意思決定は、最も多くのプルーフ・オブ・ワークの労力が費やされたことを示す最も長いチェーンによって表される。CPUパワーの過半数が良心的なノードによってコントロールされるとき、その良心的なチェーンは他のどのチェーンよりも早く成長する。過去のデータブロックを書き換えるためには、攻撃者はそのブロックのプルーフ・オブ・ワークだけでなくその後に続くプルーフ・オブ・ワークを書き換え、さらに良心的なチェーンに追いつき、追い越さなければならない。低速の攻撃者が良心的チェーンに追いつく可能性は、後続のブロックが追加されるごとに指数関数的に減少していくことをのちに説明する。加速するハードウェアスピードと長期的に変動する利益レートに対応するために、プルーフ・オブ・ワーク算出の難易度は、一時間ごとのブロック数を一定の平均値に保つことを目指す平均移動によって決定される。ブロック算出のスピードが速ければ速いほど難易度が増す。
プルーフオブワークの後半、「ブロックの承認」についての記述です。
マイニングによって、無事ナンスを見つけられ、生成されたブロック。そのブロックをブロックチェーンに追加する前に、「そのブロックが正しいかどうか」を判断する「ブロックの承認」という作業が必要になります。
結論から言うと、その承認作業は多数決でやりましょうと言っています。その多数決の票をどうするか。
かなり噛み砕いて話すと、「1つのメールアドレスにつき1票、という制度だと、メールアドレスをたくさん持っている人が有利だからやめよう。1つのスマホにつき1票にしよう」と言っています。
実際には、メールアドレスではなくIPアドレス、スマホではなくCPUです。
こうして、スマホで多数決をとり、過半数により承認されたブロックはブロックチェーンへと追加されていきます。過半数(半分を超える数)の人が善良な人なら、不正は起こりにくいよね、といっています。
簡単な理解のためここでは触れませんが、実際にはこの承認作業が不正防止や、51%攻撃・CPUの話につながっていきます。
ネットワーク
ネットワーク実行の手順は以下の通りである
- 新しい取引は全ノードに送信される。
- 各ノードが新しい取引をブロックに取り入れる。
- 各ノードがそのブロックへのプルーフ・オブ・ワークを算出する。
- プルーフ・オブ・ワークを見つけ次第、各ノードはそれを全ノードに告知する。
- ノードは、ブロックに含まれる全ての取引が有効であり、以前に使われていない場合のみ、それを承認する。
- ノードは、承認されたブロックのハッシュを直前のハッシュとして用いて、チェーンの次のブロックの作成を開始することで、ブロック承認を表明する。
P2Pネットワーク
ノードという言葉が出てきました。ここで、軽くP2Pネットワークの説明をしておきましょう。
現在、あなたがアクセスしている当サイト(SNSデイズ)があります。これは、あなたのパソコン(スマホ)が、SNSデイズが置かれているサーバーにアクセスしています。他の人も、個々のデバイスでSNSデイズのサーバーにアクセスしています。
いつ人が来てもいいように、SNSデイズのサーバーは24時間、稼働しています。※サーバーは、ここではウェブサービスを動かすパソコンのようなものと考えてください。
つまり、中心にあるサーバーに対して、個々のデバイス(クライアント)がアクセスしている形ですね。クライアントサーバモデルと言います。
例えばGmailを利用するときは、Gmailのサーバーに、ユーザーがアクセスする形になります。でも、AさんがBさんにメールをするとき、Gmailのサーバーを介して送信されます。
ここで、「Gmailのサーバーいらなくない?AさんとBさんのパソコンを直接繋いじゃおうよ!」といって、本来クライアント同士のパソコンをつないでデータのやり取りをする場が誕生しました。これがP2Pネットワークです。SkypeやLINEにもその技術が使われています。
ノード
ビットコインのP2Pネットワークに参加しているコンピュータをノードと呼びます。
ノードは常に最長のチェーンを正しいものと判断し、それをさらに延長しようとする。もし二つのノードが同時に異なる二パターンのブロックを次のブロックとして告知した場合、ノードによって受信の順番が入れ替わる可能性がある。その場合、ノードは最初に受信した方のブロックを処理するが、もう一つのブロックも保存しそちらのチェーンが長くなった場合に備えておく。次のプルーフ・オブ・ワークが発見され、どちらかのチェーンが伸びたとき、そちらが正しいチェーンと認識され、もう一つのチェーンに取り組んでいたノードはより長いチェーンに切り替える。
ブロックチェーンのルールが出てきました。ブロックチェーンにブロックを追加していく作業において、たまにブロックが分岐したり、入れ替わったりする場合があります。そういった場合でも、1つのルールに従うことで解決されます。
「分岐点から最長のチェーンを正しいものとする」
これにより、分岐点から伸び始めた2つのチェーンの長さを比べることで、どちらが正しいかを判断することができます。
新しい取引の告知は必ずしも全ノードに届かなくともよい。告知が多数のノードに受信されている限り、やがてブロックに組み込まれる。ブロック告知もまたメッセージの欠落に耐えうる。ノードがブロックを受信しなかった場合、次のブロックを受信するときにそれを要求し、一つ受信していなかったことを認識する。
P2Pネットワークである、ビットコインネットワークでは、参加しているノード全てに情報が届かなくても大丈夫、と言っています。これは、第三者機関に頼っている状態では、当該機関が破壊されれば全てが終わるが、ビットコインネットワークでは、1つのノードが破壊されたとしてもうまく機能することを示唆しています。
インセンティブ
慣例により、ブロック内の最初の取引は新しいコインを始める特別な取引とされ、そのコインはブロック作成者のものとなる。これはノードにネットワークを支持するインセンティブとなると同時に、コインを発行する中央機関不在の中、最初にコインを配布する方法としても機能する。新しいコインを一定量安定して追加していくことは、金鉱労働者が働いて採金し、金の流通量を増やすことと似ている。
基本的にマイニング等のインセンティブの話ですね。
マイニングした結果、無事ブロックを生成できた人には、報酬としてコインが支払われます。このように、ビットコインネットワークに参加するインセンティブがありますよね、と言っています。
また、中央銀行がお金を刷ってくれるわけではありません。報酬としてコインを一定量支払うことで、市場に安定してコインを供給していくことができますね。
インフレ
我々の場合は、働いてるのはCPU時間と電力である。インセンティブは、取引手数料によっても得ることができる。もしある取引でアウトプットされた価値がインプットされた価値よりも少ない場合、その差は取引手数料としてその取引を含むブロックのインセンティブに加算される。ひとたびコインの流通量が既定の数値に達するとインセンティブを取引手数料として使うことが可能になり、またコインは既定以上流通されないのでインフレからは完全に解放される。
コインの流通量は決まっています。2100万コインです。
報酬として新規コインが発行されなくなったとしても、取引手数料を報酬として支払うことができます、なので、ネットワークに参加する動機は残り続けます。また、一定量以上コインは流通しないため、インフレから解放されます。
リンゴが1個100円で売られていたとします。みんなが「200円出す!」と言えば、リンゴは200円になります。このように、市場の物価が上昇することをインフレと言います。
インフレの原因は、基本的に「お金の価値の下落」です。どんなときにお金の価値が下落するのか。それは、「お金の流通量が増えたとき」です。お金の流通量が増えるとインフレが起こる。ビットコインだとそれを避けることができるよ、と言っています。
ちなみにお金の流通量が増えるのは、簡単にお金が手に入りやすくなる、以下のような場合です。
- 減税
- 公共事業の増加
- 社会保障の増加
- 所得再分配の増加
利己的なノード
インセンティブはノードが良心的であり続ける動機となりうるだろう。もし欲深い攻撃者が良心的なノードの合計を上回るCPUパワーを作り出すことができたとして、攻撃者はそのパワーを使って、他の良心的なノードから自分の支払った金額を盗んで取り戻すか、新しいコインを作り出すかの選択を迫られることになり、おのずと自分の資産価値とそれを支えるシステムを損なうよりも、ルールに従って行動し、他の全ノードを合わせたよりも多くの新しいコインを作りだすほうが、自分の利益になると考えるだろう。
ビットコインネットワークの巧妙な仕組みに言及しています。インセンティブはノードが良心的であり続ける動機となりうるだろう。
これは、「ビットコインネットワークでは、良心的に行動したほうがお金を稼げる」と解釈して大丈夫です。各自が利己的な選択を行ってもうまく回るシステム、素晴らしいですね。
ビットコインネットワークの信頼が揺らぐようなことをして、ビットコインを手に入れたとしても、その行為のせいでビットコインの価値が下がります。なので、「利己的であれば、良心的に行動することになる」というわけですね。
ディスク・スペースをリクレイムする
コインの最新の取引が十分な数のブロックに書き込まれると、それ以前の取引記録はディスク・スペースを節約するために破棄することができる。ブロックのハッシュを壊さずにこの作業を行うために、取引はそのブロックのハッシュにルートしか含まないマークル・ツリーを用いてハッシュ化される。古いブロックは、ツリーのブランチを取り除くことで軽くすることができる。インテリア・ハッシュを保存する必要はない。
ブロックチェーンでいうブロックが取引データの塊、チェーンがブロックのハッシュ値です。
ここでは、ハッシュ値であるチェーンの部分さえ残っていればOKです。「データの容量は問題ないよ」という話です。このような保管方法をとっても、構造上、大本のデータを書き換えることはほぼ不可能です。
マークルツリーとは、ツリー構造のデータを格納する場所です。
どのようなデータを入れても、大きさの決まっているハッシュ値が返ってくることから、何個のデータを入れようが、ハッシュ値の容量は変わらない、という理屈です。
マークル・ツリーを用いてハッシュ化された取引ブロックからTx0-2を取り除いた後引なしのブロック・ヘッダーは約80 bytesである。仮に十分ごとに一つのブロックが作成されると仮定すると、80 bytes × 6 ×24 ×365 = 4.2 MB/年 となる。2008年の時点で平均的なパソコンは2 GBのRAMで売られており、ムーアの法則によると1.2 GB/年のペースで増大すると予測されるので、ブロック・ヘッダーをメモリに保存しておく必要があってもスペースの問題はないはずである。
こちらも容量の話。ブロックのチェーン部分だけを保存する場合、そのデータはどんどん膨らんでいきます。しかし、データの入れ物技術はそれよりももっと早く成長するため問題ありません。
簡易版支払い検証
完全なネットワークノードを実行していなくとも、支払いを検証することは可能である。ユーザーは、ネットワークノードにクエリーを行って得られる最長のチェーンが含む各ブロックのブロック・ヘッダーのコピーを保存しておくだけで、そのブロックにタイムスタンプされている取引をブロックにリンクしているマークル・ブランチを得ることができるからだ。ユーザー自身が自らその取引をチェックすることはできないが、そのマークル・ブランチをチェーンにリンクすることで、ネットワークがその取引を承認済みということが確認でき、またその後にブロックが加えられていったことでさらなる確証が得られる。
ネットワークに参加している全てのPCが、ブロックチェーンの全てを保存しておく必要はありません。
マイニングやブロックの承認に必要な部分だけ、持っている人から取り寄せて、使用することができます。
このように、良心的なノードがネットワークをコントロールする限り検証は信頼のおけるものとなるが、ネットワークが攻撃者に乗っ取られた場合には脆弱になる。ネットワークは自身で取引を検証できる一方で、各ノードが行う簡易版は、攻撃者がネットワークを乗っ取り続ける限り攻撃者の偽造した取引にだまされてしまう。一つの対処法は、ネットワークが不正なブロックを感知したときに発するアラートを受信する設定にしておき、受信した場合はユーザーのソフトウェアによりブロック全体とアラートされた取引をダウンロードし、不一致を確認することである。頻繁に支払いを受け取るビジネスに関しては、より独立した安全性とスピードの速い検証のために、独自のノードを運営するほうが良いだろう。
ネットワークが乗っ取られた場合。ビットコインネットワークは良心的なノードが過半数存在することを前提としていますので、乗っ取られた場合には脆弱になります。しかし、そのための対処法として、アラートの設定等を提案しています。これだと安心ですね。
価値の結合や分割
一つ一つのコインを個別に扱うことも可能な一方で、取引に使われる金額を1セントずつ個別に取引することは非常に不便だ。価値の分割や結合を可能にするために、取引には複数のインプットとアウトプットが含まれる。通常、インプットはより価値の大きい前の取引からの一つのインプットか小額のものをいくつか合わせた複数のインプットで、アウトプットは多くても二つ、次の支払いに向かうものが一つと、おつりがあればそれを支払い元に戻すものが一つである。
コインの単位についての言及です。
コイン=取引履歴そのもの、でしたね。その場合、1コインに対して取引履歴を追加することは問題ありません。しかし、100コインを送信するとなると、100枚のコインにその取引履歴を追加しなければなりません。また、1コイン未満の取引も想定すべきでしょう。
したがって、コインは複数同時に扱ったり、1コイン未満の単位でやり取りできるように設定されています。これが「価値の結合・分割」ですね。
注目すべきは、一つの取引が複数の取引に依存し、それらの取引もまた多数の取引に依存しているファンアウトはここでは問題でないことである。取引履歴からある取引の完全に独立したコピーを抽出する必要性はあり得ないからである。
プライバシー
従来の銀行モデルは、情報へのアクセスを関連団体と信頼のおける第三者機関に限定することで一定レベルのプライバシーを実現している。全取引を公開する必要性はこの可能性を除外するが、情報のフローを他の箇所で分断することでプライバシーを保つことができる。パブリック・キーを匿名にするのである。誰かが他者にどれだけのコインを送っているかは公開されるが、その取引情報は誰にもリンクされていない。これは個別の取引の時間やサイズ、「テープ」は公開されても取引の当事者は明らかにされない証券取引で公表されるのと同等の情報レベルである。
ビットコインの匿名性について言及しています。
本来の銀行モデルでは、口座残高・氏名・住所などを登録しますが、その銀行や関係機関のみが、その情報にアクセスできる、という部分でプライバシーが保たれていました。
しかし、ブロックチェーンで全ての取引を公開しているビットコインネットワークの場合、銀行モデルのようなプライバシー保護の形をとることができません。
そこで、自分のコインにアクセスするための公開鍵を匿名にすることにしました。
表現は悪いかもしれませんが、自分のビットコインを保有する場所をウォレットと呼びましょう。そのウォレットの場所が公開鍵、そこにアクセスするための鍵が秘密鍵という解釈で問題ありません。ウォレットの場所と、所有者の情報が結びつかないように配慮しています。
追加のファイアウォールとして、同一の所有者にリンクされることを防止するために、取引は一回ごとに新しいペアのキーを用いる必要がある。複数インプットの場合はそれらのインプットが同じ所有者に所有されていることがどうしても露見するので、多少のリンクを避けることはできない。リスクは、もしキーの所有者が明らかになった場合、そのリンクにより同じ所有者が関わった他の取引も露見する可能性があることである。
キーの所有者が明らかになった場合、その人が過去に行ったやりとりも露見してしまいます。例えば、コインチェックのアドレスなどは、Twitterで話題になりましたよね。
※11章「計算」以降は、数学的な話となりますので割愛させていただきます。
編集後記
- 日本語で読むビットコイン原論文 [by Satoshi Nakamoto] − Coincheck Blog
- Bitcoin: A Peer-to-Peer Electronic Cash System
今回は、サトシ・ナカモト氏の書いたビットコインの原論文を解説しました。ビットコインのホワイトペーパーとも言われるこの論文。サトシ・ナカモト氏の不思議な存在も相まって、神秘的な存在ですよね。
次回は他の仮想通貨に関しても、ビットコインとの違いと共に解説していきます!