使用python实现简单的区块链

使用python实现简单的区块链

一条区块链要包含创世区块和后续区块,所有区块由哈希散列函数链接在一起。

所以首先要实现的是创建一个 Block 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import hashlib
import datetime

class Block:
def __init__(self,prev_hash, transaction, timestamp):
self.prev_hash = prev_hash
self.transaction = transaction
self.timestamp = timestamp
self.hash = self.get_hash()

#创建创世区块
@staticmethod
def create_genesis_block():
return Block('0', [], datetime.datetime.now())

def get_hash(self):
head_bin = str(self.prev_hash) + str(self.transaction) + str(self.timestamp)
out_hash = hashlib.sha256(head_bin.encode()).hexdigest()
return out_hash

因为需要用到前一个区块的哈希,交易信息,时间戳三个信息,所以提前定义初始化函数以便使用,同时要包含两个库:hashlibdatatime

将上述三部分拼接在一起后进行 sha256 处理,即可得到 hash

Block 类中有一个操作:创建创世区块。其中上一个区块的哈希:0;没有发生交易:0;时间戳由 datatime 提供

接下来进行主函数的实现,需要导入之前创建好的 Block 模块

1
2
from Block import Block
import datetime

定义创建后续区块的函数,其中接收者、发送者、交易金额都需要自己填写,然后函数会帮助拼接以及后续的运算,最后输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def create_blocks(block_chains,i):
print("Input the transaction information for block {}:".format(i))

input_sender = input("Please input the sender:")
input_receiver = input("Please input the receiver:")
input_amount = input("Please input the amount:")

transaction = {"sender":input_sender,"receiver":input_receiver,"amount":input_amount}

block_chains.append(Block(block_chains[i-1].hash, transaction , datetime.datetime.now()))
# 前一个区块的哈希,交易信息,时间戳
print("Block {} is created, and the transaction is: {} transfer {} BTC to {}".format(i,input_sender,input_amount,input_receiver))
print("The hash of block {} is: {}".format(i,block_chains[i].hash))
i += 1
return block_chains,i

添加一个简单的验证链合法性的函数,函数分成两个循环,一部分是检查每块的哈希是否被修改;另一部分是检查当前的 blockhead 里前一个节点的哈希和前一个区块是否能对的上

1
2
3
4
5
6
7
8
def is_valid(chain):
for i in range(1, len(chain)):
if chain[i].get_hash() == chain[i].hash:
if chain[i].prev_hash != chain[i-1].hash:
return False
else:
return False
return True

创建主函数

1
2
3
4
5
6
7
if __name__ == '__main__':
print("Welcome")
i = 1
block_chains = [Block.create_genesis_block()]
print("Genesis Block is created.Hash is: ",block_chains[0].hash)
while True:
block_chains,i = create_blocks(block_chains,i)

使用python实现简单的区块链
http://example.com/2024/07/11/使用python实现简单的区块链/
作者
Tsglz
发布于
2024年7月11日
许可协议