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 相关文章推荐
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python实现购物车程序
Apr 16 Python
python实现画一颗树和一片森林
Jun 25 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
Python3实现二叉树的最大深度
Sep 30 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
如何在python中处理配置文件代码实例
Sep 27 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
python help函数实例用法
Dec 06 Python
PyTorch dropout设置训练和测试模式的实现
May 27 Python
详解Python内置模块Collections
Mar 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删除文本文件中重复行的方法
2015/04/28 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
Jquery 切换不同图片示例代码
2013/12/05 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
vue实现分页组件
2020/06/16 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
Windows下PyMongo下载及安装教程
2015/04/27 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
Django中Forms的使用代码解析
2018/02/10 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
EntityManager都有哪些方法
2013/11/01 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
人事助理岗位职责
2013/11/18 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
学校文明单位申报材料
2014/05/06 职场文书
12岁生日演讲稿
2014/05/14 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
python - asyncio异步编程
2021/04/06 Python
Golang之sync.Pool使用详解
2021/05/06 Golang