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实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 Python
详解Django之auth模块(用户认证)
Apr 17 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
python视频按帧截取图片工具
Jul 23 Python
python加载自定义词典实例
Dec 06 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
python初步实现word2vec操作
Jun 09 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
分享几种python 变量合并方法
Mar 20 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 ADODB使用方法集锦
2008/03/25 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
php微信开发之谷歌测距
2018/06/14 PHP
表单JS弹出填写提示效果代码
2011/04/16 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Python 的字典(Dict)是如何存储的
2019/07/05 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
Python2与Python3的区别详解
2020/02/09 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
甜美蛋糕店创业计划书
2014/01/30 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
公务员检讨书
2014/11/01 职场文书
2014年收银工作总结
2014/11/13 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python