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实现PS滤镜功能之波浪特效示例
Jan 26 Python
python os用法总结
Jun 08 Python
Python爬取qq空间说说的实例代码
Aug 17 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
对python3中, print横向输出的方法详解
Jan 28 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
python实现图片横向和纵向拼接
Mar 05 Python
Django自关联实现多级联动查询实例
May 19 Python
python中常用的数据结构介绍
Jan 12 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
Mar 04 Python
解决python3安装pandas出错的问题
May 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下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
CI框架的安全性分析
2016/05/18 PHP
php的常量和变量实例详解
2017/06/27 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
如何在父窗口中得知window.open()出的子窗口关闭事件
2013/10/15 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
浅谈Vue.js
2017/03/02 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
vue实现购物车加减
2020/05/30 Javascript
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
python爬取个性签名的方法
2018/06/17 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
Servlet方面面试题
2016/09/28 面试题
学校运动会开幕演讲稿
2014/01/04 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
2015年大学生工作总结
2015/04/21 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
导游词之青城山景区
2019/09/27 职场文书