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 正则表达式操作指南
May 04 Python
python访问类中docstring注释的实现方法
May 04 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
python可视化实现KNN算法
Oct 16 Python
Python的几种主动结束程序方式
Nov 22 Python
python正则表达式实例代码
Mar 03 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
Python字典取键、值对的方法步骤
Sep 30 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实现批量查询清除一句话后门的代码
2008/01/20 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
编程语言Python的发展史
2014/09/26 Python
Python中的模块和包概念介绍
2015/04/13 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
瑞士国际航空官网:SWISS
2016/07/21 全球购物
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
师范应届生教师求职信
2013/11/05 职场文书
学生会离职感言
2014/02/11 职场文书
《争吵》教学反思
2014/02/15 职场文书
《赶海》教学反思
2014/04/20 职场文书
社区服务活动小结
2014/07/08 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
初中信息技术教学反思
2016/02/16 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript