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使用xmlrpc实例讲解
Dec 17 Python
python模块之re正则表达式详解
Feb 03 Python
深入浅析python 中的匿名函数
May 21 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
python队列原理及实现方法示例
Nov 27 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
Feb 09 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
jupyter 实现notebook中显示完整的行和列
Apr 09 Python
python之基数排序的实现
Jul 26 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 mkdir()定义和用法
2009/01/14 PHP
解析PHP的session过期设置
2013/06/29 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
vue.js的提示组件
2017/03/02 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
基于Python的文件类型和字符串详解
2017/12/21 Python
django文档学习之applications使用详解
2018/01/29 Python
Python 字符串换行的多种方式
2018/09/06 Python
python使用matplotlib画饼状图
2018/09/25 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
详解python with 上下文管理器
2020/09/02 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
加工操作管理制度
2014/01/19 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
关于感谢信的范文
2015/01/23 职场文书
自荐信格式模板
2015/03/27 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android