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的线程来解决生产者消费问题的示例
Apr 02 Python
python+pyqt实现右下角弹出框
Oct 26 Python
对python实现合并两个排序链表的方法详解
Jan 23 Python
python实现LRU热点缓存及原理
Oct 29 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
Python中关于logging模块的学习笔记
Jun 03 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
Python类成员继承重写的实现
Sep 16 Python
python修改微信和支付宝步数的示例代码
Oct 12 Python
python 提取html文本的方法
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 正则表达式小结
2009/08/31 PHP
PHP eval函数使用介绍
2013/12/08 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
python3操作mysql数据库的方法
2017/06/23 Python
Python 闭包的使用方法
2017/09/07 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
高中体育教学反思
2014/01/24 职场文书
幼儿老师求职信
2014/06/30 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
导游词之西递宏村
2019/12/10 职场文书