Proof-of-Work

暗号通貨で使用されているコンセンサスアルゴリズム "Proof-of-Work"(PoW)の基礎となるアイデアと構造は、1974年、Merkle's Puzzles の初期形式で見ることができる。Merkle は公開鍵暗号を実装することを提案した。Bitcoin ではマイニングとコンセンサスに達するための双方に初めて PoW を使用している。

マイニングと PoW

PoW は暗号通貨システムないで作成されるブロックの検証に使われているため、まずはブロックを作成する工程であるマイニングの仕組みについてまとめる。コンセンサスアルゴリズムに PoW を使用している暗号通貨において新たにブロックを作成することを一般的にマイニングという。(他のアルゴリズムを使用する際は、呼称が異なることもある)暗号通貨システムにおける取引情報のことをトランザクションと呼び、これをネットワーク参加者(以下:ノード)と共有している。しかし、トランザクションごとにブロックが作成されるわけではない。新たなトランザクションを受け取った各ノードは、一旦それらを保管するために自前のトランザクションプールにいれておく。システムによってあらかじめ決まった時間(Bitcoin の場合は10分、Ethereum の場合は15秒)が経過すると、自分のプールにいれてあるトランザクションを取り出し、ブロックという単位のデータ構造にする(ためておいたトランザクションをダンボールに入れるイメージ)。

ブロックの構造

ブロックは上図のような構造をしており、ヘッダーとボディに別れている。ヘッダーにはそのブロックに関する情報が入っており、ボディにはトランザクションが入っている。さて、ブロックを作成するには1つ課題がある。それは、ヘッダーに含まれるナンス値(nonce:ノンスとも言う)を探すことである。ナンスとはその時1回限り使用する使い捨てのランダム値であり、ナンス値にはある条件がある。それは、ブロックのヘッダー値をハッシュ化した時に事前に決められた値(target:ヘッダーにある Difficultuy 値から計算)よりも小さくなるようにすることである。つまり、以下のような式

\begin{align} hash(header + nonce) < target \end{align}

を満たすようなナンス値を見つければ良いわけである。ブロックを作成する中で、このナンス値を見つける過程をとくにマイニングと言う。

PoW の利点

PoW は正しいナンス値を見つけるためにハッシュ計算を何度も行う必要があるということである(詳しくはフォークについての記事も参照←まだ書いてない)。Bitcoin の場合は全ノードが計算しても約10分かかってやっとナンス値が見つかる程度の難しさである。ひと昔前は、自分の PC でマイニングを行いお小遣いを稼げる!みたいな話があったが、Bitcoin ではマイニングの難易度は2週間に一度、参加している全ノードの計算力に応じて動的に調整されている。そのため、参加者も増えコンピュータ技術が向上した現在は、個人レベルのコンピュータでは到底太刀打ちできないので個人単位でマイニングに参加するにはハードルが高すぎる。しかし、これは攻撃者にも同じことが言える。攻撃者が自分らでマイニングを独占しようとすると全世界の過半数を超えるような計算力を持つコンピュータを集める必要がある(実際には過半数なくても良い、その話はまたの機会に)。何れにしても、ブロックを作成するには計算力が必要であり簡単に作成できないことが重要である。

PoW の欠点

PoW の欠点も計算力が必要なところにある。Bitcoin などの参加者の多い暗号通貨ではナンス値を見つける難易度がとても高い。そんなナンス値を見つけるために毎日計算を行なっていると、消費電力が非常に大きい。Bitcoin のハッシュ計算において1日に消費されている電力は約 73TWh であり、これはスイスの消費電力よりも大きい。 エコの観点からもこの消費電力量は好ましくないため、最近では PoW を使用しない(あるいは一部のみ)使用する暗号通貨が誕生している。