ブロックチェーンについて再考する(1)

前書き

 大分とざっくりしたタイトルなのですが、この2018年末年始にやりたい事が2つありました。

  1. ブロックチェーンについて再考する
  2. スマートコントラクトについて再考する

 なんとも基本的なところなのですが、最近仕事で「本当にブロックチェーンいるの?」とか「スマートコントラクトって言うけど…」みたいな話がよく出てくる様になり、一度自分なりに納得しておきたいなと思ったためです。

 先ずは第一弾として、ブロックチェーンについて再考してみたいと思います。なお、対象の読者としては、何となくブロックチェーンやサーバー、ノードといったものががどういったものかは把握されている程度の方を想定しています。全くブロックチェーンの事が分からない、あるいはシステムの事はあまり分からない、といった方にはやや難しい部分があるかもしれない事をお断りしておきたいと思います。

基本的なやり方

 再考するにあたって、どういった方針で進めるのかという事ですが、以下を考えました。

  1. 基本に立ち戻って実装の基になった論文を読む
  2. 「ブロックチェーン」と呼ばれているものがどうやって成り立っているのかを考える

基本に立ち戻って論文を読む

 そもそもこの界隈が盛り上がる前に、何らかの思想や技術を提唱した人達がいます。ビットコインで言えば Satoshi Nakamoto であったり、スマートコントラクトであれば Nick Szabo であったり、彼らが何を言っていて、何を実現したかったのかを理解せずにブロックチェーンやスマートコントラクトを語る事はできないと考えました。

 という事で、以下の論文を読んで考えてみたいと思います。

「ブロックチェーン」と呼ばれているものがどうやって成り立っているのかを考える

 そもそもビットコインの論文にすら「ブロックチェーン」という言葉は登場しませんし、「ブロックチェーン」と一言に言っても、世の中にそれっぽいものは多く存在します。代表的なものとしては Bitcoin、XRP Ledger、Ethereum、Hyperledger Fabric などなど。今、「それ本当にブロックチェーンなの?」って思いましたね?(笑)ブロックチェーンと一言で言ってしまうと「本当のブロックチェーンとは何なのか」みたいな話になるので、ここでは「いわゆるブロックチェーンと呼ばれているもの」がそれぞれどういった特徴を持っていて、それぞれにどういう価値があって、そもそも何がしたかったのか、といった様な事を掘り下げて考えたいと思っています。

ビットコインが実現したかった事とそのための技術

 そもそもビットコインが何を実現したかったのかという事ですが、結論としては「特定の第三者に信頼を置く事なく、当事者同士(送る者、受け取る者)が支払いを行える事」だと考えています。それを実現するために技術要素を組み立てたと考えると、私の中ではしっくり来ました。

  • [目的] 特定の第三者に信頼を置かずとも動作できるシステムが必要だった
  • [手段] そのために分散型台帳システムを構築した
  • [技術] ビットコインにおいて分散型台帳システムを実現するための具体的な技術が以下の2つである
    • Public Key Infrastructure(PKI)
    • Proof of Work(PoW)

といった整理です。順を追って記述していきます。

特定の第三者に信頼を置かずとも動作できる分散型台帳システム

 ビットコインの論文によると、インターネット上では信頼された金融機関が間に入る事で電子的な支払いが処理されているが、これにはコストがかかるため支払いの手数料が上がり、少額の支払いには使いづらいといった事が言われています。

Commerce on the Internet has come to rely almost exclusively on financial institutions serving as trusted third parties to process electronic payments.
[…]
Completely non-reversible transactions are not really possible, since financial institutions cannot avoid mediating disputes. The cost of mediation increases transaction costs, limiting the minimum practical transaction size and cutting off the possibility for small casual transactions, and there is a broader cost in the loss of ability to make non-reversible payments for nonreversible services.
[…]
What is needed is an electronic payment system based on cryptographic proof instead of trust, allowing any two willing parties to transact directly with each other without the need for a trusted third party.

 non-reversible な支払いが全てを解決するのか?例えば、

  • 相手の商品の品質に問題があった場合はどうするのか?
  • ビットコインの支払い手数料はそれほど安くできているか?

