ビットコインはブロックチェーンの上に構築されていることをご存知ですか?今日はPythonを使ってブロックチェーンをゼロから構築していきます。

ブロックチェーンとは何ですか?

2008年に、サトシ・ナカモトという名前の未知の個人またはグループによってビットコインの論文が発表されました。ビットコインは、中央機関(銀行)を介さずに取引を可能にする電子マネーのピアツーピアバージョンとして登場しました。ほとんどの人は、サトシが同じ論文で、今日ではブロックチェーンとして知られる情報を保存する分散型の方法を定義したことを知りません。

ブロックチェーン技術
ブロックチェーン技術

簡単に言うと、ブロックチェーンは、コンピューターの分散ネットワーク上でトランザクションを保存する、共有された不変のデジタル台帳です。

ブロックチェーンは 2 つの簡単な用語に分けることができます。

  • ブロック: トランザクションを保存するスペース
  • チェーン: リンクされたレコードのセット

これは、ブロックチェーンをリンクされたブロックのチェーンとして定義し、各ブロックには特定のパラメーターで行われたトランザクションが保存されます。

各ブロックは別のブロックの上に構築され、不可逆的なブロックのチェーンが作成されます。言い換えれば、すべてのブロックは別のブロックに依存します。これにより、適切な権限を持つ誰もが整合性を確認できる、堅牢かつ不変のシステムが誕生します。

ブロックチェーンには、興味深い一連の機能が導入されています。

  • 歴史の不変性
  • 情報の永続性
  • 保存されたデータにエラーはありません

現在、暗号通貨、資産転送 (NFT)、そしておそらく近い将来には投票など、多くのシステムがブロックチェーンに依存しています。

Python ブロックチェーンは、コードが数千行ある複雑なプログラムである必要はないことに注意してください。その中心となるのは、相互にリンクされたトランザクションのリストです。

もちろん、これは簡単な説明でしたが、完全なガイドが必要な場合は、初心者向けのブロックチェーンに関する完全なチュートリアルを作成しました。ぜひチェックしてみてください。

早速、Python を使用して簡単なブロックチェーンを構築してみましょう。

Python でブロックチェーンを構築する

始める前に、このチュートリアルで何を行うかを定義しましょう。

  • Python で書かれたシンプルなブロックチェーン システムを構築する
  • 文字列として表現される事前に確立されたトランザクションでブロックチェーンを使用する
  • ブロックチェーンの不変性をテストする

JSON ではなく Python リストを使用します。これにより、プロセスが簡素化され、ブロックチェーンの主要な概念の適用に集中できるようになります。

このチュートリアルに従うために必要なもの:

  • Python のクラスとメソッドの理解
  • コマンドラインの基本的な使い方

Blockクラスの作成

お気に入りのコード エディターを開き、 main.pyファイルを作成します。これが作業するファイルになります。

次に、一方向の暗号化メッセージを作成できるモジュールであるhashlibをインポートします。ハッシュなどの暗号化技術により、ブロックチェーンは安全なトランザクションを作成します。

ハッシュ関数は、データ (通常はエンコードされた文字列) を受け取り、一意の識別子を返すアルゴリズムであり、多くの場合「ダイジェスト」または「署名」という名前が付けられます。この最後の部分は非常に重要です。ハッシュ関数では、入力のわずかな違いにより、出力として根本的に異なる識別子が生成されます。これについては後で実際に見ていきます。

ここでは、組み込みモジュール hashlib をインポートするだけです。

 # main.py file
"""
A simple Blockchain in Python
"""

import hashlib

このモジュールには、必要なハッシュ アルゴリズムのほとんどが含まれています。 hashlib.sha256()関数を使用することに注意してください。

それでは、完全にオリジナルのブロックチェーン名である GeekCoinBlock について説明しましょう。

 class GeekCoinBlock:
    
    def __init__(self, previous_block_hash, transaction_list):

        self.previous_block_hash = previous_block_hash
        self.transaction_list = transaction_list

        self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}"
        self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()

これにより、コードが不格好になる可能性があることは承知しています。次のセクションで各部分を詳しく見てみましょう。

ギークコインブロックの説明

