Python-blockchain-quick-guide
Pythonブロックチェーン-はじめに
ブロックチェーンのチュートリアルでは、ブロックチェーンの背後にある理論について詳しく学びました。 ブロックチェーンは、世界で最も人気のあるデジタル通貨ビットコインの背後にある基本的な構成要素です。 チュートリアルでは、ブロックチェーンアーキテクチャを完全に説明するビットコインの複雑さを深く扱いました。 次のステップは、独自のブロックチェーンを構築することです。
中本atは、ビットコインと呼ばれる世界で最初の仮想通貨を作成しました。 ビットコインの成功を見て、他の多くの人が独自の仮想通貨を作成しました。 いくつかの例を挙げます-ライトコイン、Zcashなど。
また、独自の通貨を開始することもできます。 これをTPCoin(finddevguides Coin)と呼びます。 TPCoinを扱うすべてのトランザクションを記録するブロックチェーンを作成します。 TPCoinは、ピザ、ハンバーガー、サラダなどの購入に使用できます。 ネットワークに参加し、サービスを提供する通貨としてTPCoinを受け入れ始める他のサービスプロバイダーが存在する場合があります。 可能性は無限大。
このチュートリアルでは、このようなシステムを構築し、市場で独自のデジタル通貨を立ち上げる方法を理解してみましょう。
ブロックチェーンプロジェクト開発に関与するコンポーネント
ブロックチェーンプロジェクト全体の開発は、3つの主要なコンポーネントで構成されています-
- クライアント
- 鉱夫
- ブロックチェーン
クライアント
クライアントは、他のベンダーから商品を購入する人です。 クライアント自身がベンダーになる可能性があり、彼が供給する商品に対して他人からお金を受け入れます。 ここでは、クライアントがTPCoinsのサプライヤと受信者の両方になることができると想定しています。 したがって、コードを使用して、お金を送受信できるクライアントクラスを作成します。
マイナー
マイナーは、トランザクションプールからトランザクションを取得し、ブロックにまとめます。 鉱夫は、マイニング報酬を得るために有効な作業証明を提供する必要があります。 鉱夫が手数料として徴収するすべてのお金は、彼が保持するためのものです。 上記のクライアントが行うのと同じように、彼はそのお金をネットワーク上の他の登録ベンダーから商品やサービスを購入するために使うかもしれません。
ブロックチェーン
最後に、ブロックチェーンは、すべてのマイニングされたブロックを時系列でチェーンするデータ構造です。 このチェーンは不変であるため、気性に強いです。
新しいJupyterノートブックの各ステップで表示されるコードを入力して、このチュートリアルに従うことができます。 または、https://www.anaconda.com/[www.anaconda.com]からJupyterノートブック全体をダウンロードすることもできます。
次の章では、ブロックチェーンシステムを使用するクライアントを開発します。
Pythonブロックチェーン-クライアントの開発
クライアントとは、TPCoinsを保持し、自分自身を含むネットワーク上の他のベンダーからの商品/サービスのトランザクションを処理する人です。 この目的のために Client クラスを定義する必要があります。 クライアントに対してグローバルに一意のIDを作成するには、PKI(公開キー基盤)を使用します。 この章では、これについて詳しく説明します。
クライアントは自分の財布から別の既知の人にお金を送ることができるはずです。 同様に、クライアントは第三者からお金を受け取ることができるはずです。 お金を使うために、クライアントは送信者の名前と支払額を指定するトランザクションを作成します。 お金を受け取るために、クライアントは、本質的にお金の送り主である第三者に身元を提供します。 私たちは、クライアントが彼の財布に保持する残高を保存しません。 トランザクション中に、実際の残高を計算して、クライアントが支払いを行うのに十分な残高があることを確認します。
上記の標準ライブラリに加えて、トランザクションに署名したり、オブジェクトのハッシュを作成したりします。 このためには、次のライブラリをインポートする必要があります-
次の章では、クライアントクラスについて説明します。
Pythonブロックチェーン-クライアントクラス
秘密鍵を紛失しないでください。 記録を保持するために、生成された秘密キーは、セキュリティで保護された外部ストレージにコピーするか、単にそのASCII表現を紙に書き留めます。
生成された*公開*キーは、クライアントのIDとして使用されます。 このために、公開鍵のHEX表現を返す identity というプロパティを定義します。
- クライアント*クラスの完全なコードはここに示されています-
テストクライアント
次に、 Client クラスの使用方法を示すコードを記述します-
上記のコードは Client のインスタンスを作成し、変数 Dinesh に割り当てます。 identity メソッドを呼び出して、 Dinesh の公開キーを出力します。 出力はここに示されています-
次に、次の章でトランザクションを作成します。
Pythonブロックチェーン-トランザクションクラス
この章では、クライアントが誰かにお金を送ることができるように Transaction クラスを作成しましょう。 クライアントは、お金の送信者または受信者の両方になることができることに注意してください。 お金を受け取りたいときは、他の送信者がトランザクションを作成し、その中に*公開*アドレスを指定します。 私たちは次のようにトランザクションクラスの初期化を定義します-
次に、上記の4つのインスタンス変数すべてをディクショナリオブジェクトに結合する to_dict というユーティリティメソッドを記述します。 これは、1つの変数を介してトランザクション情報全体にアクセスできるようにするためです。
前のチュートリアルで知っているように、ブロックチェーンの最初のブロックは Genesis ブロックです。 Genesisブロックには、ブロックチェーンの作成者によって開始された最初のトランザクションが含まれます。 この人物の身元は、ビットコインの場合のように秘密にされる場合があります。 したがって、この最初のトランザクションが作成されると、作成者は自分のIDを Genesis として送信するだけです。 したがって、ディクショナリの作成中に、送信者が Genesis であるかどうかを確認し、そうであれば、単純にID変数に何らかの文字列値を割り当てます。それ以外の場合は、送信者のIDを identity 変数に割り当てます。
次のコード行を使用して辞書を作成します
最後に、送信者の秘密鍵を使用してこの辞書オブジェクトに署名します。 前と同様に、SHAアルゴリズムを備えた組み込みのPKIを使用します。 生成された署名はデコードされ、ASCII表現を取得して印刷し、ブロックチェーンに保存します。 sign_transaction メソッドのコードはここに示されています-
この Transaction クラスをテストします。
トランザクションクラスのテスト
この目的のために、 Dinesh および Ramesh という2人のユーザーを作成します。 Dineshは、5つのTPCoinsをRameshに送信します。 最初に、DineshおよびRameshというクライアントを作成します。
したがって、次のコードを使用してトランザクションインスタンスを作成します-
最初のパラメーターは送信者であり、2番目のパラメーターは受信者の公開鍵であり、3番目のパラメーターは転送される金額であることに注意してください。* sign_transaction *メソッドは、トランザクションを歌うための最初のパラメーターから送信者の秘密鍵を取得します。
トランザクションオブジェクトを作成したら、 sign_transaction メソッドを呼び出して署名します。 このメソッドは、生成された署名を印刷可能な形式で返します。 次の2行のコードを使用して署名を生成および印刷します-
上記のコードを実行すると、次のような出力が表示されます-
クライアントとトランザクションを作成する基本的なインフラストラクチャの準備ができたので、実際の状況と同様に、複数のクライアントが複数のトランザクションを実行します。
複数のトランザクションを作成する
さまざまなクライアントによって行われたトランザクションは、システムのキューに入れられます。マイナーはこのキューからトランザクションを取得し、ブロックに追加します。 その後、彼らはブロックを採掘し、勝った採掘者はブロックをブロックチェーンに追加する特権を持ち、それによって自分のためにいくらかのお金を稼ぐでしょう。
このマイニングプロセスについては、後でブロックチェーンの作成について説明するときに説明します。 複数のトランザクションのコードを記述する前に、特定のトランザクションの内容を出力する小さなユーティリティ関数を追加しましょう。
トランザクションの表示
次に、トランザクションオブジェクトを格納するためのトランザクションキューを定義します。
トランザクションキュー
キューを作成するには、次のように transactions と呼ばれるグローバル list 変数を宣言します-
新しく作成された各トランザクションをこのキューに追加するだけです。 簡潔にするため、このチュートリアルではキュー管理ロジックを実装しないことに注意してください。
複数のクライアントを作成する
ここで、トランザクションの作成を開始します。 最初に、他の人からさまざまなサービスや商品を入手するために互いにお金を送る4つのクライアントを作成します。
この時点で、Dinesh、Ramesh、Seema、およびVijayという4つのクライアントがあります。 現在、これらの各クライアントは、取引のためにウォレットにTPCoinを保持していると想定しています。 これらの各クライアントのIDは、これらのオブジェクトのidentityプロパティを使用して指定されます。
最初のトランザクションの作成
今、私たちは次のように最初のトランザクションを開始します-
このトランザクションでは、Dineshは5つのTPCoinsをRameshに送信します。 取引を成功させるには、Dineshがこの支払いのために財布に十分なお金があることを確認する必要があります。 システムでTPCoinの循環を開始するには、ジェネシストランザクションが必要であることに注意してください。 この創世記トランザクションのトランザクションコードは、読み進めながらすぐに記述します。
Dineshの秘密鍵を使用してこのトランザクションに署名し、次のようにトランザクションキューに追加します-
Dineshが最初に行ったトランザクションの後、上記で作成したさまざまなクライアント間にさらにいくつかのトランザクションを作成します。
トランザクションを追加する
ここでさらにいくつかのトランザクションを作成し、各トランザクションがいくつかのTPCoinを別のパーティに渡します。 誰かがお金を使うとき、彼はこの財布の十分な残高をチェックする必要はありません。 とにかくマイナーは、トランザクションを開始する間に送信者が持っている残高の各トランザクションを検証します。
残高が不足している場合、マイナーはこのトランザクションを無効としてマークし、このブロックに追加しません。
次のコードは、さらに9つのトランザクションを作成してキューに追加します。
上記のコードを実行すると、鉱夫がブロックを作成するためのキューに10個のトランザクションができます。
トランザクションのダンプ
ブロックチェーンマネージャーとして、定期的にトランザクションキューの内容を確認することができます。 この目的のために、前に開発した display_transaction 関数を使用できます。 キュー内のすべてのトランザクションをダンプするには、トランザクションリストを繰り返し、参照された各トランザクションに対して、ここに示すように display_transaction 関数を呼び出します-
トランザクションは区別のために破線で区切られています。 上記のコードを実行すると、トランザクションリストが以下のように表示されます-
簡潔にするために、リストの最初のいくつかのトランザクションのみを印刷しました。 上記のコードでは、このリストに追加されなかったGenesisトランザクションを除き、最初のトランザクションから始まるすべてのトランザクションを出力します。 トランザクションは定期的にブロックに追加されるため、通常、まだマイニングされていないトランザクションのリストのみを表示することに関心があります。 その場合、適切な for ループを作成して、まだマイニングされていないトランザクションを繰り返す必要があります。
これまで、クライアントを作成し、クライアント間でそれらを許可し、マイニングされる保留中のトランザクションのキューを維持する方法を学習しました。 さて、このチュートリアルの最も重要な部分は、ブロックチェーン自体の作成です。 これについては、次のレッスンで学習します。
Pythonブロックチェーン-ブロッククラス
ブロックは、さまざまな数のトランザクションで構成されます。 簡単にするために、このケースでは、ブロックが固定数のトランザクション(この場合は3)で構成されていると仮定します。 ブロックはこれらの3つのトランザクションのリストを保存する必要があるため、次のように verified_transactions と呼ばれるインスタンス変数を宣言します-
この変数に verified_transactions という名前を付けて、検証済みの有効なトランザクションのみがブロックに追加されることを示しています。 各ブロックは前のブロックのハッシュ値も保持するため、ブロックのチェーンは不変になります。
前のハッシュを保存するには、次のようにインスタンス変数を宣言します-
最後に、マイニングプロセス中にマイナーによって作成されたナンスを格納するための Nonce という変数をもう1つ宣言します。
- ブロック*クラスの完全な定義は以下のとおりです-
各ブロックには前のブロックのハッシュの値が必要なので、次のように last_block_hash というグローバル変数を宣言します-
次に、ブロックチェーンの最初のブロックを作成しましょう。
Pythonブロックチェーン-ジェネシスブロックの作成
TPCoinsの発信者は、既知のクライアント Dinesh に500 TPCoinsを最初に提供すると想定しています。 このために、彼は最初にディネシュのインスタンスを作成します-
次に、ジェネシストランザクションを作成し、500 TPCoinsをDineshのパブリックアドレスに送信します。
ここで、 Block クラスのインスタンスを作成し、 block0 と呼びます。
これはブロックチェーンに保存される最初のトランザクションであるため、 previous_block_hash および Nonce インスタンス変数を None に初期化します。
次に、ブロック内に保持されている verified_transactions リストに上記のt0トランザクションを追加します-
この時点で、ブロックは完全に初期化され、ブロックチェーンに追加する準備ができています。 この目的のためにブロックチェーンを作成します。 ブロックをブロックチェーンに追加する前に、ブロックをハッシュし、その値を以前に宣言した last_block_hash と呼ばれるグローバル変数に保存します。 この値は、ブロック内の次のマイナーによって使用されます。
次の2行のコーディングを使用して、ブロックをハッシュし、ダイジェスト値を保存します。
最後に、次の章で見るようにブロックチェーンを作成します。
Pythonによるブロックチェーンの作成
ブロックチェーンには、相互にチェーンされたブロックのリストが含まれます。 リスト全体を保存するには、TPCoinsというリスト変数を作成します-
また、ブロックチェーン全体の内容をダンプするための dump_blockchain と呼ばれるユーティリティメソッドを作成します。 最初にブロックチェーンの長さを出力し、ブロックチェーンに現在いくつのブロックが存在するかを確認します。
時間が経つにつれて、ブロックチェーン内のブロックの数が印刷のために非常に多くなることに注意してください。 したがって、ブロックチェーンの内容を印刷するときは、調査する範囲を決定する必要があります。 以下のコードでは、現在のデモでブロックを追加しすぎないように、ブロックチェーン全体を印刷しています。
チェーンを反復処理するには、次のように for ループを設定します-
参照される各ブロックは、 block_temp という一時変数にコピーされます。
各ブロックの見出しとしてブロック番号を印刷します。 番号はゼロから始まり、最初のブロックはゼロの番号が付けられたジェネシスブロックであることに注意してください。
各ブロック内で、3つのトランザクションのリスト(genesisブロックを除く)を verified_transactions と呼ばれる変数に保存しました。 このリストを for ループで繰り返し、取得した各アイテムに対して、 display_transaction 関数を呼び出してトランザクションの詳細を表示します。
関数定義全体は以下に示されています-
ここでは、コード内のブロックとトランザクションを区切るために、コード内の適切なポイントにセパレーターを挿入していることに注意してください。
ブロックを保存するためのブロックチェーンを作成したので、次のタスクはブロックを作成し、ブロックチェーンへの追加を開始することです。 この目的のために、前の手順で既に作成したジェネシスブロックを追加します。
Pythonブロックチェーン-ジェネシスブロックの追加
ブロックチェーンにブロックを追加するには、作成したブロックを TPCoins リストに追加します。
システム内の残りのブロックとは異なり、ジェネシスブロックには、TPCoinsシステムの発信者によって開始されるトランザクションが1つしか含まれていないことに注意してください。 次に、グローバル関数 dump_blockchain を呼び出して、ブロックチェーンの内容をダンプします-
この機能を実行すると、次の出力が表示されます-
この時点で、ブロックチェーンシステムを使用する準備が整いました。 関心のあるクライアントがマイニング機能を提供することで、マイナーになれるようにします。
Pythonブロックチェーン-マイナーの作成
マイニングを有効にするには、マイニング機能を開発する必要があります。 マイニング機能では、特定のメッセージ文字列でダイジェストを生成し、作業の証拠を提供する必要があります。 この章でこれについて議論しましょう。
メッセージダイジェスト機能
特定のメッセージのダイジェストを作成するための sha256 というユーティリティ関数を作成します-
マイニング機能
現在、独自のマイニング戦略を実装する mine 関数を開発しています。 この場合の戦略は、特定の数の1がプレフィックスとして付加された特定のメッセージにハッシュを生成することです。 与えられた1の数は、難易度として指定された mine 関数のパラメーターとして指定されます。
たとえば、難易度2を指定した場合、特定のメッセージで生成されるハッシュは、11xxxxxxxxのように2つの1で始まる必要があります。 難易度が3の場合、生成されるハッシュは111xxxxxxxxのように3つの1で始まる必要があります。 これらの要件を考慮して、次に示す手順でマイニング機能を開発します。
ステップ1
マイニング機能は、メッセージと難易度の2つのパラメーターを取ります。
ステップ2
難易度は1以上である必要があり、次のアサート文でこれを保証します-
ステップ3
設定された難易度を使用して prefix 変数を作成します。
難易度が2の場合、プレフィックスは「11」になり、難易度が3の場合、プレフィックスは「111」になります。 生成されたメッセージのダイジェストにこのプレフィックスが存在するかどうかを確認します。 メッセージ自体をダイジェストするには、次の2行のコードを使用します-
各反復でメッセージハッシュに新しい番号 i を追加し続け、結合されたメッセージに新しいダイジェストを生成します。 sha256 関数への入力が反復ごとに変わると、 digest 値も変わります。 この digest 値に上記の prefix が設定されているかどうかを確認します。
条件が満たされた場合、 for ループを終了し、呼び出し元に digest 値を返します。
理解するために、ダイジェスト値と、関数から戻る前に条件を満たすためにかかった反復回数を出力する print ステートメントを追加しました。
マイニング機能のテスト
私たちのマイニング機能をテストするには、単に次のステートメントを実行します-
上記のコードを実行すると、次のような出力が表示されます-
生成されたダイジェストは「11」で始まることに注意してください。 難易度を3に変更すると、生成されたダイジェストは「111」で始まります。もちろん、おそらくより多くの反復が必要になります。 ご覧のとおり、処理能力の高いマイナーは、特定のメッセージをより早くマイニングできます。 これが、採掘者が収入を得るために互いに競争する方法です。
これで、ブロックチェーンにさらにブロックを追加する準備が整いました。 次の章でこれを学びましょう。
Pythonブロックチェーン-ブロックの追加
各マイナーは、以前に作成されたトランザクションプールからトランザクションを取得します。 既にマイニングされたメッセージの数を追跡するには、グローバル変数を作成する必要があります-
最初のマイナーがブロックをブロックチェーンに追加します。
最初のブロックの追加
新しいブロックを追加するには、まず Block クラスのインスタンスを作成します。
キューから上位3つのトランザクションを選択します-
トランザクションをブロックに追加する前に、マイナーはトランザクションの有効性を検証します。 トランザクションの妥当性は、送信者の公開キーを使用してマイナーによって生成されたハッシュに対して送信者によって提供されたハッシュが等しいかどうかをテストすることにより検証されます。 また、マイナーは、送信者が現在のトランザクションの支払いに十分な残高があることを確認します。
簡潔にするため、この機能はチュートリアルに含めていません。 トランザクションが検証されたら、それを block インスタンスの verified_transactions リストに追加します。
次のマイナーがキュー内の後続のトランザクションを取得できるように、最後のトランザクションインデックスをインクリメントします。
ブロックに正確に3つのトランザクションを追加します。 これが完了したら、 Block クラスの残りのインスタンス変数を初期化します。 最初に最後のブロックのハッシュを追加します。
次に、難易度2のブロックをマイニングします。
最後に、作成したブロックをブロックチェーンに追加し、次のブロックで使用するためにグローバル変数 last_block_hash を再初期化します。
ブロックを追加するためのコード全体を以下に示します-
ブロックを追加する
ブロックチェーンにさらに2つのブロックを追加します。 次の2つのブロックを追加するためのコードは以下のとおりです-
これらの2つのブロックを追加すると、Nonceを見つけるためにかかった反復回数も表示されます。 この時点で、ブロックチェーンはジェネシスブロックを含む合計4つのブロックで構成されています。
ブロックチェーン全体のダンプ
次のステートメントを使用して、ブロックチェーン全体の内容を確認できます-
次のような出力が表示されます-
Pythonブロックチェーン-範囲と結論
このチュートリアルでは、Pythonでブロックチェーンプロジェクトを構築する方法を学びました。 このプロジェクトにさらに機能を追加する必要がある多くの領域があります。
たとえば、トランザクションキューを管理するための関数を作成する必要があります。 トランザクションがマイニングされ、マイニングされたブロックがシステムに受け入れられた後、トランザクションを保存する必要はありません。
また、鉱夫は確かに最高の手数料で取引を引き受けることを好むでしょう。 同時に、低料金または無料のトランザクションが永久に飢えないようにする必要があります。
キューを管理するためのアルゴリズムを開発する必要があります。 また、現在のチュートリアルには、クライアントインターフェイスコードは含まれていません。 通常のクライアントと鉱夫の両方のためにこれを開発する必要があります。 本格的なブロックチェーンプロジェクトでは、さらに数行のコードが実行されるため、このチュートリアルの範囲を超えています。 興味のある読者は、https://bitcoin.org/en/download [bitcoin source]をダウンロードして、さらに調査することができます。
結論
この鮮明なチュートリアルにより、独自のブロックチェーンプロジェクトの作成を開始できます。
本格的なブロックチェーンプロジェクト開発については、https://bitcoin.org/en/download [bitcoin source]から詳細を学ぶことができます。
大規模な商業プロジェクトまたは非商業プロジェクトの場合は、https://www.ethereum.org/[Ethereum]-すぐに使用できるブロックチェーンアプリプラットフォームの使用を検討できます。