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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
flask session组件的使用示例
Dec 25 Python
python算法题 链表反转详解
Jul 02 Python
python实现图片上添加图片
Nov 26 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
PyQt5 界面显示无响应的实现
Mar 26 Python
Django celery异步任务实现代码示例
Nov 26 Python
python简单验证码识别的实现过程
Jun 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下实现折线图效果的代码
2007/04/28 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
轻松实现php文件上传功能
2017/02/17 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
pygame实现五子棋游戏
2019/10/29 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
自愿离婚协议书范本
2015/01/26 职场文书
整改通知书格式
2015/04/22 职场文书
车间班组长竞聘书
2015/09/15 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
redis protocol通信协议及使用详解
2022/07/15 Redis