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使用Pycrypto库进行RSA加密的方法详解
Jun 06 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
Python实现的单向循环链表功能示例
Nov 10 Python
python机器学习之神经网络(一)
Dec 20 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
对python模块中多个类的用法详解
Jan 10 Python
Python中super函数用法实例分析
Mar 18 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
使用python-Jenkins批量创建及修改jobs操作
May 12 Python
Python变量格式化输出实现原理解析
Aug 06 Python
Flask搭建一个API服务器的步骤
May 28 Python
Python中22个万用公式的小结
Jul 21 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
星际争霸秘籍
2020/03/04 星际争霸
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
PHP实现文件上传与下载
2020/08/28 PHP
jQuery toggle()设置CSS样式
2009/11/05 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
基于node.js之调试器详解
2017/08/22 Javascript
详解a++和++a的区别
2017/08/30 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
基于vue中的scoped坑点解说
2020/09/04 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Python常用的json标准库
2019/02/19 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
文员个人求职自荐信
2013/09/21 职场文书
环境工程求职简历的自我评价范文
2013/10/24 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
企业宣传标语
2014/06/09 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android