banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

自分の最初のブロックチェーン——Pythonに基づいて

Python はシンプルで学びやすく、文法が美しく、機能が強力なプログラミング言語です。自由でオープンなコミュニティ環境を持ち、Web、クローリング、データ分析、機械学習などの開発フレームワークやライブラリが提供されており、迅速な開発に直接使用できます。また、Python のコードは実行可能な擬似コードとも呼ばれ、良い Python コードは擬似コードのようにクリーンでシンプルで明確です。したがって、ここでは Python を開発言語として選び、ブロックチェーンのプロトタイプを実装します。

Python は広く使用されている高級プログラミング言語で、オランダ人のグイド・ヴァンロッサムによって発明され、最初の版は 1991 年にリリースされました。Python という開発言語の名前が選ばれた理由は、ヴァンロッサムが BBC のテレビドラマ「モンティ・パイソン」のファンであったため、Python という言葉がこの言語の名前として選ばれました。ヴァンロッサムは Python を「優雅」「明確」「シンプル」と位置づけています。

そのため、Python のプログラムの文法はシンプルで理解しやすく、プログラミング初心者でも簡単に始められます。また、Python は豊富なデータ構造とライブラリを内蔵しており、初心者でも Python を使って非常に複雑な機能を簡単に実現できます。

Python 開発者の理念は、「一つの方法、できれば一つの方法で物事を行うべき」というもので、この理念は Python プログラムの設計に深く反映されています。Python プログラムを開発する際に複数の選択肢がある場合、Python 開発者は一般的に派手な文法を拒否し、明確であまり曖昧さのない文法を選びます。これらの Python プログラム開発の原則は「Python の禅」と呼ばれています。Python 開発者ティム・ピーターズによる「Python の禅」の要約は以下の通りです。

●美は醜よりも良い。
●明示的な方が暗黙的よりも良い。
●シンプルな方が複雑よりも良い。
●複雑な方が込み入ったよりも良い。
●平坦な方がネストされたよりも良い。
●まばらな方が密集したよりも良い。
●可読性は重要である。
●特別なケースはルールを破るほど特別ではない。
●実用性は純粋さに勝る。
●エラーは決して静かに通り過ぎてはいけない。
●明示的に静かにされない限り。
●曖昧さに直面したときは、推測する誘惑を拒否する。
●物事を行う明白な方法が一つ —— できれば一つだけ —— あるべきである。
●その方法は最初は明白でないかもしれない、あなたがオランダ人でない限り。
●今が決してよりも良い。
●ただし、決してはしばしば今すぐよりも良い。
●実装が説明しにくい場合、それは悪いアイデアである。
●実装が説明しやすい場合、それは良いアイデアかもしれない。
●名前空間は素晴らしいアイデアである —— もっとそれをやろう!

これらの原則は、Python 開発者がシンプルさを重視し、複雑さを避け、問題を効率的に解決することに焦点を当てることを促します。これはすべての開発者が考慮し、従うべきことです。

では、Python の世界に入っていきましょう。最初に行うべきことは、Python 開発環境を構築することです。

1. Python のインストール

Python のインストールプロセスは比較的簡単です。Python の公式ウェブサイトにアクセスし、対応するオペレーティングシステムの Python インストールファイルをダウンロードしてインストールするだけです。Python インストールファイルのダウンロードページは以下の通りです。

1)Python コードエディタの選択

まず、適切な Python コードエディタを選択します。

工欲善其事、必先利其器。オペレーティングシステムに付属のテキストエディタ(例えばメモ帳など)を使用して Python コードを書くこともできますが、そのようなエディタにはコードハイライト、オートコンプリート、コードエラー通知などの機能がないため、開発効率が大幅に低下します。したがって、機能が比較的充実した Python コードエディタを選択する必要があります。これにより、開発効率とコード品質を効果的に向上させることができます。ここでは、PyCharm、Sublime Text 3、Visual Studio Code、Atom、Jupyter Notebook などの主要な Python コードエディタを簡単に比較し、読者は自分のニーズに合ったエディタを選択できます。

●PyCharm は、Python 専用のフル機能統合開発環境です。Windows、Mac OS X、Linux システムのいずれでも迅速にインストールして使用できます。PyCharm には、Python 開発に関連する編集、デバッグ、コード管理などの機能が統合されており、新しいファイルを開くだけでコードの記述を開始できます。PyCharm は起動時に少し遅いですが、大規模なプロジェクトの開発と管理に適しています。

Atom のダウンロードリンクはhttps://atom.io/ です。

●Jupyter Notebook は、ブラウザでコードを記述および実行できるウェブベースの Python エディタで、実行結果は HTML などのリッチメディア形式で表示されます。また、Jupyter Notebook は LaTeX を使用して数式を記述したり、Markdown を使用して文書を作成したりすることもサポートしています。

Jupyter Notebook は追加のインストールファイルを必要とせず、ターミナル(Linux および Mac OS)またはコマンドプロンプト(Windows)で Python パッケージ管理ツールを使用してインストールできます。インストールコマンドは以下の通りです。

pip install jupyter

本書では、Jupyter Notebook を使用して Python コードの開発とデバッグを行います。

エディタの紹介が終わったら、次に Python のパッケージ管理ツールについて簡単に理解しましょう。

(2)Python パッケージ管理ツールのインストール

現在最も人気のある Python パッケージ管理ツールは pip コマンドです。Python インストールファイルを使用してインストールが完了すると、pip もシステムにインストールされます。

image

他のコマンドは pip help を使用して確認できます。

image

パッケージ管理ツールについて説明した後、次に Python の仮想環境について理解しましょう。

(3)Python 仮想環境の作成

Python の開発プロセスでは、サードパーティのパッケージや依存ライブラリをインストールする必要がありますが、異なるプロジェクトに必要なパッケージや依存ライブラリは通常異なります。異なるアプリケーション間でパッケージや依存ライブラリの競合を防ぐために、独立した Python 開発環境、つまり Python の仮想環境を作成するのが最善です。これにより、各プロジェクトの環境が他のプロジェクトから独立し、開発環境が他のプロジェクトの影響を受けず、パッケージの競合の問題を解決できます。独立した環境を作成する方法は、仮想環境管理ツールを使用することです。

現在最も人気のある Python 仮想環境管理ツールは virtualenv で、Python のサードパーティツールです。インストールコマンドは以下の通りです。

pip install virtualenv

インストールが完了したら、独立した Python 仮想開発環境を作成できます。この仮想環境を venv と名付け、作成コマンドは virtualenv venv -p python3 です。「-p python3」は Python のバージョンを Python 3 に指定するものです。

image

この仮想環境を使用するには、まず source venv/bin/activate コマンドでそれをアクティブにする必要があります。アクティブに成功すると、現在の行の最前面に現在の仮想環境の名前が表示されます。

image

これで、現在の Python 開発環境は前に作成した venv という仮想環境です。現在の仮想環境を終了したい場合は、deactivate コマンドを使用して操作し、終了後(venv)という仮想環境の名前も消えます。

4)Jupyter Notebook の起動と使用

次に、Python 仮想開発環境で jupyter をインストールし、Jupyter Notebook を起動します。Jupyter Notebook のインストールと起動のコマンドおよび実行プロセスは図 4-12 および図 4-13 の通りで、起動コマンドは jupyter notebook です。

図 4-12  インストール jupyter

図 4-13  Jupyter Notebook の起動

Jupyter Notebook を起動すると、自動的にブラウザでページが開きます(起動後、プログラムはデフォルトで 8888 ポートをリッスンします)。図 4-14 の通りです。

image

このページには「Files」タブの内容が表示されており、現在のフォルダ内のファイルディレクトリ構造がリストされています。2 番目のタブ「Running」には現在実行中の notebook ページが表示され、3 番目のタブ「Clusters」にはクラスター機能が表示されます。Python コードを記述するには、右上の「New」メニューを選択し、ドロップダウンリストから「Python 3」を選択して新しい notebook ページを作成します。図 4-15 の通りです。

image

新しく作成した notebook ページは主に 4 つの領域に分かれています。名前、メニューバー、ツールバー、編集領域です。図 4-16 の通りです。

image

図 4-16 Jupyter Notebook 編集ページ

タイトルはデフォルトで「Untitled」となっており、タイトル位置をダブルクリックすることで変更できます。メニューバーには notebook に対するすべての操作が含まれており、ツールバーにはよく使うコマンドが表示されています。

では、最初の Python プログラムを作成しましょう。

3. 最初の Python プログラム

最初の Python プログラムの機能は比較的シンプルで、「こんにちは、ブロックチェーン」という文字列を出力することです。Python の print 関数を使用して実現します。コード print(「こんにちは、ブロックチェーン」)を入力した後、「ツールバー」の「Run」ボタンをクリックするか、ショートカットキー<Shift+Enter>を使用してコードを実行します。図 4-17 の通りです。以下に「こんにちは、ブロックチェーン」という結果が印刷されます。

image

ブロックはブロックヘッダーとブロックボディの 2 つの部分で構成されており、ブロックヘッダーはバージョン、親ブロックのハッシュ値、データ、マークルルート、タイムスタンプ、目標難易度、Nonce 値で構成されています。ブロックボディには実際には任意の内容を含めることができ、ビットコインでは取引入力数、取引出力数、長さが不定の取引記録などの情報が含まれています。イーサリアムのブロックボディには取引データに加えてスマートコントラクトも含まれています。開発と理解を容易にするために、ここで開発するブロックチェーンシステムはブロックの構造を簡素化し、最も重要な数フィールドのみを使用し、他の非必要なフィールドは無視します。簡素化されたブロックには親ブロックのハッシュ値、データ、タイムスタンプ、ハッシュ値の 4 つのフィールドが含まれ、ブロックのハッシュ値はブロック内の親ブロックのハッシュ値、データ、タイムスタンプの 3 つのフィールドを結合してハッシュアルゴリズムで計算されます。Python を使用してブロックの構造を定義します。図

image

(2)ブロックチェーンの構造を定義する

ブロックチェーンはブロックで構成された鎖であり、ブロックの構造を定義した後、ブロックチェーンの構造も定義する必要があります。各ブロックをハッシュ値で前後に接続し、これらのブロックをすべて配列に格納します。初期化時はリストは空で、新しいブロックが順次このリストに追加されます。次に、このリストにブロックを追加する機能を実現する関数を定義することで、このブロックチェーンの構造を定義します。

image

ブロックチェーン構造

これで最もシンプルなブロックチェーン構造が完成しました。次に、この基盤の上に段階的に改善を加え、真のブロックチェーンシステムを実現します。

(3)ブロックチェーンプロトタイプの実装

1)最初のブロック、または創世ブロックを作成します。コードは図 4-34 の通りで、創世ブロックには親ブロックがないため、prev_hash の値は空です。

image

2)次に、2 つのブロックを作成します。データは張三の送金記録に関するもので、prev_hash は前のブロックのハッシュ値です。図

image

3)次に、新しいブロックチェーンを作成し、上記のブロックをブロックチェーンに追加します。図 4-36 の通りです。

image

4)最後に、現在のブロックチェーンの情報を印刷出力します。このブロックチェーンには 3 つのブロックが含まれていることがわかります。図

image

これで最もシンプルなブロックチェーンプロトタイプが実現しましたが、ブロックチェーンの核心機能、例えばコンセンサスメカニズム、アカウントと取引、分散型ネットワークなどが欠けているため、真のブロックチェーンとは言えません。次に、このプロトタイプの基盤の上に段階的にブロックチェーンのさまざまな特性を追加し、完全なブロックチェーンを実現します。まずはコンセンサスメカニズム —PoW(プルーフ・オブ・ワーク)を追加します。

コンセンサスメカニズムはブロックチェーン技術の重要な構成要素であり、3.1 コンセンサスメカニズムで一般的なコンセンサスメカニズムのいくつかが紹介されました。ここでは、Python を使用して比較的シンプルな PoW、つまりプルーフ・オブ・ワークメカニズムを実装します。PoW の原理は、条件を満たすハッシュ値を生成するために、ランダムな数(Nonce)の値を見つけるまで計算を繰り返すことです。図

image

次に、作業量証明メカニズムを上記のブロックチェーンプロトタイプに追加します。

1)まず、ブロックの構造を更新し、Nonce フィールドを追加します。図

image

2. ハッシュアルゴリズムライブラリ

Python にはすでにハッシュライブラリ —hashlib が内蔵されており、一般的なハッシュアルゴリズム(MD5、SHA256 など)を提供しています。以下は MD5 と SHA256 の使用方法です。図の通りです。

image

Base64 は任意のバイナリデータを 64 文字で表現する方法で、Python には Base64 ライブラリが内蔵されており、使用できます。以下の内容は、文字列「こんにちは、ブロックチェーン」を Base64 で暗号化および復号化するプロセスです。コードは図の通りです。

image

Python で非対称暗号アルゴリズム(例えば楕円曲線アルゴリズム)を使用する場合、サードパーティライブラリをインストールする必要があります。ここでは、Python で楕円曲線アルゴリズムを使用する方法を簡単に説明します。楕円曲線アルゴリズムを使用するには、まずサードパーティライブラリ ECDSA をインストールする必要があります。インストールコマンドは以下の通りです。

