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实现博客文章爬虫示例
Feb 26 Python
详解Python3.1版本带来的核心变化
Apr 07 Python
python使用arp欺骗伪造网关的方法
Apr 24 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
python3爬取各类天气信息
Feb 24 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Python测试Kafka集群(pykafka)实例
Dec 23 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 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公用函数列表[正则]
2007/02/22 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
jquery iframe操作详细解析
2013/11/20 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
微信小程序如何获取用户信息
2018/01/26 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
React优化子组件render的使用
2019/05/12 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
python基础教程项目二之画幅好画
2018/04/02 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
学生违反校规检讨书
2014/10/28 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
信用卡工资证明范本
2015/06/19 职场文书
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python