python挖矿算力测试程序详解


Posted in Python onJuly 03, 2019

谈到比特币,我们都知道挖矿,有些人并不太明白挖矿的含义。这里的挖矿其实就是哈希的碰撞,举个简单例子:

import hashlib
x = 11
y = 1
#这里可以调节挖矿难度,也就是哈希的长度
while hashlib.sha256(f'{x*y}'.encode("utf-8")).hexdigest()[5:7]!="00":
  print(x*y)
  y +=1
print("找到了:",(x*y))

结果如下:

python挖矿算力测试程序详解

当然比特币的挖矿要比这个复杂太多,但是原理差不多,有个大概的认知。

关于节点的同步,是取整个节点中最长的区块链进行同步,如图所示:

python挖矿算力测试程序详解

有了以上内容铺垫,代码实现和理解就容易了,代码如下:

#挖矿原理与网络共识
import datetime
import hashlib
import json
import requests

class Blockchain2:

  def __init__(self):
    self.chain = [] #区块链列表
    self.nodes = set() #节点集合
    self.current_tranactions = [] #交易列表
    self.new_block(proof=100,preHash=1) #创建第一个区块

  #新建一个区块,需要计算,才能追加
  def new_block(self,proof,preHash = None):
    block={
      "index":len(self.chain)+1,#区块索引
      "timestamp":datetime.datetiem.now(),#区块时间戳
      "transactions":self.current_tranactions,#区块交易记录集合
      "proof":proof,#算力凭证
      "preHash":preHash or self.hash(self.chain[-1]), #上一块的哈希
    }
    self.current_tranactions = [] #开辟新的区块,初始化区块交易记录
    self.chain.append(block)

  @staticmethod
  def hash(block):
    #处理为json字符串格式的哈希
    block_str = json.dumps(block,sort_keys=True).encode("utf-8")
    return hashlib.sha256(block_str).hexdigest()

  #新增交易记录
  def new_transaction(self,sender,receiver,amount):
    transaction ={
      "sender":sender,
      "receiver":receiver,
      "amount":amount,
    }

    self.current_tranactions.append(transaction)

    return self.last_block["index"]+1

  @property
  def last_block(self):
    return self.chain[-1]

  #挖矿,依赖上一个模块,获取工作量证明,即POW共识机制
  def proof_of_work(self,last_block):
    last_proof = last_block["proof"]
    last_hash = self.hash(last_block)
    proof = 0

    while self.valid_proof(last_proof,proof,last_hash) is False:
      proof +=1

    return proof

  #校验工作量
  @staticmethod
  def valid_proof(last_proof,proof,last_hash):
    guess = f'{last_proof}{proof}{last_hash}'.encode("utf-8")
    guess_hash = hashlib.sha256(guess).hexdigest()
    return guess_hash[:6] =="000000" #可以调整计算难度

  #区块一致性,同步算法,
  def resolve_conflicts(self):
    neighbours = self.nodes
    new_chain = None
    max_length = len(self.chain)
    #遍历所有节点,找出最长的链
    for node in neighbours:
      #获取节点区块链信息
      response = requests.get(f'http://{node}/chain')
      if response.status_code ==200:
        length = response.json()["length"]
        chain = response.json()["chain"]

        if length>max_length and self.valid_chain(chain):
          max_length = length
          new_chain = chain

    if new_chain:
      self.chain = new_chain
      return True
    else:
      return False

  #校验区块链的合法性
  def valid_chain(self,chain):
    last_block = chain[0]
    current_index = 1
    #校验每一个区块的prehash,proof合法性
    while current_index <len(chain):
      block = chain[current_index]
      #校验哈希的合法性
      if block["preHash"] != self.hash(last_block):
        return False
      #校验算力的合法性
      if not self.valid_proof(last_block["proof"],block["proof"],block["preHash"]):
        return False
      last_block = block
      current_index +=1
    return True

算力校验和pow共识基本实现了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python随机生成数据后插入到PostgreSQL
Jul 28 Python
Python实现发送QQ邮件的封装
Jul 14 Python
python机器学习实战之K均值聚类
Dec 20 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
在Pycharm中执行scrapy命令的方法
Jan 16 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
CentOS7下安装python3.6.8的教程详解
Jan 03 Python
python实现简单猜单词游戏
Dec 24 Python
python实现三种随机请求头方式
Jan 05 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
如何用Python做一个微信机器人自动拉群
Jul 03 #Python
Python中的正则表达式与JSON数据交换格式
Jul 03 #Python
python实现共轭梯度法
Jul 03 #Python
python实现微信自动回复及批量添加好友功能
Jul 03 #Python
Python 中Django安装和使用教程详解
Jul 03 #Python
利用python求积分的实例
Jul 03 #Python
python可视化爬虫界面之天气查询
Jul 03 #Python
You might like
PHP高自定义性安全验证码代码
2011/11/27 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python处理字符串之isspace()方法的使用
2015/05/19 Python
Python实现的Excel文件读写类
2015/07/30 Python
python机器学习之神经网络(二)
2017/12/20 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
深入分析python 排序
2020/08/24 Python
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
单位婚育证明范本
2014/11/21 职场文书
佛光寺导游词
2015/02/10 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
《包身工》教学反思
2016/02/23 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
php实现自动生成验证码的实例讲解
2021/11/17 PHP
Elasticsearch 数据类型及管理
2022/04/19 Python