まず、特定の特性 (属性) と動作 (メソッド) を持つオブジェクトのラッパーであるGeekCoinBlockという名前のクラスを作成します。

次に、GeekCoinBlock オブジェクトが作成されるたびに呼び出される__ init__メソッド (コンストラクターとも呼ばれます) を定義します。

このメソッドには 3 つのパラメータがあります。

  • self (各オブジェクトのインスタンス)
  • previous_block_hash (前のブロックへの参照)
  • transaction_list (現在のブロックで行われたトランザクションのリスト)。

以前のハッシュとトランザクションのリストを保存し、インスタンス変数block_data を文字列として作成します。実際の暗号通貨ではこのようなことは起こりません。仮想通貨ではその種のデータを別のハッシュとして保存しますが、簡単にするために、データのすべてのブロックを文字列として保存します。

最後に、他のブロックがチェーンを継続するために使用するblock_hash を作成します。ここで hashlib が役に立ちます。カスタム ハッシュ関数を作成する代わりに、事前に構築されたsha256 を使用して不変ブロックを作成できます。

この関数は、エンコードされた文字列 (またはバイト) をパラメータとして受け取ります。そのため、 block_data.encode()メソッドを使用しています。その後、 hexdigest()を呼び出して、エンコードされたデータを 16 進形式に返します。

これらすべてを行うのは大変なことだと思いますので、Python シェルで hashlib を使ってみましょう。

 In [1]: import hashlib

In [2]: message = "Python is great"

In [3]: h1 = hashlib.sha256(message.encode())

In [4]: h1
Out[4]: <sha256 ... object @ 0x7efcd55bfbf0>

In [5]: h1.hexdigest()
Out[5]: 'a40cf9cca ... 42ab97'

In [6]: h2 = hashlib.sha256(b"Python is not great")

In [7]: h2
Out[7]: <sha256 ... object @ 0x7efcd55bfc90>

In [8]: h2.hexdigest()
Out[8]: 'fefe510a6a ... 97e010c0ea34'

ご覧のとおり、「Python は素晴らしい」から「Python は良くない」などの入力をわずかに変更すると、まったく異なるハッシュが生成される可能性があります。これはすべて、ブロックチェーンの整合性に関係します。ブロックチェーンに小さな変更を導入すると、そのハッシュは劇的に変化します。これが、「ブロックチェーンを破損させることはできない」という格言が真実である理由です。

Block クラスの使用

Blockchain クラス全体を後で構築しますが、ここでは、Block クラスを使用してブロックのチェーン (Blockchain) を作成しましょう。

同じファイル内に、変数に格納された単純な文字列で構成されるトランザクションをいくつか作成します。次に例を示します。

 class GeekCoinBlock:
    ...

t1 = "Noah sends 5 GC to Mark"
t2 = "Mark sends 2.3 GC to James"
t3 = "James sends 4.2 GC to Alisson"
t4 = "Alisson sends 1.1 GC to Noah"

もちろんGCとはGeekCoinのことです

次に、GeekCoinBlock クラスを使用してブロックチェーンの最初のブロックを構築し、その属性を出力します。ジェネシスブロック(他のブロックに先行する最初のブロック)のprevious_hashパラメータは常に任意の文字列またはハッシュ(この場合は「firstblock」)であることを考慮してください。

 block1 = GeekCoinBlock('firstblock', [t1, t2])

print(f"Block 1 data: {block1.block_data}")
print(f"Block 1 hash: {block1.block_hash}")

次に、2 番目のブロックでも同じことを行いますが、最初のブロックのハッシュをprevious_hash引数として渡します。

 block2 = GeekCoinBlock(block1.block_hash, [t3, t4])

print(f"Block 2 data: {block2.block_data}")
print(f"Block 2 hash: {block2.block_hash}")

このコード部分から得られる出力を実行して分析してみましょう。もう一度、ターミナルを入力します。

 ❯ python main.py
Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock
Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d
Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d
Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8

今のところ、テキストといくつかの 64 文字のハッシュのみが表示されますが、これによりブロックチェーンのメカニズムがほぼ再現されます。

他のすべてのブロックの基礎となるジェネシス ブロックから始めます。

