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+django实现文件下载
Jan 17 Python
python制作websocket服务器实例分享
Nov 20 Python
python实时分析日志的一个小脚本分享
May 07 Python
Flask框架WTForm表单用法示例
Jul 20 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
python安装requests库的实例代码
Jun 25 Python
如何使用Python实现自动化水军评论
Jun 26 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
对于Python深浅拷贝的理解
Jul 29 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
在Python中移动目录结构的方法
2016/01/31 Python
解决uWSGI的编码问题详解
2017/03/24 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
如何通过Python实现标签云算法
2019/07/02 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
庆元旦迎新年广播稿
2014/02/18 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
少儿节目主持串词
2014/04/02 职场文书
学校评语大全
2014/05/06 职场文书
关于环保的演讲稿
2014/05/10 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
公安机关起诉意见书
2015/05/20 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
详解Python常用的魔法方法
2021/06/03 Python
SQL中的连接查询详解
2022/06/21 SQL Server