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调用java的Webservice示例
Mar 10 Python
编程语言Python的发展史
Sep 26 Python
python中global与nonlocal比较
Nov 21 Python
深入理解python try异常处理机制
Jun 01 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
Python实现的文轩网爬虫完整示例
May 16 Python
Python实现Selenium自动化Page模式
Jul 14 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
python线程优先级队列知识点总结
Feb 28 Python
Python 多线程处理任务实例
Nov 07 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
采购员的工作职责
2013/12/26 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
市场营销计划书范文
2015/01/16 职场文书
环境建议书
2015/02/04 职场文书
护理专业自荐信范文
2015/03/06 职场文书
大学生求职自荐信
2015/03/24 职场文书
社区党务工作总结2015
2015/05/19 职场文书
医院党建工作总结2015
2015/05/26 职场文书