誰でもチェーンの整合性を検証できるため、ブロックチェーンは非常に安全なシステムです。たとえば、トランザクションの内容を少し変更すると、次のようになります。

 t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James" 

ブロックのハッシュに劇的な変化が見られます。

 Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock
Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c
Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c
Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0ac

現在のプロジェクトは、このGitHub リポジトリで確認できます。

ブロックチェーンのコーディング

手動でコード化された変数に基づいてシステムの整合性を確立するのはそれほど賢明ではないため、別のアプローチが必要です。

ブロックはあります。それらをブロックチェーンに結合するクラスを構築するときが来ました。

まず、以前のトランザクションとブロック オブジェクトを削除してから、以下のコードを使用しましょう。

 # main.py

class Blockchain:
    def __init__(self):
        self.chain = []
        self.generate_genesis_block()

    def generate_genesis_block(self):
        self.chain.append(GeekCoinBlock("0", ['Genesis Block']))
    
    def create_block_from_transaction(self, transaction_list):
        previous_block_hash = self.last_block.block_hash
        self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list))

    def display_chain(self):
        for i in range(len(self.chain)):
            print(f"Data {i + 1}: {self.chain[i].block_data}")
            print(f"Hash {i + 1}: {self.chain[i].block_hash}\n")

    @property
    def last_block(self):
        return self.chain[-1]

これもまた巨大なコードです。各部分を分解してみましょう。

  • self.chain — すべてのブロックが記録されるリスト。リストインデックスを介して各ブロックにアクセスできます。
  • generate_genesis_block — ジェネシスまたは最初のブロックをチェーンに追加します。ブロックの前のハッシュは「0」であり、トランザクションのリストは単純に「Genesis Block」です。
  • create_block_from_transaction — これにより、トランザクションのリストだけを使用してチェーンにブロックを追加できます。トランザクションを記録するたびに手動でブロックを作成するのは非常に面倒です。
  • display_chain — for ループを使用してブロックのチェーンを出力します。
  • last_block — チェーンの最後の要素にアクセスできるようにするプロパティ。これをcreate_block_from_transactionメソッドで使用しました。

このブロックチェーンをテストしてみましょう。

 # main.py

import hashlib

class GeekCoinBlock:
    ...


class Blockchain:
    ...

t1 = "George sends 3.1 GC to Joe"
t2 = "Joe sends 2.5 GC to Adam"
t3 = "Adam sends 1.2 GC to Bob"
t4 = "Bob sends 0.5 GC to Charlie"
t5 = "Charlie sends 0.2 GC to David"
t6 = "David sends 0.1 GC to Eric"

myblockchain = Blockchain()

myblockchain.create_block_from_transaction([t1, t2])
myblockchain.create_block_from_transaction([t3, t4])
myblockchain.create_block_from_transaction([t5, t6])

myblockchain.display_chain()

次に、 main.pyファイルを実行します。

 Data 1: Genesis Block - 0
Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e

Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e
Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5

Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5
Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589

Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589
Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929

おめでとう! 🙌 シンプルな Python ブロックチェーンを最初から作成しました。

ゲッターとセッターを使用してブロックチェーンの不変性を強化し、プルーフ・オブ・ワーク、マイニング、またはビットコイン・マイニングの基礎記事で説明したその他の概念などの他の機能を実装できるようになりました。

結論

ブロックチェーンは、ビットコイン、イーサリアム、その他あらゆる暗号通貨の背後にあるテクノロジーです。この記事では、 sha256 、クラス、オブジェクトなどのハッシュ アルゴリズムを使用して、Python でブロックチェーンを作成する方法を学びました。

あなたの課題は、マイニング システムを作成することです。Django や Flask などのフレームワークを使用して、REST API でそれを実装してみませんか。

多くの人が仮想通貨で富を築いています。自分で作成したら何ができるか想像してみてください。 🤑

コーディングを続けましょう! 👨‍💻

「 Python でブロックチェーンを作成するには?」についてわかりやすく解説!絶対に観るべきベスト2動画

【Python + ブロックチェーン】#2 ブロックチェーンエンジニアの求人とブロックチェーンを採用する大企業の状況
【Python + ブロックチェーン】#5 開発準備

Share via
Copy link