という疑問はあるものの、とりあえず主張と実現したかったもの自体は分かります。そして、trusted third party を置かないとはどういう事かと言うと、つまり支払いを司るシステムが分散しており、単一の実体に依存していないという事だと思います。

 例えば一般的なシステムであればマスターを用意して書き込みをそちらで受け取ってスレーブで読み出し系統を処理するという様な構成になり、マスターが死ぬと最新の状態に復旧しつつスレーブをマスターに昇格させるといった様な処理が行われます。「1つのマスターが死んでもなんとか動作し続けられる」という意味で分散しているとも言う事ができると思いますが、いずれにしてもそのシステムを動作させる企業なりの実体を信頼しているという意味でビットコインの目指したものとは違うと言えると思います。

 ビットコインの場合、情報を保存するノードは分散しており、また、保存する情報を決める(やや語弊がありそうですが簡単に言っている)ノードも分散しています。どれかが部分的に欠けても動作し、かつそれらのノードは全世界の個人・企業などが分散して運用しており、単一の実体に依存していません。ここで1つ、ビットコインには特定の第三者の存在と運用に信頼を置かなくても動作できる、分散型台帳システムという価値があると考える事ができるのではないかと思います。また、これらのノードは企業や国が運営するものではなく、個人が自由に参加し(もちろん、企業や国が参加してもいい)形成しているという点も、価値の民主化を実現し得るのか?という意味で面白いシステムだなと思います。「理解する事」が目的ですので、ビットコインが成功してるとか失敗してるとかいう議論はここではしません。

 分散型台帳システムそれ自体は何かのアルゴリズム自体を指しているというよりも構造の話なので、実装方法も色々あると思いますしこれこれこういうロジックですと言う事は難しいのですが、いったん「処理やデータの保存の実体が分散しておりどれかが欠けても一貫性を持って正しく動作する事ができるシステム」くらいに捉えておけばよいのではないでしょうか。

Public Key Infrastructure(PKI)

 基本的な考え方が「第三者を信頼せずとも」というところにあるとすると、従来型の認証システム(パスワードを送信する)には抵抗があるというのは理解できます。従来型の認証システムでは、アカウントにパスワードが紐づいており、それを送信する事で個人の認証を行っていますが、それは通信相手が信頼できるからこそです。例えばいくつかのノードからなるシステムでパスワードを平文のまま送るという事は、それを相手ノードが記録しておき、他ノードに使用するかもしれないという危険性が残る事を意味します。仮に相手ノードが信頼に足る相手だったとしても、ハックされている危険性もあります。公開鍵・秘密鍵を利用した電子署名技術を利用する事で、秘密鍵を明かす事なく本人がその取引を承認した事を確認できます(詳しいロジックは省略、電子署名などを参照)。

 ビットコインの場合は誰がどれだけのビットコインを持っているのかという情報、つまり「口座」は、アドレス(公開鍵)で管理されています。そのアドレスのビットコインを別アドレスに移転する際には、以下の情報に対する署名をアドレスの対となる秘密鍵で生成する事で、本人がその移転に同意した事を示します。

  • どのアドレスから
  • どのアドレスに
  • いくら移転するか
  • 手数料をいくらにするか

 本来はもう少し複雑ですが、ほぼこんな感じで考えておいてよいと思います。上記はトランザクションの場合はインプットとアウトプット全て含めて署名していますが、中には送信先には署名しないというオプションもあり得ます。ただ、これは特定の相手を信頼しないという意味では使い方が特殊で難しいので、通常は全てに署名すると思っていてよいのではないでしょうか。

Digital signatures provide part of the solution,

 論文にこの様に「電子署名がビットコインの仕組みの一端を担っている」という記述がある様に、電子署名を利用する事で第三者を信用せずとも正当な取引である事をネットワークに知らせる事ができています。

Proof of Work(PoW)

