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之让人欢喜让人忧的迭代
Oct 02 Python
Python功能键的读取方法
May 28 Python
详解Django中Request对象的相关用法
Jul 17 Python
python+matplotlib绘制饼图散点图实例代码
Jan 20 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
pandas.cut具体使用总结
Jun 24 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
django创建超级用户过程解析
Sep 18 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
使用Django搭建网站实现商品分页功能
May 22 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基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
JavaScript基本对象
2007/01/11 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
Vue多选列表组件深入详解
2021/03/02 Vue.js
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
Python实现ATM系统
2020/02/17 Python
python入门之井字棋小游戏
2020/03/05 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
小学教师管理制度
2014/01/18 职场文书
公务员综合考察材料
2014/02/01 职场文书
新品发布会主持词
2014/04/02 职场文书
民事二审代理词
2015/05/25 职场文书
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server