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目录操作之python遍历文件夹后将结果存储为xml
Jan 27 Python
python实现线程池的方法
Jun 30 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
查看python下OpenCV版本的方法
Aug 03 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 Python
python 与服务器的共享文件夹交互方法
Dec 27 Python
Python参数类型以及常见的坑详解
Jul 08 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
python开发一款翻译工具
Oct 10 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调用mysql存储过程
2007/02/14 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python生成不重复随机值的方法
2015/05/11 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
英国手机零售商:Metrofone
2019/03/18 全球购物
护理毕业生自荐信范文
2013/12/22 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
品德评语大全
2014/05/05 职场文书
环保建议书500字
2014/05/14 职场文书
给校长的建议书200字
2014/05/16 职场文书
小学运动会入场口号
2015/12/24 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers