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利用matplotlib库绘制饼图的方法示例
Dec 18 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
Python序列类型的打包和解包实例
Dec 21 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
python和php哪个容易学
Jun 19 Python
浅析python 字典嵌套
Sep 29 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 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
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
物业管理专业个人的自我评价
2013/11/19 职场文书
入学申请自荐信范文
2014/02/26 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
防震减灾主题班会
2015/08/14 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