Python を使用して単純なブロックチェーンを構築し、データをチェーンにアップロードする

目次

1. ライブラリファイルをインポートする

2. メッセージクラスの書き込み

3. ライトブロッククラス

4. ブロックチェーンの作成

5. main関数を書く

6. 操作


1. ライブラリファイルをインポートする

必要なライブラリ ファイルを導入します。そのコア ファイルは hashlib です。

import datetime
import hashlib
import time

2. メッセージクラスの書き込み

メッセージ クラスを記述することにより、メッセージが読み込まれ、ハッシュされ、前のメッセージと接続されます。

class Message:
    def __init__(self, data):
        self.hash = None
        self.prev_hash = None
        self.timestamp = time.time()
        self.size = len(data.encode('utf-8'))
        self.data = data
        self.payload_hash = self._hash_payload()

    def _hash_payload(self):
        return hashlib.sha256(bytearray(str(self.timestamp) + str(self.data), "utf-8")).hexdigest()

    def _hash_message(self):
        return hashlib.sha256(bytearray(str(self.prev_hash) + self.payload_hash, "utf-8")).hexdigest()

    def link(self, message):
        """ 通过哈希将消息连接到上一条消息 """
        self.prev_hash = message.hash

    def seal(self):
        """ 获取消息哈希 """
        self.hash = self._hash_message()

3. ライトブロッククラス

ブロッククラスを記述することで、前のブロックのハッシュ値やタイムスタンプなどのメッセージを利用してブロック間を接続します。

class Block:
    def __init__(self, *args):
        self.messages = []
        self.timestamp = None
        self.prev_hash = None
        self.hash = None
        if args:
            for arg in args:
                self.add_message(arg)

    def _hash_block(self):
        return hashlib.sha256(
            bytearray(str(self.prev_hash) + str(self.timestamp) + self.messages[-1].hash, "utf-8")).hexdigest()

    def add_message(self, message):
        if len(self.messages) > 0:
            message.link(self.messages[-1])
        message.seal()
        self.messages.append(message)

    def link(self, block):
        self.prev_hash = block.hash

    def seal(self):
        self.timestamp = time.time()
        self.hash = self._hash_block()

    def __repr__(self):
        return '<hash: {}, prev_hash: {}, messages: {}, time: {}>'.format(
            self.hash, self.prev_hash, len(self.messages), self.timestamp
        )

4. ブロックチェーンの作成

ブロックチェーンを書き込み、ブロックをチェーンに追加する操作を完了します。

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

    def add_block(self, block):
        """ Add a block if valid."""
        if len(self.chain) > 0:
            block.prev_hash = self.chain[-1].hash
        block.seal()
        self.chain.append(block)

5. main関数を書く

[印刷] メニューで 1 を入力し、メッセージの内容を現在のブロックに追加します。2 を入力して、現在のブロックをチェーンにアップロードします。ブロックチェーン上のブロックを表示するには、「3」を入力します。他の文字を入力してブロックチェーンを終了し、プログラムを閉じます。

def manager():
    chain = SimpleChain()
    block = Block()
    msg = """
		Action set:
			- 向当前块中添加消息	    (1)
			- 将当前块添加到链		(2)
			- 查看整条链上的块		(3)
			- 终止程序并删除链		(0)
		"""
    print(msg)
    while True:
        print()

        decide = input("Your action: ")

        if decide == "1":
            file = input("请输入文件名")
            datafile = open(file, 'rb').read()
            data = datafile.decode()
            block.add_message(Message(data))
            print("消息添加成功")
        elif decide == "2":
            if len(block.messages) > 0:
                chain.add_block(block)
                block = Block()
                print("区块上链成功")
            else:
                print("当前块为空,无法上链。")
        elif decide == "3":
            n = 0
            for b in chain.chain:
                print("Block", n)
                print(b)
                print("--------------------------------------------------------------------------------------------")
                n = n+1
        else:
            break

6. 操作

if __name__ == "__main__":
    manager()

プログラムを実行し、チェーンにアップロードするコンテンツを py ファイルと同じディレクトリに置きます。1 を入力し、ファイル名を入力してブロックにメッセージを追加します。2 を入力してブロックをチェーンにアップロードし、3 を入力してメッセージを追加します。ブロックチェーン上のコンテンツを表示し、任意の数字を入力します。プログラムを閉じてチェーンを破壊します。

おすすめ

転載: blog.csdn.net/SAGIRIsagiri/article/details/124727276