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读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
python的else子句使用指南
Feb 27 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
python实现电子产品商店
Feb 26 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
python实现简单区块链结构
Apr 25 Python
Python 中的 copy()和deepcopy()
Nov 07 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设计模式之代理模式的深入解析
2013/06/13 PHP
PHP实现的简单日历类
2014/11/29 PHP
php intval函数用法总结
2019/04/14 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
JS实现放大镜效果
2020/09/21 Javascript
Python微信库:itchat的用法详解
2017/08/14 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
面试自我介绍演讲稿
2014/04/29 职场文书
海洋科学专业求职信
2014/08/10 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
摩登时代观后感
2015/06/03 职场文书
仓库管理制度范本
2015/08/04 职场文书
Python类方法总结讲解
2021/07/26 Python