ブロックチェーンとは「分散型台帳技術」とも呼ばれ、中央の管理者なしに、P2Pネットワークで暗号資産やNFTなど「価値」の取引を可能にするための仕組みです。2008年にサトシナカモトという正体不明の人物(もしくは組織)によって、ビットコイン(P2P電子通貨システム)を実現するために発明されました。最近では暗号資産だけではなくブロックチェーンを活用したゲームやシステムを見かけることも多くなりましたね。そこで今回は、Python で簡単なブロックチェーンを実装する流れを何回かの記事に分けてまとめてみたいと思います。
サトシナカモトの論文
ブロックチェーンの概念となるサトシナカモトの原論文「Bitcoin: A Peer-to-Peer Electronic Cash System」は、各言語に翻訳されたものが以下のページで読むことができます。ブロックチェーンによってどのような課題を解決するのか、それはどのように実現するのかなどが約10ページの論文に簡潔にまとめられていますので、一度読んでおくことをオススメします。
ビットコイン: P2P電子通貨システム
また、ブロックチェーンの実装となるビットコインのコードはGitHubで公開されています。本格的なブロックチェーンを開発する場合は参考になるでしょう。
https://github.com/bitcoin/bitcoin
今回作成するブロックチェーンの構造
今回作成するブロックチェーンは、下図のようなシンプルなブロックチェーンです。
ブロックチェーンの先頭は「ジェネシスブロック」と呼ばれる特別なブロックです。続いて複数のトランザクション(これがデータ部分です)を含んだブロックがチェーンのようにつながりブロックチェーンを構成します。各ブロックには前のブロックのハッシュ値が格納されていますので、これを使ってブロックが改ざんされていないことを検証することができます。仮に1,000ブロックあるブロックチェーンに保存されているトランザクションがどれか1つでも改ざんされていれば、少なくとも最後のブロックのハッシュ値は変わりますので、これにより改ざんが検知されそのブロックチェーンが不正なものであることが分かります。
ブロックの構造
ブロックの構造は次の通りです。データ部分となる複数のトランザクション以外の要素をまとめて「ブロックヘッダー」と呼びます。また、ブロックヘッダーには「マークル・ルート」と呼ばれるトランザクションの検索を効率的に行うための要素を含むことがありますが、今回作成するブロックチェーンでは割愛しています。
要素 | 内容 |
---|---|
タイムスタンプ | ブロックを作成した時点のUNIX時間です。 |
前のブロックのハッシュ値 | 1つ前のブロック全体をハッシュ化した値です。今回作成するブロックチェーンではハッシュ化アルゴリズムにSHA-256を使います。 |
ナンス | マイニングの成功条件を満たすための値です。 |
複数のトランザクション | 複数のトランザクションをリスト形式で格納します。 |
トランザクションの構造
ブロックに格納されるトランザクションの構造は次の通りです。トランザクションについても送信者から受信者へコインを送金するだけのシンプルなものです。トランザクションの匿名性を高めたい場合は、トランザクション毎に新しい鍵のペア(公開鍵と秘密鍵)を用いるなどの工夫が必要なことに留意してください。
要素 | 内容 |
---|---|
タイムスタンプ | トランザクションを作成した時点のUNIX時間です。 |
送信者の公開鍵(アドレス) | 送信者の公開鍵をそのまま送信者のアドレスとします。今回は説明を簡単にするために公開鍵をそのままアドレスにしていますが、例えばビットコインでは公開鍵を二重にハッシュ化しBase58でエンコードしたものをアドレスにしています。 |
受信者の公開鍵(アドレス) | 上記と同じく受信者の公開鍵をそのまま受信者のアドレスとします。 |
コインの枚数 | 送信するコインの枚数です。コインの枚数は整数のみとしマイナスは許可しないものとします。 |
トランザクション署名 | トランザクション(具体的には上記4つの要素)に対して送信者の秘密鍵でに署名します。この署名を検証することにより送信者のなりすましやトランザクションが改ざんされていないことを証明できます。 |
ブロックチェーンノードと登場人物
今回作成するブロックチェーンを構成するためのノードと登場人物は次の図の通りです。
(補足)「ノード」はサーバーと呼んでも差し支えないのですが、P2Pネットワークではサーバーとクライアントという区別がないため、この記事でもブロックチェーンを構成するコンピュータのことを「ノード」と表記します。
各ノードは「トランザクションプール」と「ブロックチェーン」の2つのデータを持ち、そのデータはすべてのノードで同期しています。
要素 | 内容 |
---|---|
トランザクションプール | 利用者から送られてくるトランザクションを一時的に保管しておく場所です。トランザクションがトランザクションプールに登録されただけでは送金は完了せず、マイナーがトランザクションプールからトランザクションを取り出し、そのトランザクションを含んだブロックをチェーンに追加することで、そのトランザクションが承認され送金完了となります。 |
ブロックチェーン | ブロックチェーン本体のデータです。上の説明の通りマイナーによって更新されます。 |
上の図では、中央のノードに対して利用者とマイナーがデータの更新を行なっていますが、そのデータは他のノードにも反映されます。ゆえに、利用者とマイナーはどのノードに対してデータの更新を行なっても問題ないとご理解ください。また、ビットコインなど実際のブロックチェーンではマイナー(マニイニングしてブロックを追加する人)がノードを管理することもあるのですが、この記事ではマイナーはマイニングのみを行う役割とします。
処理の流れ
トランザクションの登録からブロックの追加されるまでのおおまかな処理の流れは次の通りです。
No | 処理 |
---|---|
① | 利用者はトランザクションを作成し、トランザクションプールに登録します。 |
② | マイナーは、ノードからトランザクションとブロックチェーンをダウンロードします。 |
③ | マイナーは、ダウンロードしたトランザクションおよび自分への報酬のトランザクションを含んだ新たなブロックをブロックチェーンに追加します。ブロックを追加するには、マイニングの成功条件を満たすための「ナンス」という値を計算する必要がありこの計算には高性能なコンピューターが必要になります。実際のブロックチェーンではマイナーは複数いるため、いかに早く「ナンス」を計算できるのかがマイニング競争のポイントになります。 |
④ | マイニングに成功したマイナーは、ノードのブロックチェーンを更新します。更新されたブロックチェーンは全てのノードにブロードキャストされデータが同期します。今回作成するブロックチェーンではノードのブロックチェーンが更新された時点でトランザクションが承認され送金が完了したとみなします。ただし、実際のブロックチェーンでは同時に別のマイナーが別のノードのブロックチェーンを更新することもありえますので、この後にブロックが4個〜6個程度追加された時点でトランザクションを承認済とみなしています。(詳しくは「孤立ブロック」で検索してください) |
実装と利用のポイント
ブロックチェーンの実装にあたって重要なポイントは、ノードと登場人物は、他のノードと登場人物を一切信用しない ことです。例えば、利用者が不正なトランザクションを登録する、ノードの管理者がトランザクションを改ざんする、マイナーがいい加減なナンスでブロックを更新する。などなど、1ビットコインが1,000万円以上で取引されるブロックチェーンでは(2024年11月現在)あの手この手で不正にビットコインを手に入れようとしてきます。
銀行などの中央集権型システムでは、中央の組織が取引の信用をチェックしてくれますが、ブロックチェーンは分散型システムであり中央の組織は存在しないため、取引(トランザクション)の信用は、各ノード、各マイナーが自分でチェックする必要があります。そして信用のキーとなるのが「秘密鍵を持っている事実」と「正しいナンス」が計算されていることの2点です。
ブロックチェーンの利用におけるポイントは秘密鍵の管理です。仮に、利用者Aさんの秘密鍵を盗んだ悪者Xが、利用者Aさんの秘密を使って自分に送金したとしてもブロックチェーンでは「秘密鍵を持っている事実」のみで信用のチェックを行うため正しいトランザクションとして扱われます。そのため、ブロックチェーンの利用者は自分の秘密鍵を盗まれないように大切に管理することが必要です。
開発環境の準備
今回のブロックチェーンを実装するにあたり次のものをご準備ください。
- Python バージョン3 が使えるパソコン(開発環境)
- サーバー3台くらい(ノード用)
今回は Python でブロックチェーンを実装しますので Python(バージョン3)が使えるパソコンを開発環境としてご準備ください。とりあえずは、Python が使えるパソコンさえあればブロックチェーンの実装はできますが、最後にノード間のデータ同期をテストするためにサーバーが必要になります。サーバーは VitrualBox などの仮想マシンでも大丈夫です。サーバーOSはなんでも構いませんが、Python が使える必要がありますので Linux OS がオススメです。(この記事では Ubuntu Server 24.04 を使った説明になります)
また、この記事では Python については説明いたしませんので、Python については専門書やWebサイトなどをご参照ください。
Python モジュールのインストール
今回実装するブロックチェーンでは、以下の Python モジュールを使いますのでインストールしておきましょう。(必要になったタイミングでインストールしても大丈夫です)
pip install ecdsa pip install pandas pip install fastapi pip install uvicorn pip install requests pip install pydantic
ファイル構成
ファイル構成について決まりはありませんが、今回は説明の都合のため以下のファイル構成を前提とします。詳細の説明は割愛いたしますが「BlockChain.py」に、ブロックチェーンのコアとなる機能を実装し、実行ファイル「send_tx.py」「node.py」「mining.py」にインポートして利用します。
blockchain/ ├─ data/ ├─ mod/ ├─ BlockChain.py ・・・ブロックチェーンのコア機能を実装 └─ users.py ├─ tool/ └─ gen_key.py ├─ send_tx.py・・・実行ファイル ├─ node.py・・・・実行ファイル └─ mining.py・・・実行ファイル
コメント