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之坑爹的字符编码
Sep 28 Python
python数组复制拷贝的实现方法
Jun 09 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 Python
理解python中生成器用法
Dec 20 Python
轻松实现TensorFlow微信跳一跳的AI
Jan 05 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
python 串行执行和并行执行实例
Apr 30 Python
Python实现一个优先级队列的方法
Jul 31 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
探讨如何把session存入数据库
2013/06/07 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
vue生命周期的探索
2019/04/03 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
Python内置函数delattr的具体用法
2017/11/23 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python 不以科学计数法输出的方法
2018/07/16 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
十佳大学生村官事迹
2014/01/09 职场文书
小学语文课后反思精选
2014/04/25 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
毕业生面试求职信
2014/06/23 职场文书
考研英语辞职信
2015/05/13 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
幽默导游词开场白
2015/05/29 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang