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概率计算器实例分析
Mar 25 Python
python图像处理之镜像实现方法
May 30 Python
Python程序退出方式小结
Dec 09 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
Django 实现购物车功能的示例代码
Oct 08 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
Pandas中resample方法详解
Jul 02 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
Django项目在pycharm新建的步骤方法
Mar 02 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过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
CI框架中zip类应用示例
2014/06/17 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
python写入xml文件的方法
2015/05/08 Python
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
大众服装店创业计划书范文
2014/01/01 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
四年大学自我鉴定
2014/02/17 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
行政人事岗位职责
2014/03/17 职场文书
生活小常识广播稿
2014/09/16 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
小升初自荐信范文
2015/03/05 职场文书
交通处罚决定书
2015/06/24 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
Pyhton模块和包相关知识总结
2021/05/12 Python