マイブロックチェーンの骨格だけPythonで実装してみる/ブロックチェーンの勉強一回目2020-02-10マイブロックチェーンの骨格だけPythonで実装してみる/ブロックチェーンの勉強一回目ITな話題:ブロックチェーンのお勉強ブロックチェーン技術の勉強に、pythonで「マイブロックチェーン」を実装してみようという試みです。はじめにブロックチェーンについて勉強したことの整理を兼ねて、Pythonで実装してみます。ブロックチェーンは要素がいろいろあるので、一度にあれもこれもするとポイントがぼけてしまうので、3回くらいにわけて、一歩一歩って感じでやります。今のところの予定としては。一回目:ブロックチェーンの骨格を作る二回目:保存や改ざんチェックなどの機能を付け加えてみる三回目:マイニングにあたる部分を付け加えてみるという感じで考えてます。き込み専用・改ざん困難という特徴に特化したデータ管理の仕組です。これらの特徴がマッチして、ビットコインなどの暗号通貨の中核機能になりました。改ざんを難しくするために、数珠つなぎになった前のブロックのハッシュを含むデータで新しいハッシュを計算するようなアプローチをとってます。P2Pネットワークでつながった利用者のPCには、数珠繋ぎになった全てのデータがダウンロードされる必要があり、ブロックチェイン全体のサイズが大きくなりすぎないように、ひとつひとつのブロックで扱えるのは、ごく小さなデータになります。それでも、チェインされるブロックの数が増えると結構なサイズになり、例えば、ビットコインコアの場合だと、2020年1月時点で「約210GBのデータが最初にダウンロードされて、毎月5-10GBデータが増加していく。bitcoincore.orgざっくり概要としては、こんな感じです。今回は、ブロックチェーンの骨格だけ「MyBlockChain」クラスとして実装します。改ざん検知やマイニングに関連する部分などは次回以降にまわします。MyBlockChainクラスの仕様を決めます。何をブロックのトランザクションとして管理するか・・を決めます。暗号通貨にならって、入力と出力のペアをトランザクションにします。123456P」「ZZZへ5678P」移動したという意味にする感じです。今後は実装するブロックの仕様ですけど、ビットコインのブロックチェーンを構成する「ブロック」も参考にして、以下のようにしてみます。ブロックインデックス(block_index)ブロック生成時刻(block_time)ブロックヘッダ(block_header)トランザクションカウンタ(tran_counter)トランザクション(tran_body)内容は、以下のようにします。ブロックインデックス:ブロックを一意に識別するIDブロック生成時刻:ブロックを生成したタイムスタンプトランザクションカウンタ:トランザクションの入出力の件数トランザクション:上記みたいな入力と出力の組合せブロックヘッダは、とりあえず前のブロックのトランザクションハッシュ値(prev_hash)このブロックのトランザクションハッシュ値(tran_hash)だけの最低限の仕様にします。あと、ビットコインとかだと、10分間に発生した複数トランザクションを1ブロックにまとめる・・みたいになっているそうですが、今回は1ブロック1トランザクションとして、そのかわり1トランザクションに複数の入出力をもてるということにします。こんなところで・・実装してみます。Pythonでの実装MyBlockChainクラスの全ソースです。最低限の骨格だけです。前のブロックのハッシュを取得。ハッシュ値を計算する。indent=2))補足説明していきます。今回はまだ既存のブロックチェインを読み込んで初期化する処理は実装してません。入力と出力を、それぞれ「input」「output」の辞書として用意する。それを受け取り、新しいトランザクションを生成する。前のブロックのハッシュを取得する、ただ、最初のブロックは固定値になる。トランザクションに前のブロックのハッシュを加えて、新たなハッシュを計算する。トランザクション・計算済ハッシュなどを使って新しいブロックを生成・追加する。入力と出力を、それぞれ「input」「output」の辞書として用意する。これは、上記のクラスには含まれません。out)みたいにして使うということです。入力(inp)と出力(outp)それぞれに対して辞書データを生成して引数にします。