pip install ecdsa

インストールが完了したら、アルゴリズムライブラリをインポートし、一対の秘密鍵と公開鍵を生成します。次に、秘密鍵を使用して署名し、公開鍵を使用して署名を検証します。図 4-29 の通りです。まず SigningKey.generate()メソッドを使用して秘密鍵を生成し、この秘密鍵から一意の公開鍵を生成します。次に、秘密鍵を使用して「Something」という文字列の署名を生成し、秘密鍵から生成された公開鍵を使用してこの署名が正しいかどうかを検証します。

image

最後に、Python の描画ライブラリ Matplotlib を紹介します。このライブラリは一般的なグラフを生成し、データの可視化を行うために使用されます。Matplotlib はさまざまなプラットフォームをサポートし、強力な機能を持ち、さまざまな専門的なグラフを簡単に描画できます。このライブラリを使用するには、まずインストールする必要があります。インストールコマンドは以下の通りです。

pip install matplotlib

Matplotlib ライブラリの使用方法は図の通りです。

image

ブロックの構造について詳しく説明しましたが、ブロックはブロックヘッダーとブロックボディの 2 つの部分で構成されており、ブロックヘッダーはバージョン、親ブロックのハッシュ値、データ、マークルルート、タイムスタンプ、目標難易度、Nonce 値で構成されています。ブロックボディには実際には任意の内容を含めることができ、ビットコインでは取引入力数、取引出力数、長さが不定の取引記録などの情報が含まれています。イーサリアムのブロックボディには取引データに加えてスマートコントラクトも含まれています。開発と理解を容易にするために、ここで開発するブロックチェーンシステムはブロックの構造を簡素化し、最も重要な数フィールドのみを使用し、他の非必要なフィールドは無視します。簡素化されたブロックには親ブロックのハッシュ値、データ、タイムスタンプ、ハッシュ値の 4 つのフィールドが含まれ、ブロックのハッシュ値はブロック内の親ブロックのハッシュ値、データ、タイムスタンプの 3 つのフィールドを結合してハッシュアルゴリズムで計算されます。Python を使用してブロックの構造を定義します。図

image

ブロックチェーンはブロックで構成された鎖であり、ブロックの構造を定義した後、ブロックチェーンの構造も定義する必要があります。各ブロックをハッシュ値で前後に接続し、これらのブロックをすべて配列に格納します。初期化時はリストは空で、新しいブロックが順次このリストに追加されます。次に、このリストにブロックを追加する機能を実現する関数を定義することで、このブロックチェーンの構造を定義します。具体的なコードは図の通りです。

image

これで最もシンプルなブロックチェーン構造が完成しました。次に、この基盤の上に段階的に改善を加え、真のブロックチェーンシステムを実現します。

(3)ブロックチェーンプロトタイプの実装

1)最初のブロック、または創世ブロックを作成します。コードは図 4-34 の通りで、創世ブロックには親ブロックがないため、prev_hash の値は空です。

image

2)次に、2 つのブロックを作成します。データは張三の送金記録に関するもので、prev_hash は前のブロックのハッシュ値です。図

image

3)次に、新しいブロックチェーンを作成し、上記のブロックをブロックチェーンに追加します。図の通りです。

image

4)最後に、現在のブロックチェーンの情報を印刷出力します。このブロックチェーンには 3 つのブロックが含まれていることがわかります。図の通りです。

image

重要なコンセンサスメカニズムについては、作業量証明の計算プロセスで「マイニング」の計算量が非常に大きく、検証方法は非常に簡単で計算量が小さいことが言及されました。上の図のコードからもわかるように、「マイニング」にかかる時間は 1.42 秒であり、検証時間はわずか 0.026 秒(26μs)です。明らかに、検証は作業量証明の計算よりもはるかに簡単です。

4)作業量証明メカニズムを完成させた後、新しい作業量証明メカニズムを持つブロックチェーンを生成します。図の通りです。

image

上記のブロックチェーンのブロック情報を印刷すると、ブロックのハッシュ値がすべて「00000」で始まることがわかります。図の通りです。

image

すでに説明したように、ブロックチェーン技術においてアカウントは実際にはブロックチェーンネットワーク内のアドレスであり、ブロックチェーンネットワーク内の特定のノードを示すために使用されます。ウォレットはアカウントを保存するためのツールです。アカウントの本質は一対のユニークな秘密鍵と公開鍵であり、つまりウォレットの本質はこれらの鍵ペアを生成および管理するツールです。以下はウォレット、アカウントを作成し、その取引機能を実現する手順です。

