手把手教你用Python实现区块链

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DanielDingshengli/article/details/86379280

手把手教你用Python实现区块链


本博客适合对区块链概念有所了解的


极简区块链

看图

在这里插入图片描述
在这里插入图片描述

代码框架

import hashlib  //哈希运算库
import datetime

class DingDingBlock():
    def __init__(self, index, timestamp, data, last_hash): //四要素
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.last_hash = last_hash
        self.hash = self.hash_DingDing()

    def hash_DingDing(self):
         pass
    def validate(self):
         pass

def create_first_DingDingBlock()://创世区块
    return DingDingBlock(0, datetime.datetime.now(), "荆轲刺秦王", "0")

def create_DingDingBlock(last_block)://后续区块
   pass

//检测

哈希

    def hash_DingDing(self):
        sha = hashlib.sha256()   
        datastr = str(self.index) + str(self.timestamp) + str(self.data) +str(self.last_hash)
        sha.update(datastr.encode("utf-8"))    
        return sha.hexdigest()

开始

def create_first_DingDingBlock():
    return DingDingBlock(0, datetime.datetime.now(), "荆轲刺秦王", "0")

def create_DingDingBlock(last_block):
    this_index = last_block.index + 1
    this_timestamp = datetime.datetime.now()
    this_data = "穿山甲说"+str(this_index)
    this_last_hash = last_block.hash
    return DingDingBlock(this_index, this_timestamp,  this_data, this_last_hash)

DingDingBlockChain = [create_first_DingDingBlock()]
head_block = DingDingBlockChain[0]
 print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)
for i in range(88):
    DingDingBlock_add = create_DingDingBlock(head_block)
    DingDingBlockChain.append(DingDingBlock_add)
    head_block = DingDingBlock_add
     print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)

输出:
在这里插入图片描述

区块检测

import hashlib
import datetime

class DingDingBlock():
    def __init__(self, index, timestamp, data, last_hash):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.last_hash = last_hash
        self.hash = self.hash_DingDing()

    def hash_DingDing(self):
        sha = hashlib.sha256()
        datastr = str(self.index) + str(self.timestamp) + str(self.data) +str(self.last_hash)
        sha.update(datastr.encode("utf-8"))
        return sha.hexdigest()

    def validate(self):
        if self.hash != self.hash_DingDing():
            print("**区块{}被修改**\n".format(self.index))

def create_first_DingDingBlock():
    return DingDingBlock(0, datetime.datetime.now(), "荆轲刺秦王", "0")

def create_DingDingBlock(last_block):
    this_index = last_block.index + 1
    this_timestamp = datetime.datetime.now()
    this_data = "穿山甲说"+str(this_index)
    this_last_hash = last_block.hash
    return DingDingBlock(this_index, this_timestamp,  this_data, this_last_hash)

DingDingBlockChain = [create_first_DingDingBlock()]
head_block = DingDingBlockChain[0]
# print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)
for i in range(88):
    DingDingBlock_add = create_DingDingBlock(head_block)
    DingDingBlockChain.append(DingDingBlock_add)
    head_block = DingDingBlock_add
    # print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)

#检测错误
DingDingBlockChain[10].data = "穿山甲死了"

for i in range(89):
    DingDingBlockChain[i].validate()

结果:
在这里插入图片描述

更完善的检测

DingDingBlockChain[10].data = "穿山甲死了"
DingDingBlockChain[10].hash =  DingDingBlockChain[10].hash_DingDing()

def validate():
    for i ,block in enumerate(DingDingBlockChain):
        DingDingBlockChain[i].validate()
        if  DingDingBlockChain[i-1].hash_DingDing() != DingDingBlockChain[i].last_hash:
            print("检测出错误区块{}".format(i-1))

if __name__ == "__main__":
    validate()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/DanielDingshengli/article/details/86379280