返回顶部
首页 > 资讯 > 后端开发 > Python >python区块链如何实现简版工作量证明
  • 200
分享到

python区块链如何实现简版工作量证明

2023-06-30 16:06:24 200人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容主要讲解“python区块链如何实现简版工作量证明”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python区块链如何实现简版工作量证明”吧!工作量证明区块链的一个关键点就是,一个人必须

本篇内容主要讲解“python区块链如何实现简版工作量证明”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Python区块链如何实现简版工作量证明”吧!

工作量证明

区块链的一个关键点就是,一个人必须经过一系列困难的工作,才能将数据放入到区块链中。正是由于这种困难的工作,才保证了区块链的安全和一致。此外,完成这个工作的人,也会获得相应奖励(这也就是通过挖矿获得币)。

这个机制与生活现象非常类似:一个人必须通过努力工作,才能够获得回报或者奖励,用以支撑他们的生活。在区块链中,是通过网络中的参与者(矿工)不断的工作来支撑起了整个网络。矿工不断地向区块链中加入新块,然后获得相应的奖励。在这种机制的作用下,新生成的区块能够被安全地加入到区块链中,它维护了整个区块链数据库的稳定性。值得注意的是,完成了这个工作的人必须要证明这一点,即他必须要证明他的确完成了这些工作。

整个 “努力工作并进行证明” 的机制,就叫做工作量证明(proof-of-work)。要想完成工作非常地不容易,因为这需要大量的计算能力:即便是高性能计算机,也无法在短时间内快速完成。另外,这个工作的困难度会随着时间不断增长,以保持每 10 分钟出 1 个新块的速度。在比特币中,这个工作就是找到一个块的哈希,同时这个哈希满足了一些必要条件。这个哈希,也就充当了证明的角色。因此,寻求证明(寻找有效哈希),就是矿工实际要做的事情。

哈希计算

获得指定数据的一个哈希值的过程,就叫做哈希计算。一个哈希,就是对所计算数据的一个唯一表示。对于一个哈希函数,输入任意大小的数据,它会输出一个固定大小的哈希值。下面是哈希的几个关键特性:

  • 无法从一个哈希值恢复原始数据。也就是说,哈希并不是加密。

  • 对于特定的数据,只能有一个哈希,并且这个哈希是唯一的。

  • 即使是仅仅改变输入数据中的一个字节,也会导致输出一个完全不同的哈希。

本质上哈希是一个摘要算法

哈希函数被广泛用于检测数据的一致性。软件提供者常常在除了提供软件包以外,还会发布校验和。当下载完一个文件以后,你可以用哈希函数对下载好的文件计算一个哈希,并与作者提供的哈希进行比较,以此来保证文件下载的完整性。

在区块链中,哈希被用于保证一个块的一致性。哈希算法的输入数据包含了前一个块的哈希,因此使得不太可能(或者,至少很困难)去修改链中的一个块:因为如果一个人想要修改前面一个块的哈希,那么他必须要重新计算这个块以及后面所有块的哈希。

Hashcash

比特币使用 Hashcash ,一个最初用来防止垃圾邮件的工作量证明算法。它可以被分解为以下步骤:

取一些公开的数据(比如,如果是 email 的话,它可以是接收者的邮件地址;在比特币中,它是区块头)

给这个公开数据添加一个计数器。计数器默认从 0 开始

将 data(数据) 和 counter(计数器) 组合到一起,获得一个哈希

检查哈希是否符合一定的条件:

  • 如果符合条件,结束

  • 如果不符合,增加计数器,重复步骤 3-4

因此,这是一个暴力算法:改变计数器,计算新的哈希,检查,增加计数器,计算哈希,检查,如此往复。这也是为什么说它的计算成本很高,因为这一步需要如此反复不断地计算和检查。

现在,让我们来仔细看一下一个哈希要满足的必要条件。在原始的 Hashcash 实现中,它的要求是 “一个哈希的前 20 位必须是 0”。在比特币中,这个要求会随着时间而不断变化。因为按照设计,必须保证每 10 分钟生成一个块,而不论计算能力会随着时间增长,或者是会有越来越多的矿工进入网络,所以需要动态调整这个必要条件。

为了阐释这一算法,我从前一个例子(“I like donuts”)中取得数据,并且找到了一个前 3 个字节是全是 0 的哈希。

实现

这里我们实现一个简易的区块链,就不动态调节难度了,使用固定的难度。

