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将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
Python实现动态图解析、合成与倒放
Jan 18 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
pytorch索引查找 index_select的例子
Aug 18 Python
python函数修饰符@的使用方法解析
Sep 02 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
Apr 23 Python
python 如何设置守护进程
Oct 29 Python
python如何获取网络数据
Apr 11 Python
浅谈python中的多态
Jun 15 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中常用的预定义变量小结
2012/05/09 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
PHP四大安全策略
2014/03/12 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
jQuery表格插件datatables用法总结
2014/09/05 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python字典简介以及用法详解
2016/11/15 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
python从PDF中提取数据的示例
2020/10/30 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
优秀毕业自我鉴定
2014/02/15 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
Python基础知识之变量的详解
2021/04/14 Python
详解python的内存分配机制
2021/05/10 Python
深入理解Vue的数据响应式
2021/05/15 Vue.js
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA
nginx搭建NFS网络文件系统
2022/04/14 Servers
浅谈Redis缓冲区机制
2022/06/05 Redis