python实现简单区块链结构


Posted in Python onApril 25, 2021

区块链

比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链。

从技术上来看:区块是一种记录交易的数据结构,反映了一笔交易的资金流向。系统中已经达成的交易的区块连接在一起形成了一条主链,所有参与计算的节点都记录了主链或主链的一部分。

python实现简单区块链结构

一、比特币内部结构

比特币内部结构有四部分:

  1. previous hash: 上一个区块的hash
  2. data:交易数据
  3. time stamp:区块生成的时间戳
  4. nonce:挖矿计算次数

二、实现的比特币结构

  1. index :当前区块索引
  2. timestamp :该区块创建时的时间戳
  3. data :交易信息
  4. previous hash: 前一个区块的hash
  5. hash: 当前区块的hash
  6. nonce : 挖矿计算次数

注意:当前实现了一个简单的区块链结构,并不完整。

三、代码实现

1.定义区块的结构

代码如下:

"""
区块设计
"""
import time
import hashlib

class Block:
    # 初始化一个区块
    def __init__(self,previous_hash,data):
        self.index = 0
        self.nonce = ''
        self.previous_hash = previous_hash
        self.time_stamp = time.time()
        self.data = data
        self.hash = self.get_hash()
    # 获取区块的hash
    def get_hash(self):
        msg = hashlib.sha256()
        msg.update(str(self.previous_hash).encode('utf-8'))
        msg.update(str(self.data).encode('utf-8'))
        msg.update(str(self.time_stamp).encode('utf-8'))
        msg.update(str(self.index).encode('utf-8'))
        return msg.hexdigest()
    # 修改区块的hash值
    def set_hash(self,hash):
        self.hash = hash

2.创世区块构造

创世区块:没有前一个区块,这里的previous_hashdata是自己写死的。

# 生成创世区块,这是第一个区块,没有前一个区块
def creat_genesis_block():
    block = Block(previous_hash= '0000',data='Genesis block')
    nonce,digest = mime(block=block)
    block.nonce = nonce
    block.set_hash(digest)
    return block

这里的mime()函数是后面的挖矿函数.

3.挖矿函数定义

代码如下:

def mime(block):
    """
    挖矿函数——更新区块结构,加入nonce值
        block:挖矿区块
    """
    i = 0
    prefix = '0000'
    while True:
        nonce = str(i)
        msg = hashlib.sha256()
        msg.update(str(block.previous_hash).encode('utf-8'))
        msg.update(str(block.data).encode('utf-8'))
        msg.update(str(block.time_stamp).encode('utf-8'))
        msg.update(str(block.index).encode('utf-8'))
        msg.update(nonce.encode('utf-8'))
        digest = msg.hexdigest()
        if digest.startswith(prefix):
            return nonce,digest
        i+=1

4.定义区块链结构

代码如下:

"""
区块链设计
"""
from Block import *
# 区块链
class BlockChain:
    def __init__(self):
        self.blocks = [creat_genesis_block()]
    # 添加区块到区块链上
    def add_block(self,data):
        pre_block = self.blocks[len(self.blocks)-1]
        new_block = Block(pre_block.hash,data)
        new_block.index = len(self.blocks)
        nonce,digest = mime(block=new_block)
        new_block.nonce = nonce
        new_block.set_hash(digest)
        self.blocks.append(new_block)
        return new_block

在添加新区块到区块链时,先挖矿在将新区块加入区块链。

四、代码运行

测试代码:

from BlockChain import *
# 创建一个区块链
bc = BlockChain()
# 添加区块
bc.add_block(data='second block')
bc.add_block(data='third block')
bc.add_block(data='fourth block')
for bl in bc.blocks:
    print("Index:{}".format(bl.index))
    print("Nonce:{}".format(bl.nonce))
    print("Hash:{}".format(bl.hash))
    print("Pre_Hash:{}".format(bl.previous_hash))
    print("Time:{}".format(bl.time_stamp))
    print("Data:{}".format(bl.data))
    print('\n')

运行结果:

python实现简单区块链结构

这里添加了4个区块(包括创世区块),处了创世区块,每个区块的pre_hash都与前一个区块的hash值相等,这代表区块没有被篡改,数据有效。

到此这篇关于python实现简单区块链结构的文章就介绍到这了,更多相关python区块链结构内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python读写文件方法总结
Jun 09 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
Numpy掩码式数组详解
Apr 17 Python
python之消除前缀重命名的方法
Oct 21 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
Python分支语句与循环语句应用实例分析
May 07 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
基于python调用jenkins-cli实现快速发布
Aug 14 Python
python实现图片九宫格分割的示例
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 #Python
浅谈Python项目的服务器部署
Apr 25 #Python
Python Socket编程详解
Apr 25 #Python
Python Django 后台管理之后台模型属性详解
如何用python反转图片,视频
python基于tkinter制作m3u8视频下载工具
You might like
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
一个比较不错的PHP日历类分享
2014/11/18 PHP
看了就知道什么是JSON
2007/12/09 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
python3 re返回形式总结
2020/11/20 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
班组长安全生产职责
2013/12/16 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
企业党员个人自我评价
2014/09/20 职场文书
2014年除四害工作总结
2014/12/06 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
MySQL分库分表详情
2021/09/25 MySQL
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技