PoW の仕組み

 分散したシステムにおいては、「どうやってデータの一貫性を実現するのか」という事が問題になります。ユーザーはあるアドレスからあるアドレスへビットコインを移動したい、という取引内容(トランザクション)を自由にビットコインのネットワークに配信します。ビットコインのネットワークは複数の自律的なノードによって成り立っていますので、これを特定のルールに従って「分かりました、ではそれを処理します」とネットワーク全体で合意していかなければ、全体として一貫性のあるデータを作り出す事ができません。

 ビットコインは、これを各自が自律・分散的に処理していたとしても最終的に一貫性のあるデータになる様な仕組み、Proof of Work で解決しています。具体的には、下記の様な流れです。

  1. 何らかしらの支払いを行いたいという命令はトランザクションと呼ばれ、いったんノード上にプールされる
  2. トランザクションをブロックに書き込みたいノードは、プールからいくつかのトランザクションを取り出す
    • このノードの事を、一般的には「マイナー(Miner)」と呼んでいる
    • トランザクションをひとまとめにしたものをブロックと呼んでいる
  3. 取り出したトランザクションを新しいブロックに入れ、nonce(ナンス)と呼ばれる値を設定する
  4. nonce を含んだブロックのハッシュ値が特定のルール(先頭にゼロのビットがいくつか並ぶ)になるまで繰り返す
  5. 特定のルールに沿う nonce を見つけたら、それを正当なブロックとしてネットワークに配信する
  6. 他のノードが正しいブロックを生成したら、その時点で一番長く連なっているブロックを最新の正しいブロックとする
  7. 他のノードはそのブロックをそれ以降のブロックの基(そのブロックのハッシュを次のブロックに含める)として認め、次のブロック生成を試みる

 この様なルール(合意、コンセンサス)に則って各ノードが処理している限り最終的には一貫したデータになるというところが、面白いところです。

二重支払いと PoW

 ビットコインの場合は一貫したデータに「徐々になっていく」という特性があります。場合によっては途中でとあるブロックを基にした2つの正当なブロックが連なる形になったりしながら、最終的にそのどちらかにさらに新しいブロックが積み重なり、それが正当な連なり(チェーン)として認められていくという事です。つまり、ある時点で最長で正しいと思われていたチェーンが、場合によっては最長ではなくなる事も「ない訳ではない」という事です。例えば、下記の様なパターンです。

block-chain

 上図ではノード Aがある時点で新しいブロック ブロック 2を生成し、ノード Bがそれを知る前にたまたま別の新しいブロック ブロック 2'を生成したとします。どちらもビットコイン的には正しいブロックです。この場合、次にブロック 2'を基にした新しいブロック ブロック 3ができたとすると、ブロック 2は最も長いものではなくなり、有効とは見なされなくなります。これを悪用すると二重支払いという問題が発生する事になります。

 二重支払いとは、同じ価値を同時に二人以上に移転(支払い)する事ができてしまうと、当初持っていた以上の価値を生み出してしまう事になるという問題です。例えば、Aさんが100円持っていたとします。Aさんが同時にBさんとCさんに持っていた100円を支払う事ができてしまったとしたら、BさんとCさん合計で200円持っている事になり、元々Aさんが持っていた100円が200円に増えてしまった事になります。実際に物体として存在する硬貨や紙幣は複製する事ができないのでもともとその様な問題は起こりにくい訳ですが、デジタルなシステムの上では100を200にするのは簡単です。これは支払いシステムにとって致命的な問題になりますが、ちょうど1月5日、Ethereum Classicで実際に問題が表面化していた様です。Deep Chain Reorganization Detected on Ethereum Classic (ETC)

 ビットコインの場合、トランザクションは下記の様な形になっています。

