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
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
Python 实现数据库更新脚本的生成方法
Jul 09 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
Django的性能优化实现解析
Jul 30 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 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
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
一个基于jquery的文本框记数器
2012/09/19 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
Python中asyncore的用法实例
2014/09/29 Python
python实现获取Ip归属地等信息
2016/08/27 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
python脚本定时发送邮件
2020/12/22 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
关于礼仪的演讲稿
2014/01/04 职场文书
超市店庆活动方案
2014/08/31 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
React 高阶组件HOC用法归纳
2021/06/13 Javascript
2022年四月新番
2022/03/15 日漫