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+selenium实现登录账户后自动点击的示例
Dec 22 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
python写入并获取剪切板内容的实例
May 31 Python
Python读取mat文件,并转为csv文件的实例
Jul 04 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
python开发入门——列表生成式
Sep 03 Python
python实现逻辑回归的示例
Oct 09 Python
基于django和dropzone.js实现上传文件
Nov 24 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
php 魔术方法使用说明
2009/10/20 PHP
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
python hook监听事件详解
2018/10/25 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
python logging设置level失败的解决方法
2020/02/19 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
C#的几个面试问题
2016/05/22 面试题
教育专业个人求职信
2013/12/02 职场文书
暑期社会实践方案
2014/02/05 职场文书
秋季运动会广播稿大全
2014/02/17 职场文书
法人代表委托书
2014/04/04 职场文书
行政内勤岗位职责
2014/04/07 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
奶茶店创业计划书
2014/08/14 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
公司租房协议书
2014/10/14 职场文书
教师节祝酒词
2015/08/11 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server