transaction

 どこかのトランザクションのアウトプット(どのアドレスへいくら移転したか)を別のトランザクションのインプットとして使い、また別のアウトプットとして移転先を指定するという連鎖になっています。まだどこにも送信されていないトランザクションのアウトプットは Unspent Transaction Output(UTXO)と呼ばれ、そのアドレスに紐づく秘密鍵の署名を添える事でどこかのアドレスに移転可能ですが、同じアウトプットを2度使う事はできません。二重支払いになってしまうからです。ここで、例えば上記のUTXOTx XXXX #0を利用した正当なトランザクションを2つ作ったとします。

  1. UTXOTx XXXX #0を、アドレスAに移転するトランザクション
  2. UTXOTx XXXX #0を、アドレスBに移転するトランザクション

 そしてノードAアドレスAに移転するトランザクションを新しくブロックに格納し、ノードBアドレスBに移転するトランザクションを新しくブロックに格納したとします。それぞれ正しいブロックなので、その時点ではどちらも間違いではありません。ここで、ノードAのブロックを信じてアドレスAの持ち主はビットコインが支払われたと考え、何らかの商品の引き渡しをしてしまったとします。しかし、その後実はノードBのブロックの方が長くなり、アドレスBに移転するトランザクションの方が先に取り込まれてしまったとします。

 ビットコインのネットワークとしては長い方のチェーンを正しいチェーンとするというルールですから、ノードAのブロックは捨てられる事になります。となると、アドレスBの方にビットコインを移転するトランザクションの方が先に取り込まれたブロックが正しいという事になるので、アドレスAに移転するトランザクションは生成した時点では正しいトランザクションではあったものの、すでに別のアドレスに移転したUTXOを利用した二重支払いをするトランザクションという事になってしまい、認められません。

 商品を引き渡してしまった人は困ってしまいますね。この様な事がない様にどれだけブロックが積み上げられたかを確認しておく必要があります。また、この様に仮にブロックに取り込まれたとは言っても必ずしもそれが確定したものではない状態であるという事を、「ファイナリティがない」という表現をします。

 PoWの本質とは何なのだろうと考えた時に、「分散したシステムにおいては分散しながらも何らかの方法でトランザクションを順序づけしなければならず、その権利を得るノードをどうやって選ぶか」という事だと考えると、私の中ではしっくりきました。正しいハッシュを作り出すnonceを見つけたノードが、その権利を持つという事です。しかしPoWの場合はその特性上、正しい権利を得るノードがたまたま同時に複数生まれてしまう可能性があり、それ故ファイナリティがないシステムになっていると考える事ができます。

マイナーの役割とインセンティブ

 分散した支払いシステムではトランザクションを何らかの方法で順序づけてネットワークに取り込まれた事にするという作業が必要不可欠なので、ビットコインのネットワークにおいてもブロックを生成してその中にトランザクションを詰めるという作業が必要不可欠です。

 ブロックを生成するのはいわゆるマイナーの仕事ですが、つまり彼らはネットワークにとって必要不可欠な存在であると言えます。マイナーは正当なブロックを生成する、つまりnonceを計算する計算能力を提供する代わりに、新しいブロックを生成した時に報酬としてビットコインが与えられる事になっています(決められた多寡に加えて、各トランザクションからの手数料も含まれる)。

 一方で、マイナーは必要不可欠であると同時に、その能力を悪用すると意図的に別のチェーンを生み出して二重支払いを起こさせる事ができる存在でもあると捉える事ができます。つまりマイナーとしては、二重支払いをさせるのが得なのか、ブロックを誠実に生成して報酬を得た方が得なのかという選択をする事になります。

The incentive may help encourage nodes to stay honest. If a greedy attacker is able to assemble more CPU power than all the honest nodes, he would have to choose between using it to defraud people by stealing back his payments, or using it to generate new coins. He ought to find it more profitable to play by the rules, such rules that favour him with more new coins than everyone else combined, than to undermine the system and the validity of his own wealth.

 論文では、この様に自分自身の富の正当性を傷つけてまでそんな事はしないだろう、と書かれています。そんな事をすればビットコインのネットワーク自体が使われなくなり、価値が薄れてしまう、という解釈です。

PoWとタイムスタンプ

 論文内での関係が前後してしまいますが、PoW以前に、まず論文ではビットコインがタイムスタンプサーバーという概念をベースに置いている事を説明しています。

The solution we propose begins with a timestamp server. A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post [2-5]. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.

