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 29 Python
详解flask表单提交的两种方式
Jul 21 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
Pytest allure 命令行参数的使用
Apr 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
使用PHP制作新闻系统的思路
2006/10/09 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
PHP代码优化的53个细节
2014/03/03 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
初学Javascript的一些总结
2008/11/03 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
Python自动发邮件脚本
2017/03/31 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
自我鉴定的范文
2013/10/03 职场文书
董事长秘书工作职责
2014/06/10 职场文书