class ProofOfWork(object):    """    pow     """    _N_BITS = 16    MAX_BITS = 256    MAX_SIZE = sys.maxsize    def __init__(self, block, n_bits=_N_BITS):        self._n_bits = n_bits        self._target_bits = 1 << (self.MAX_BITS - n_bits)        self._block = block

这里的_n_bits就是难度值。 在比特币中,当一个块被挖出来以后,“n_bits” 代表了区块头里存储的难度,也就是开头有多少个 0。这里的 16 指的是算出来的哈希前 16 位必须是 0,如果用 16 进制表示,就是前 6 位必须是 0,这一点从最后的输出可以看出来。目前我们并不会实现一个动态调整目标的算法,所以将难度定义为一个全局的常量即可。

16 其实是一个可以任意取的数字,其目的只是为了有一个目标而已,这个目标占据不到 256 位的内存空间。同时,我们想要有足够的差异性,但是又不至于大的过分,因为差异性越大,就越难找到一个合适的哈希。这里的
_target_bits则表示满足要求的最大值,即一个上界,它是由1左移256-n_bits位来的。计算出来的哈希只要满足小于它就满足条件了。

接下来我们要准备用于计算哈希的数据:

    def _prepare_data(self, nonce):        data_lst = [str(self._block.block_header.prev_block_hash),                    str(self._block.block_header.hash_merkle_root),                    str(self._block.block_header.timestamp),                    str(self._block.block_header.height),                    str(nonce)]        return utils.encode(''.join(data_lst))

nonce就是我们要不断尝试要寻找的值,就是上面 Hashcash 所提到的计数器,它是一个密码学术语。其他数据都是区块头的数据。我们需要把这些数据进行合并作为计算哈希的原数据。

寻找nonce的方法:

    def run(self):        nonce = 0        found = False        hash_hex = None        print('Mining a new block')        while nonce < self.MAX_SIZE:            data = self._prepare_data(nonce)            hash_hex = utils.sum256_hex(data)            hash_val = int(hash_hex, 16)            sys.stdout.write("try nonce == %d hash_hex == %s \r" % (nonce, hash_hex))            if (hash_val < self._target_bits):                found = True                break            nonce += 1        if found:             print('Found nonce == %d' % nonce)        else:            print('Not Found nonce')            raise NonceNotFoundError('nonce not found')        return nonce, hash_hex

为防止溢出,我们要设定一个上线为int64的上限。然后我们不断循环寻找目标值,直到满足难度要求。当然,如果难度设计得过高,有可能寻找不到,所以也需要判断一下。所以我们再循环内做了一下事:

准备数据

用 SHA-256 对数据进行哈希

将哈希转换成一个大整数

将这个大整数与目标进行比较

然后我们还需要很方便的去检验这个块的难度值是否满足我们的要求:

    def validate(self):        """        validate the block        """        data = self._prepare_data(self._block.block_header.nonce)        hash_hex = utils.sum256_hex(data)        hash_val = int(hash_hex, 16)        return hash_val < self._target_bits

最后运行以前的main.py,结果如下:

Mining a new block.........Block(_block_header=BlockHeader(timestamp='1548213145.24', hash_merkle_root='', prev_block_hash='', hash='00008fbcbe3a817641195652d9bad37fa8c974536f152f4bc575b3ead9dc6407', nonce=62489, height=0))Block(_block_header=BlockHeader(timestamp='1548213166.65', hash_merkle_root='', prev_block_hash='00008fbcbe3a817641195652d9bad37fa8c974536f152f4bc575b3ead9dc6407', hash='9e851f78295e7933cd9749f712d1f09f1408dff9bd37cc2f79f1c65d1ab39e2e', nonce=16184, height=1))Block(_block_header=BlockHeader(timestamp='1548213171.15', hash_merkle_root='', prev_block_hash='9e851f78295e7933cd9749f712d1f09f1408dff9bd37cc2f79f1c65d1ab39e2e', hash='f88e7a382dafc50b01c43cbbdbbdfa20ac2bffcf5ddf36b97439ff09203f8c2a', nonce=8286, height=2))

可以看到这次我们产生三个块花费了25秒多,比没有工作量证明之前慢了很多(也就是成本高了很多)。

到此,相信大家对“python区块链如何实现简版工作量证明”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: python区块链如何实现简版工作量证明