Bitcoin: A Peer-to-Peer Electronic Cash System より引用

 ここで、ハッシュがチェーンするという構造が初めて示されました(次のブロックに前のブロックのハッシュは含まれていないものの)。これがハッシュが連鎖していくいわゆるブロックチェーンの原型となっていると考えられますが、論文ではこの形が持つ意味を2つ定義しています。

  1. その時点でそのデータが存在していた事を証明できる
  2. ハッシュを連鎖させる事で段々と強化されていく

 強化されていくというのが直感的に理解しづらいところですが、昔のデータを書き換えるという事はそれに伴いハッシュが変化し、その先のデータの原本のハッシュを持っていなければその先のハッシュは再生成できないという事になります。その先のデータの原本のハッシュが公開されていなければデータの原本自体を持っていなければそのハッシュは生成できませんから、これはかなり改竄が困難です。また、ハッシュの連なりが公の場に公開されており多数の記録として残った場合、その全てを改竄する事も難しくなります(newspaperという例えがでているのはそういう意味だと理解しています)。

 しかし、結論としては少なくともビットコインのネットワークにおいては、私はこのハッシュが連鎖する構造自体には(少なくともそれだけでは)意味がないと考えています。理由は、以下の2つです。

  1. ビットコインのトランザクションはそもそも原本が世の中に公開されるので存在証明を行う必要がない
  2. 原本が公開されているのでハッシュのチェーンを偽造する事自体は容易である

 順に詳説します。

存在証明の意義

 まず、一般的なタイムスタンプサーバーの方式は以下の様な形です。

  • 誰かが何かしらのデジタルデータ(文章など)を作成する
  • そのデジタルデータのハッシュをタイムスタンプサーバーに送る
  • タイムスタンプサーバーではその時点の日時と送信されたハッシュに電子署名を施す

 この様な形を取ると、タイムスタンプサーバーが信頼できる機関であるという前提で、デジタルデータの原本を公開する事なく「その時点でその文章が存在していた」事を証明する事ができます。

 しかしビットコインの場合は存在証明の対象となるトランザクションの内容はそもそも全世界に公開されますから、その時点でそのデータが存在していた事は明白です。また、正当なトランザクションを作り出す事ができるのはUTXOの秘密鍵を持った人のみですから、そのデータを作成できる本人が価値の移転に同意していたという事は明白です。ですので、存在証明という意味でのこの構造には意味がないと考えています。

データの改竄

 次に、先ほどハッシュが連鎖しているので改竄が困難と書きましたが、それは連なる先のデータのハッシュが公開されておらずマージされたハッシュのみしか公開されていなかった場合の話です。ビットコインのネットワークにおいてはデータの原本(トランザクション)自体が公開されていますから、そこからハッシュを計算していく事は容易です。

 しかし、先ほどPoWの仕組みで書いた様に、ビットコインにおいてはこのブロックのチェーンに特殊なルールが定められており、nonceを含んだハッシュの先頭のいくつかのビットが0でなければならないというルールがあります。何かしらのデータを書き換えると全体のハッシュが変化してしまいますから、先頭に0が並ばなければいけないというルールを満たさなくなります。つまりnonceを変えてハッシュを再計算していく作業が必要になり、これを改竄したデータ以降全てのブロックについて繰り返す事が大変困難なので、改竄が難しいという事です。

 「ハッシュが連なっているから改竄が難しい」のではなく、「全体のハッシュが特定のルールに則っていなければ正しいブロックとは認めず、そのルールに則ったブロックを作り出す事自体が困難」だから改竄が難しいのだと私は考えていて、PoWというルールに則るという前提に立って初めてハッシュが次のブロックに含まれるという構造の意味が出てくるのだと考えています。

自律・分散的なシステム

 ここまで、ビットコインが実現したかった事、そしてそれを実現する具体的な技術を見てきました。

 その中で、その根本が自律・分散的なシステムにあるという事も理解できたと同時に、それを実現する方法はこれだけではないだろうな、という感覚があります。また、「データを改竄する」という行為も様々な要素の上に成り立っており、より深く考察すべきだなという感覚もあります。

 次回以降、これらの事について考えていければなと思います。

参考資料

 ビットコインの論文以外に、参考にさせて頂いた資料です。

comments powered by Disqus