# -*- coding: utf-8 -*-
# @Author : TerryJay
# @File : chain.py
# @Software: PyCharm
# @Time : 2018/8/13 21:54
# I believe that the God rewards the diligent.
import hashlib
import time
import copy
class block_module:
def __init__(self, **param):
self._Prev_Hash = None
self.Temporary_Random = param['Temp_Random']
self.Block_Index = param['Block_Index']
self.Block_Data = param['Block_Data']
self.Block_Hash = None
self.Block_Generation_Time = param['Block_Generation_Time']
def calculation_this_block_hash(self):
"""
:parameter:将初始的5个str合并为一个str
:return:计算出一个256位hash值,字节数为 256/8 = 32 个
"""
custom_sha256 = hashlib.sha256()
# ss << _nIndex << _tTime << _sData << _nNonce << sPrevHash;
content = str(self.Temporary_Random) + str(self.Block_Data) + str(self.Block_Index) + str(
self.Block_Generation_Time) + str(self._Prev_Hash)
custom_sha256.update(content.encode("utf8"))
return custom_sha256.hexdigest()
# 挖矿函数
def mine_block(self, difficulty=20):
terry_str = str(difficulty + 1)
terry_list = list(terry_str)
for i in range(len(terry_list)):
terry_list[i] = "0"
update_terry_str = ''.join(terry_list)
while True:
self.Temporary_Random += 1
self.Block_Hash = self.calculation_this_block_hash()
print("temp哈希值为:", self.Block_Hash)
print("校验目标值为:", update_terry_str[0:difficulty])
# time.sleep(1)
if update_terry_str[0:difficulty] in self.Block_Hash:
break
else:
pass
print("===============================恭喜你挖到一个区块=================================")
print("该区块的hash为:", self.Block_Hash)
print("================================================================================")
# return self.Block_Hash
def get_this_block_hash(self):
return self.Block_Hash
class block_chain:
def __init__(self, **param):
self.param = param
self.chain = list()
# self.other_node = None
def __get_last_node_block(self):
if self.chain:
# 返回末尾节点块
return self.chain[len(self.chain)]
else:
print("当前区块链中不存在任何节点,请先初始化创世块后重试~")
# def __create_new_block(self, block_module_cls):
# self.this_block = block_module_cls(self.param)
def add_seed_block_to_chain(self):
"""将创世块挂载到区块链头部"""
__seed_node = self.param
block_class = block_module(**self.param)
"""首次的创世块的Block_Hash直接计算即可,无需调用挖矿函数"""
__seed_node["Block_Hash"] = block_class.calculation_this_block_hash()
self.chain.append(__seed_node)
print("创世块挂载成功!")
print("===============================|_创_世_块_|=================================")
print("创世块的hash:", __seed_node["Block_Hash"])
print("创世块挖掘难度:", __seed_node["Mine_Difficulty"])
print("创世块奖励币的总数:", __seed_node["Block_panda_coin_reward"])
print("================================================================================")
def add_other_block_to_chain(self):
"""将新区块连接到主链的尾部"""
if self.chain:
block_class = block_module(**self.param)
# b = copy.deepcopy(a)
next_param = copy.deepcopy(self.param)
"""self.param["Mine_Difficulty"]指的是:挖掘难度 """
block_class.mine_block(self.param["Mine_Difficulty"])
# self.chain[len(self.chain)]["Block_Hash"]
"""第二个区块的prev_hash保存的是创世块的Block_Hash值, len(self.chain)-1代表主链中最后一个块的下标"""
block_number = len(self.chain) - 1
next_param["_Prev_Hash"] = self.chain[block_number]["Block_Hash"]
next_param["Block_Generation_Time"] = int(time.time())
next_param["Block_panda_coin_reward"] -= 1
next_param["Block_Index"] = block_number + 1
self.chain.append(next_param)
print("第[%s]个区块成功接入主链!" % len(self.chain))
else:
print("提示:您的主链中不存在任何节点,请先初始化创世块后重试~")
# creation_block:创世块基本配置
class creation_block:
"""
@block_index:当前区块的序号
@user_data:需要用此区块链进行加密传输的信息
@admin_coin_reward:创世块设置的奖励,也可以称为币
"""
def __init__(self, **seed_setting):
self.Block_Data = seed_setting["user_data"]
self.Block_Index = seed_setting["block_index"]
self.Temp_Random = seed_setting["Temp_Random"]
# self.Block_Generation_Time = None
self.Block_panda_coin_reward = seed_setting["admin_coin_reward"]
self.mine_difficulty = seed_setting["diff"]
def rtn_setting(self):
now_time = int(time.time())
print("创世块的创建时间戳是:", now_time, "北京时间:", time.ctime())
"""8个标准参数"""
block = {
"_Prev_Hash": '|_创_世_块_|',
"Block_Index": self.Block_Index,
"Block_Hash": None,
"Block_Generation_Time": now_time,
"Block_Data": self.Block_Data,
"Temp_Random": self.Temp_Random,
"Mine_Difficulty": self.mine_difficulty,
"Block_panda_coin_reward": self.Block_panda_coin_reward
}
return block
# create_seed_block:创世块初始化
class create_seed_block:
def __init__(self):
self.seed = None
def rtn_seed_param(self):
"""创世块的种子配置"""
panda_setting = {
"user_data": "这里是放数据的,它将随着区块链的延伸而进化成分布式储存",
"block_index": 0,
"admin_coin_reward": 100,
"diff": 100000000,
"Temp_Random": 2056985438
}
"""设置创世块,并返回它的全部数据"""
self.seed = creation_block(**panda_setting).rtn_setting()
return self.seed
if __name__ == '__main__':
"""初始化创世块,将它放置在区块链第一个节点"""
seed = create_seed_block()
seed_data = seed.rtn_seed_param()
panda_chain = block_chain(**seed_data)
panda_chain.add_seed_block_to_chain()
"""创建第二个节点"""
panda_chain.add_other_block_to_chain()
"""挖掘和创建更多节点"""
# 后续补充更新···