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实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
Python+django实现文件上传
Jan 17 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
Python多继承原理与用法示例
Aug 23 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
用Python爬虫破解滑动验证码的案例解析
May 06 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
vue如何判断dom的class
2018/04/26 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
Python中装饰器高级用法详解
2017/12/25 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
Django 用户认证组件使用详解
2019/07/23 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Tensorflow累加的实现案例
2020/02/05 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
如何定义一个可复用的服务
2014/09/30 面试题
生产车间主管岗位职责
2013/12/28 职场文书
工地门卫岗位职责
2013/12/30 职场文书
会计学自我鉴定
2014/02/06 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
小学家长评语大全
2014/04/16 职场文书
统计员岗位职责
2015/02/11 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
js前端图片加载异常兜底方案
2022/06/21 Javascript