本文链接: https://lsjlt.com/news/330085.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python区块链如何实现简版工作量证明
    本篇内容主要讲解“python区块链如何实现简版工作量证明”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python区块链如何实现简版工作量证明”吧!工作量证明区块链的一个关键点就是,一个人必须...
    99+
    2023-06-30
  • python区块链实现简版工作量证明
    目录说明回顾工作量证明哈希计算Hashcash实现说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用pytho...
    99+
    2024-04-02
  • python区块链实现简版网络
    目录说明引言区块链网络kademlia发现协议简化协议消息TCP服务端TCP客户端P2P服务器连接节点RPC测试区块同步方式问题总结说明 本文根据https://github.com...
    99+
    2024-04-02
  • python区块链基本原型简版如何实现
    这篇文章主要介绍了python区块链基本原型简版如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python区块链基本原型简版如何实现文章都会有所收获,下面我们一起来看看吧。引言区块链是 21 世纪最具革...
    99+
    2023-06-30
  • python区块链地址的简版实现
    说明 本文根据https://github.com/liuchengxu/blockchain-tutorial 的内容,用python实现的,但根据个人的理解进行了一些修改,大量引...
    99+
    2024-04-02
  • python区块链简易版交易实现示例
    目录说明引言比特币交易交易输出发送币余额查看总结说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python...
    99+
    2024-04-02
  • python区块链基本原型简版实现示例
    目录说明引言区块区块头区块链总结说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个...
    99+
    2024-04-02
  • 如何实现一个简单的区块链
    这篇文章将为大家详细讲解有关如何实现一个简单的区块链,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。区块链的基础概念很简单:一个分布式数据库,...
    99+
    2024-04-02
  • python区块链持久化和命令行接口实现简版
    目录说明引言选择数据库couchdbcouchdb的安装数据库结构序列化持久化区块链迭代器CLI测试一下说明 本文根据https://github.com/liuchengxu/bl...
    99+
    2024-04-02
  • Java如何实现简单的区块链程序
    本篇内容主要讲解“Java如何实现简单的区块链程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现简单的区块链程序”吧!什么是区块链?那么,让我们先来了解一下区块链到底是什么…好吧...
    99+
    2023-06-14
  • 详解python实现简单区块链结构
    区块链 比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链。 从技术上来看:区块是一种记录交易的数据结构,反映了...
    99+
    2024-04-02
  • 【Python】实现一个简单的区块链系统
    本文章利用 Python 实现一个简单的功能较为完善的区块链系统(包括区块链结构、账户、钱包、转账),采用的共识机制是 POW。 一、区块与区块链结构 Block.py import hashlibfrom datetime import ...
    99+
    2023-09-22
    区块链 python 共识算法
  • python区块链简易版交易完善挖矿奖励怎么实现
    这篇文章主要讲解了“python区块链简易版交易完善挖矿奖励怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python区块链简易版交易完善挖矿奖励怎么实现”吧!奖励挖矿奖励,实际上就...
    99+
    2023-06-30
  • js如何实现blockchain区块链
    这篇文章给大家分享的是有关js如何实现blockchain区块链的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。了解blockchain的概念很简单(区块链,交易链块):它是分布式...
    99+
    2024-04-02
  • 如何用用Python制作NFT区块链作品
    目录什么是 NFT?ERC20 与 ERC721NFT 有什么用?NFT 的价值如何制作 NFT如何进行无限定制的 NFT快速上手ERC721 代币标准什么是 NFT 元数据和 TokenURI?TokenURI链下...
    99+
    2022-06-02
    Python 区块链 python NFT
  • Python如何简化区块链应用的开发?
    1. 简化的合约开发 Python提供了合约开发框架,例如Web3.py和Truffle,使开发人员能够轻松创建和部署智能合约。这些框架通过抽象底层复杂性,使用户可以专注于合约逻辑。Python的简洁语法和可读性也使编写和维护智能合约变得...
    99+
    2024-03-13
    Python与区块链
  • 区块链的基石:Python如何发挥核心作用?
    智能合约开发 Python是开发区块链智能合约最常用的语言之一。智能合约是存储在区块链上的可执行程序,用于在满足特定条件时自动执行协议。Python的简洁语法和强大的库使得创建复杂的智能合约变得容易。 区块链分析 Python广泛用于区块...
    99+
    2024-03-13
    Python与区块链
  • python区块链持久化和命令行接口如何实现
    这篇“python区块链持久化和命令行接口如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python区块链持久化和命...
    99+
    2023-06-30
  • python如何实现腾讯滑块验证码识别
    小编给大家分享一下python如何实现腾讯滑块验证码识别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明白语言本身。2...
    99+
    2023-06-14
  • Python如何实现简易版音乐播放器
    小编给大家分享一下Python如何实现简易版音乐播放器,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、前言今天我们将用Python来创建一个属于自己的音乐播放器。为此,我们将使用三个软件包:Tkinter:用于UIPyg...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作