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抓taobao图片爬虫
Oct 26 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
python SVD压缩图像的实现代码
Nov 05 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 Python
python实现简易自习室座位预约系统
Jun 30 Python
python缺失值填充方法示例代码
Dec 24 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微信支付之APP支付方法
2015/03/04 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
js加强的经典分页实例
2013/03/15 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
python处理二进制数据的方法
2015/06/03 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
利用python求积分的实例
2019/07/03 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
石油工程专业毕业生求职信
2014/04/13 职场文书
运动会口号8字
2014/06/07 职场文书
节约能源标语
2014/06/17 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
详解Oracle块修改跟踪功能
2021/11/07 Oracle