Python爱上区块链之[新手篇]

# -*- 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()

    """挖掘和创建更多节点"""
    # 后续补充更新···

猜你喜欢

转载自blog.csdn.net/qq_42183962/article/details/81745823
今日推荐