区块链的简单实现
最近在学习区块链的相关知识,在懂得原理后通过编程实现了一个简单的区块链程序,希望对以后的学习有所增益,在这里要感谢B站UP主"是落拓呀"的对于区块链的详细讲解,下面附上相关Python代码。
import hashlib
import json
from typing import Text
# 区块
class Block:
def __init__(self, data, previousHash):
self.__data = data
self.__previousHash = previousHash
self.__hash = self.compute_hash()
def compute_hash(self):
s = hashlib.sha256()
s.update(str(self.__data + self.__previousHash).encode('utf-8'))
return s.hexdigest()
def set_hash(self, value):
self.__hash = value
def get_hash(self):
return self.__hash
def set_data(self, value):
self.__data = value
def get_data(self):
return self.__data
def set_previousHash(self, value):
self.__previousHash = value
def get_previousHash(self):
return self.__previousHash
def get_all(self):
tmp = {'data': self.__data, 'previousHash': self.__previousHash, 'hash': self.__hash}
return tmp
# 链
# 生成祖先区块
class Chain:
def __init__(self):
self.__chain = [self.big_bang()]
def big_bang(self):
genesis_block = Block('我是祖先', '')
return genesis_block
def get_latest_block(self):
return self.__chain[len(self.__chain) - 1]
# 添加区块到区块链上
def add_block_to_chain(self, new_block):
# data
# 找到最近一个block的hash
# 这个hash就是新区块的precviousHash
new_block.set_previousHash(self.get_latest_block().get_hash())
new_block.set_hash(new_block.compute_hash())
self.__chain.append(new_block)
def get_chain(self):
return self.__chain
def chain_list(self):
for i in self.__chain:
print(i.get_all())
# 验证这个当前的区块链是否合法
# 当前数据有没有被修改
# 验证区块的previous是否等于previous区块的hash
def validateChain(self):
if len(self.__chain) == 1:
s = hashlib.sha256()
s.update(self.__chain[0].get_data().encode('utf-8'))
if self.__chain[0].get_hash() != s.hexdigest():
return False
return True
# 从第二个区块开始验证
for i in range(1, len(self.__chain)):
s = hashlib.sha256()
block_to_validate = self.__chain[i]
# 当前数据有没有被篡改
s.update((block_to_validate.get_data() + block_to_validate.get_previousHash()).encode('utf-8'))
get_hash = block_to_validate.get_hash()
hexdigest = s.hexdigest()
if block_to_validate.get_hash() != s.hexdigest():
print('数据篡改')
return False
# 验证区块间是否被篡改
previous_block = self.__chain[i - 1]
if block_to_validate.get_previousHash() != previous_block.get_hash():
print('前后区块链接断裂')
return False
return True
if __name__ == '__main__':
c1 = Chain()
b1 = Block("转账十元", "")
c1.add_block_to_chain(b1)
b2 = Block("转账一百元", "")
b3 = Block("转账二百元", "")
b4 = Block("转账三百元", "")
b5 = Block("转账四百元", "")
b6 = Block("转账五百元", "")
b7 = Block("转账六百元", "")
c1.add_block_to_chain(b2)
c1.add_block_to_chain(b3)
c1.add_block_to_chain(b4)
c1.add_block_to_chain(b5)
c1.add_block_to_chain(b6)
c1.add_block_to_chain(b7)
c1.chain_list()
print(c1.validateChain())
# 尝试篡改这个区块链
c1.get_chain()[2].set_data('转账一百个十元')
c1.get_chain()[2].set_hash(c1.get_chain()[2].compute_hash())
print(c1.validateChain())
人生就是在学习中成长,每天坚持学习,把所学的知识记录下来,坚持学习,收获更多的知识;感谢生活中每一个遇到的人,使他们给了你前进的动力。