基于python实现一个简单区块链

单个区块的数据结构
  • index: 区块在区块链中的高度(即序号),因为每加一个区块,该index就会加1。

  • data: 任何需要包括在此区块中的数据。

  • timestamp: 时间戳。(可用来防止攻击等)

  • hash: 根据区块内容计算的哈希值(SHA256)。

  • previousHash: 前一个区块的哈希值。方便回溯前面区块。
    在这里插入图片描述

      此处用到了hashlib中的sha256算法用于生成每个区块的哈希值,来确保区块的唯一性。
    
class Block:
    def __init__(self, index, timestamp, data, previous_hash):
      self.index = index
      self.timestamp = timestamp
      self.data = data
      self.hash = self.calc_hash(data)
      self.previous_hash = previous_hash
      self.next = None

    def calc_hash(self, data):
        hash_str = data.encode('utf-8') 
        sha = hashlib.sha256()
        sha.update(hash_str)
        return sha.hexdigest()
区块链的实现类
主要实现了append用于添加数据,接收一个input作为区块的data
class BlockChain:
    def __init__(self):
        self.head = None
        self.size = 0

    def append(self, value):
        if value is None:
            return

        self.size += 1
        node = self.head
        
        # 区分第一个区块
        if node is None:
            block = Block(0,datetime.datetime.now(), value, None)
            self.head = block
        else:
            while node.next:
                node = node.next
            node.next = Block(node.index+1,datetime.datetime.now(), value, node.hash)
    
    def show(self):
    	# 更直观的显示区块的内容
    	# 为节约篇幅,此处就不放了,文末源码处有
MAIN函数
用于测试代码,直接输入回车即可退出测试。
if __name__ == '__main__':
    blockchain = BlockChain()

    while True:
        mydata  = input("输入区块数据:")
        if mydata == '':
            break
        blockchain.append(mydata)
        blockchain.show()
    print('END')
效果展示
PS E:\WorkSpace\BlockChain> python -u "e:\WorkSpace\BlockChain\python\blockchain.py"
输入区块数据:第一个区块
>> block No: 0
> time: 2021-04-13 14:32:00.962946
> data: 第一个区块
> pre_hash: None
> cur_hash: 328fffe02f9e57c15508352cb145aa68abcf83da69a059e975d2171b1e7f8f92

输入区块数据:测试
>> block No: 1
> time: 2021-04-13 14:32:03.508299
> data: 测试
> pre_hash: 328fffe02f9e57c15508352cb145aa68abcf83da69a059e975d2171b1e7f8f92
> cur_hash: 6aa8f49cc992dfd75a114269ed26de0ad6d4e7d7a70d9c8afb3d7a57a88a73ed

输入区块数据:
END
完整源码
import hashlib
import datetime

class Block:
    def __init__(self, index, timestamp, data, previous_hash):
      self.index = index
      self.timestamp = timestamp
      self.data = data
      self.hash = self.calc_hash(data)
      self.previous_hash = previous_hash
      self.next = None

    def calc_hash(self, data):
        hash_str = data.encode('utf-8')
        sha = hashlib.sha256()
        sha.update(hash_str)
        return sha.hexdigest()


class BlockChain:
    def __init__(self):
        self.head = None
        self.size = 0

    def append(self, value):
        if value is None:
            return

        self.size += 1
        node = self.head
                
        if node is None:
            block = Block(0,datetime.datetime.now(), value, None)
            self.head = block
        else:
            while node.next:
                node = node.next
            node.next = Block(node.index+1,datetime.datetime.now(), value, node.hash)

    def show(self):
        node = self.head
        while node.next:
                node = node.next
                
        print(">> block No: ",end='')
        print(node.index)

        print("> time: ",end='')
        print(node.timestamp)

        print("> data: ",end='')
        print(node.data)
        
        print("> pre_hash: ",end='')
        print(node.previous_hash)
        
        print("> cur_hash: ",end='')
        print(node.hash)

        print()

if __name__ == '__main__':
    blockchain = BlockChain()

    while True:
        mydata  = input("输入区块数据:")
        if mydata == '':
            break
        blockchain.append(mydata)
        blockchain.show()
	print('END')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值