(1)ウォレットとアカウントの作成

まず、ウォレットを表す Wallet クラスを定義します。Wallet は初期化時に一対のユニークな秘密鍵と公開鍵、つまり一つのアカウントを生成します。生成アルゴリズムは楕円曲線アルゴリズムに基づいています。具体的なコードは図の通りです。

image

2)署名の生成

アカウントを作成した後、このアカウントのアドレスと公開鍵を提供し、アカウントの秘密鍵を使用して署名を生成する必要があります。アドレスは公開鍵をハッシュアルゴリズムで処理した後、Base64 アルゴリズムで計算されます。署名は一連のバイナリ文字列として生成されます。表示を容易にするために、このバイナリ文字列を ASCII 文字列に変換して出力します。具体的なコードは図の通りです。

image

アカウントのアドレス、公開鍵、署名

(3)検証関数の生成

次に、署名が正しいかどうかを検証するための検証関数を実装する必要があります。検証関数の生成コードは図の通りです。

image

(4)ウォレット機能のテスト

次に、ウォレット機能をテストします。これには、アカウントの生成、アカウントのアドレス、公開鍵情報、および署名機能が正常に動作するかどうかが含まれます。図 4-48 の通りです。

上記の公開鍵と署名に基づいて、署名の正しさを検証できます。図の通り、コード実行の戻り結果は True であり、この署名はこの公開鍵に対応する秘密鍵に基づいて生成されたことを示しています。つまり、ウォレット(アカウント)の機能は正常です。

image

image

ウォレットとアカウントの機能が実装された後、取引機能を追加する必要があります。取引をサポートするために、取引のデータ構造を定義する必要があります。

前のステップでは、ブロック構造内のデータは単純な文字列でしたが、実際のブロックチェーンではデータは取引記録の集合です。これらの取引記録には、取引の送信者、受信者、取引数量、および取引を検証するための送信者の公開鍵と送信者の署名が含まれる必要があります。ここでは、これらのフィールドを含む Python クラス Transaction を定義します。図の通りです。

image

(6)ウォレットと取引機能の統合

ウォレットと取引の機能を完成させた後、これらの 2 つの機能を前に完成したブロックチェーンプロトタイプに更新します。

1)まず、ブロック構造内のデータを取引リストに置き換えます。図の通りです。

image

2)次に、作業量証明に報酬メカニズムを追加します。この報酬メカニズムは、マイニングに成功した後に暗号通貨を報酬として受け取ることができるというものです。ここでは、各ブロックを完成させるごとに 1 つの暗号通貨を受け取ると仮定します。コードは図の通りです。

image

3)次に、ブロックチェーン内のアカウントの暗号通貨の状況を取得するために、get_balance という名前のクエリ関数を追加します。この関数は、ブロックチェーン全体の取引データを遍歴し、アカウントに関連するすべての取引記録を取得して累積し、アカウントが受け取った金額を加算し、すべての支出金額を減算して、そのアカウントの現在の残高を計算します。図の通りです。

image

7)ブロックチェーン取引機能のテスト

最後に、ブロックチェーンの取引機能が正常に動作するかどうかをテストします。まず、空のブロックチェーンと 3 つのウォレットアカウント(アリス、トム、ボブ)を初期化します。図の通り、初期化されたウォレットの残高はすべて 0 です。

image

次に、アリスが創世ブロックを生成し、その創世ブロックをブロックチェーンに追加したと仮定します。作業量証明メカニズムに基づき、アリスは 1 つの暗号通貨を受け取ります。コードは以下の通りです。

image

アリスは報酬を受け取った後、トムに 0.3 の暗号通貨を送金します。コードは図の通りです。

image

この送金取引がブロックチェーンネットワークにブロードキャストされ、ボブによって検証され、新しいブロックがネットワークに追加されたと仮定します。ボブも 1 つの暗号通貨を受け取ります。コードは図の通りです。

image

この時点でのウォレットの残高を再度印刷します。この時点で、アリスはトムに 0.3 の暗号通貨を送金した後、残高が 0.7 になり、トムは 0.3 の暗号通貨を持ち、ボブはマイニングで 1 つの暗号通貨を受け取ったことがわかります。図の通りです。

image

これで、このブロックチェーンシステムはマイニング報酬と取引機能をサポートできるようになりました!しかし、実際のブロックチェーンは分散型ネットワークで動作しているため、次のセクションではシンプルな分散型ブロックチェーンネットワークを実装します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。