見出し画像

ナカモトサトシ白書解説(5)

以下は2016年12月28日に私が以下のホームページに掲載した記事です。
https://officemoorea.wordpress.com/
最近、web3という文脈でブロックチェーンが注目されていることや、上記ホームページの更新ができていないことから、古い記事ですが、noteに転載します。

■ナカモトサトシ白書解説 ディスクスペースをリクレイムする


コインの最新の取引が十分な数のブロックに書き込まれると、それ以前の取引記録はディスク・スペースを節約するために破棄することができる。ブロックのハッシュを壊さずにこの作業を行うために、取引はそのブロックのハッシュにルートしか含まないマークル・ツリー(Merkle Tree)を用いてハッシュ化される。古いブロックは、ツリーのブランチを取り除くことで軽くすることができる。インテリア・ハッシュを保存する必要はない。

マークル・ツリーを用いてハッシュ化された取引ブロックからTx0-2を取り除いた後引なしのブロック・ヘッダーは約80 bytesである。仮に十分ごとに一つのブロックが作成されると仮定すると、80 bytes × 6 ×24 ×365 = 4.2 MB/年 となる。2008年の時点で平均的なパソコンは2 GBのRAMで売られており、ムーアの法則によると1.2 GB/年のペースで増大すると予測されるので、ブロック・ヘッダーをメモリに保存しておく必要があってもスペースの問題はないはずである。

Merkle Tree

解説


ブロックチェーンの性質上、全てのノードは、ビットコイン創設以来のすべての取引履歴を保持する必要がある。でもそれでは容量が増えすぎてハンドリングが大変である。

このための容量削減の仕組みがマークル・ツリーを用いたハッシュである。

つまりビットコインを使うとき、そのビットコインがどのような経緯をたどってきたかをすべて知る必要はない。自分のものであることが証明できれば十分である。しかしブロックチェーンで自分のものであることを証明するには、全ての履歴が必要になってしまう。

そこでトランザクションをまとめたブロックのハッシュを求めるときに、マークル・ツリーという仕組みを使う。各取引についてハッシュを求め、それをツリー状に次々とつないでいってルートハッシュを求め、それを使ってブロックのハッシュを算出する。

つまりブロックのハッシュは、すべての取引データに対して計算するのではなく、前ブロックのハッシュ、ルートハッシュ、nonceの3つの値で算出するのである。

こうしておけば、古くなって不要となった取引データを破棄しても、ブロックチェーンは維持することができる。

■ナカモトサトシ白書解説 簡易版支払い検証


完全なネットワークノードを実行していなくとも、支払いを検証することは可能である。ユーザーは、ネットワークノードにクエリーを行って得られる最長のチェーンが含む各ブロックのブロック・ヘッダーのコピーを保存しておくだけで、そのブロックにタイムスタンプされている取引をブロックにリンクしているマークル・ブランチを得ることができるからだ。ユーザー自身が自らその取引をチェックすることはできないが、そのマークル・ブランチをチェーンにリンクすることで、ネットワークがその取引を承認済みということが確認でき、またその後にブロックが加えられていったことでさらなる確証が得られる。

このように、良心的なノードがネットワークをコントロールする限り検証は信頼のおけるものとなるが、ネットワークが攻撃者に乗っ取られた場合には脆弱になる。ネットワークは自身で取引を検証できる一方で、各ノードが行う簡易版は、攻撃者がネットワークを乗っ取り続ける限り攻撃者の偽造した取引にだまされてしまう。一つの対処法は、ネットワークが不正なブロックを感知したときに発するアラートを受信する設定にしておき、受信した場合はユーザーのソフトウェアによりブロック全体とアラートされた取引をダウンロードし、不一致を確認することである。頻繁に支払いを受け取るビジネスに関しては、より独立した安全性とスピードの速い検証のために、独自のノードを運営するほうが良いだろう。

簡易版支払い検証

解説


普段は信用して「検証」を簡易にしておき、どこかで攻撃があったという警報が出されると、すべての取引を注意深く検証するという考え方である。

攻撃者がおらずすべてのノードが良心的である場合、一番長いチェーンを見れば、それが正しいと信じることが可能である。しかし、攻撃者がいる場合、チェーンの最後に近いブロックは不正なブロックである可能性がある。

ブロックの信頼性は、そのブロックの後ろに別のブロックが連結されることによって高まっていく。一般的にあるブロックの後ろに、5ブロックから6ブロックが連結された場合、そのブロックはまず間違いなく正しいと判断することが可能である。一ブロックの処理には平均10分かかるので、取引後一時間もすれば、取引が承認されたとみなすことができる。

少額の取引で、そんなに待てない場合、例えばお店でコーヒーを買ってビットコインで支払うなどの場合、お店はコーヒー代をだまし取られるリスクと客の利便性を天秤にかけて、簡易検証で良しとする(つまり一時間も待たずにその場でコーヒーを提供する)ことになる。

検証をどこまでやるかは、取引の内容によって変えることが可能である。

前回の記事  次回の記事


この記事が気に入ったらサポートをしてみませんか?