目次
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 を入力してメッセージを追加します。ブロックチェーン上のコンテンツを表示し、任意の数字を入力します。プログラムを閉じてチェーンを破壊します。