以前のPythonクラス文の記事にも書きましたが、ブロックチェーンのコーディングに挑戦していました。そして、最近やっと一応の完了をみたので、備忘録も兼ねて記事にしようと思います。主要参考サイトは下記の記事。
この記事を基本とし、不明部分などはその都度ググって学習しました。いちばんのネックになったのは、ブロックチェーンというよりFlaskでしたが。笑(ちなみにFlaskについては別で記事で書く予定です)この記事が基本になってるので、今回はトランザクションへの電子署名やUTXOなどは省略して、ホントにブロックチェーンとそのコーディングの全体感といった感じになっています。
私なりのざっくりした理解という部分もありますが、全体としてはそこまでおかしな内容ではないと思います。本記事は分量の関係で、概要部分を書いた前編と概要を書いた後編の2つに分かれています。
また、その他の参考サイトは一括して、後編に記載していますが、ブロックチェーン理解の上でAidemyのブロックチェーン講座はかなり参考になったので、ここにリンク貼って起きます。(特にアフィリエイト報酬などはもらっていませんが・・・)
1 ブロックチェーンとは
ブロックチェーンとは、Bitcoinの開発に際し、未だ正体不明のSatoshi Nakamotoが考え出したものです。Bitcoinのホワイトペーパーを読むと(思った以上にシンプル)、二重支払いの防止ということが念頭にあったことがわかります。改ざんできない点や分散型である点などが評価され、現在世界中でいろいろなプロジェクトが進んでいます。
昨年は「AI」がバズまりましたが、今年は「ブロックチェーン」がバズって、「うちもブロックチェーンを活用して、情報を管理しよう」といった会話が色々な会社で交わされるかもしれませんね。
1.1 概要
ブロックチェーンとは、ブロックが連なったもので、ブロックとは、取引履歴や時刻、1つ前のブロックのハッシュ値などを含んだ、1塊の情報のことです。ホワイトペーパーでは、タイムスタンプ・サーバーという言葉を使って説明しています。ブロックチェーンは、データの塊が連なったものだとも言えるのですが、それをハッシュ関数やプルーフオブワーク(PoW)、コンセンサスアルゴリズム、十分大きなネットワークといったアルゴリズムや仕組みを利用して、改ざんができず、かつ政府や銀行などの恣意的な運用ができる中央集権的機関も必要とせずに、運営できる、極めて有能な、優れものです。
1.2 自分なりの用語のざっくりとした説明
- トランザクション・・・取引のこと。「AさんがBさんからスイカを100円で買った」というように、誰が誰にいくらBitcoinを送金したという情報。
- ハッシュ値・・・ランダムな数値。ある情報Aをハッシュ関数というブラックボックスに入れると、指定したデータ量(256バイトや512バイトなど)のランダムな文字列A’が返ってくる。この出力された値をハッシュ値という。このブラックボックスであるハッシュ関数は数学的にアウトプットからインプットが、ほぼ推測できないようになっている(不可逆性)。また、入力する情報は、単なる数字の「1」から富士山の画像、好きなアイドルのライブ映像など、データであれば基本何でも受け付けてくれる。さらにデータがほんの少し変わるだけで出力される値が全く違うものになる(例えば「0」が100億個並んだデータのたった一つだけ「1」に変えただけで、全く無関係なハッシュ値が返される)。著名な暗号手段などで使われている。(別記事でまとめ記事を書く予定)
- ノード・・・ネットワークの参加者。Bitcoinのネットワークを友達のネットワークと例えると、それぞれの友達のこと。取引があった時に友達Aに伝えると、友達Aはその友達Bに伝え、その友達Bは友達Cに伝え、友達の友達の友達の・・・という風に伝えていくことで、ネットワーク全体にトランザクションやナンスなどの情報を伝えていく。
- マイニング・・・ブロックを作る仕組み。マイニングを行うノードがマイナー。下記で詳述。
- ナンスorプルーフ・・・ナンスという呼び名が一般的だが、今回は主要参考サイトがプルーフという呼び名で統一しているため、プルーフを使用。一定の任意の文字列。プルーフオブワークでハッシュ値を求めるために唯一調整する値。
- プルーフオブワーク(PoW)・・・各ノードで一斉に、一定のハッシュ値になるナンスを探す仕組み。ブロックチェーンの改ざんを防ぐ、1つのポイントになる。
- コインベース(採掘報酬)・・・1番最初にナンスを見つけた人に与えられる報酬。
- コンセンサスアルゴリズム・・・コンセンサスは「合意」のことで、アルゴリズムは簡単に言えば「仕組み」「システム」のこと。つまり、みんなで合意するための仕組み。その意味にプルーフオブワークを含んでいる説明などもありますが、この記事では、別々に扱っています。
- ウォレット・・・Bitcoinなどの仮想通貨を保存しておくデータのお財布。トランザクションの電子署名などとも関わりがある。
1.3 ブロックチェーンの構造
私の経験だと、ブロックチェーンは最初なんとなくとっつきやすいんですが、その専門用語や色々な連関を学ぶと逆に混乱してしまいやすいかなと思います。ブロックチェーンを理解するために、以下の3つの部分と4機能でそれぞれの構造で理解するのがわかりやすいんじゃないかと思いますので、この記事ではそのように説明します。今回省略している部分も、これをベースに肉付けする形で理解できるんじゃないかと思います。
(構造)
- 取引の実行(トランザクション部分)→ブロックの作成(マイニング部分)
- 各ノードが適宜コンセンサスアルゴリズムでブロックチェーンを相互に検証することででネットワーク全体のブロックチェーンが一致(コンセンサスアルゴリズム部分)
- ネットワークに参加するために、他のノードとつながりを持っていく(他のノードとの接続部分)
1.3.1 トランザクション部分
トランザクション部分のざっくりしたフローは以下のものです。
- トランザクション(取引)の実行
- ※実際には、公開鍵暗号方式を使った電子署名の仕組みが利用され、コインの所有者以外による不正な送金を
防ぐようになっています(今回の記事では省略)。
- ※トランザクションが実行された後、接続された各ノードに一斉に通知されます。
- →トランザクションの確認
- →トランザクションリストに挿入
- ※UTXOという仕組みが導入されており、ウォレットには複数のアドレスが存在していますが、それも今回は省略しています。
1.3.2 マイニング部分
トランザクション部分の絵を見てもらえるとわかりやすいと思います。
- ブロックを生成(トランザクションリスト、1つ前のハッシュ値、プルーフなどを取り込み、ブロックをつく)
- →PoWの実行(条件に合うハッシュ値が生成されるプルーフ(ナンス)を探索)
- ※ 一番最初にプルーフを見つけたノードは、接続する各ノードにそのプルーフを一斉通知
- →一番早く見つけたノードにコインベース(報酬)を付与
(PoWについて)
プルーフオブワークの主な特徴です。
- 条件は、ハッシュ値の先頭からの何個かまで「0」になっているなど(例:先頭から4つが「0」になる値)
- このプルーフ(ナンス)の探索が理論上、10分程度となるようにマイナー(マイニングに参加するノード)の状況などを見て、適宜変更されている
- プルーフの探索には、ハッシュ値の不可逆性(ハッシュ値の出力から入力を求められない性質)から、プルーフを1つ1つ試して、ハッシュ値を検証するという地道な作業が必要であり、各ノードにかなりの仕事量を求めて証明を行なっているという意味で、「プルーフオブワーク(仕事量の証明)」と命名された。
- ブロックチェーンの重要な改ざんを防ぐ仕組み
1.3.3 コンセンサスアルゴリズム部分
コンセンサスアルゴリズムは、ネットワーク全体で1つのブロックチェーンに統一するための相互検証の仕組みです。これにより、ブロックチェーンがノードごとに異なり、どの取引やブロックチェーンを信じて良いかわからなくなる(ブロックチェーンの信用がなくなる)ことを防ぎます。具体的には、各ノードが自身のブロックチェーンと他のノードのブロックチェーンをそれぞれ比較し、自分のブロックチェーンよりも長く、代々のブロックのハッシュ値が正しいブロックチェーンがあれば、それを自分のブロックチェーンと置き換えます。これも改ざんを防ぐための重要な仕組みです。
1.3.4 他のノードの接続
ブロックチェーンは、ネットワークによって成り立つもので、取引やマイニングなどをするには、他のノードと繋がることが必要になります。具体的には、1つのノードとまず繋がり、そのあとにそのノードに登録されている他のノードのIPアドレスを教えてもらって、ノードに追加していくという作業をします。この流れによって、全体のネットワークが構築されます。
※今回のコーディングでは、他のノードからIPアドレスを取得する部分は含んでいません。
1.3.5 ブロックチェーンの改ざんができない(しにくい)仕組みについて
ブロックチェーンの最大の特徴は改ざんしにくい、という点です。これは、プルーフオブワークとコンセンサスアルゴリズム、十分大きなネットワークによって可能となります。プルーフオブワークではナンスの探索に10分程度の時間がかかるため、あるブロックに含まれる取引を改ざんした場合、それ以後のブロックのプルーフを算出し直さなければなりません(ハッシュ値は入力が1ミリでも変わると全く違ったものになるため)。
一方で、コンセンサスアルゴリズムでは、有効なブロックチェーンを認定する上で、他のブロックチェーンよりも長いという条件があります。そのため、もし悪いノードがブロックチェーンを改ざんした場合、悪意あるノードは再度ナンスを算出するとともに、並行して存在する正しいブロックチェーンよりも長いブロックチェーンを作り出す必要がありますが、ネットワークが十分大きい中では、相当なコンピューティングパワーが必要となるか、奇跡並みに運良く早くプルーフが見つかるかのどちらかでしかありえないため、実質的に改ざんはかなり難しいものになります。さらに、ネットワークが大きくなっていくほど、改ざんへのインセンティブ自体も失われていき、ネットワークが安定するきっかけにもなります。
概要を記載した前編はここで終了です。後編はPythonを使ったコードを紹介していますので、ご興味があれば参考にして頂ければと思います。
ちなみにハッシュ関数についもブログ記事を書いてみました。





