python挖矿算力测试程序详解

谈到比特币,我们都知道挖矿,有些人并不太明白挖矿的含义。这里的挖矿其实就是哈希的碰撞,举个简单例子:

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))

结果如下:

当然比特币的挖矿要比这个复杂太多,但是原理差不多,有个大概的认知。

关于节点的同步,是取整个节点中最长的区块链进行同步,如图所示:

有了以上内容铺垫,代码实现和理解就容易了,代码如下:

#挖矿原理与网络共识
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共识基本实现了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Selenium(Python web测试工具)基本用法详解

    本文实例讲述了Selenium基本用法.分享给大家供大家参考,具体如下: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上.测试系统功能--创建回归测试检验软件功能和用户需求.

  • python自动化测试之如何解析excel文件

    前言 自动化测试中我们存放数据无非是使用文件或者数据库,那么文件可以是csv,xlsx,xml,甚至是txt文件,通常excel文件往往是我们的首选,无论是编写测试用例还是存放测试数据,excel都是很方便的.那么今天我们就把不同模块处理excel文件的方法做个总结,直接做封装,方便我们以后直接使用,增加工作效率. openpyxl openpyxl是个第三方库,首先我们使用命令 pip install openpyxl 直接安装 注:openpyxl操作excel时,行号和列号都是从1开始计算

  • python3+selenium自动化测试框架详解

    背景 为了更好的发展自身的测试技能,应对测试行业以及互联网行业的迭代变化.自学python以及自动化测试. 虽然在2017年已经开始接触了selenium,期间是断断续续执行自动化测试,因为还有其他测试任务,培训任务要执行- 前期建议大家能够学习python基本语法(python基础教程) 任务 搭建自动化测试框架,并能有效方便的进行测试,维护成本也要考虑其中. 过程 我的自动化框架可能不成熟,因为是自学的.请多包涵.也请大佬指导~ common 包含:基本的公共方法类,比如HTML报告.Log

  • python实现websocket的客户端压力测试

    使用python进行websocket的客户端压力测试,这个代码是从github上 找到.然后简单修改了下.大神运用了进程池,以及线程池的内容.所以保存下来,学习学习 然后需要说明的是:本次用的python2.7,也尝试用python3.6,但是老实出现websocket-client包和python3不能兼容的情况,提示没有相关的方法.所以不得已最后又采用了python2 # -*- coding:utf-8 -*- # __author__ == 'chenmingle' import we

  • Python+request+unittest实现接口测试框架集成实例

    1.为什么要写代码实现接口自动化 大家知道很多接口测试工具可以实现对接口的测试,如postman.jmeter.fiddler等等,而且使用方便,那么为什么还要写代码实现接口自动化呢?工具虽然方便,但也不足之处: 测试数据不可控制 接口测试本质是对数据的测试,调用接口,输入一些数据,随后,接口返回一些数据.验证接口返回数据的正确性.在用工具运行测试用例之前不得不手动向数据库中插入测试数据.这样我们的接口测试是不是就没有那么"自动化了". 无法测试加密接口 这是接口测试工具的一大硬伤,如

  • python实现接口并发测试脚本

    常用的网站性能测试指标有:并发数.响应时间.吞吐量.性能计数器等. 1.并发数 并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力. 2.响应时间 响应时间是一个系统最重要的指标之一,它的数值大小直接反应了系统的快慢.响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间. 3.吞吐量 吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标. QPS(每秒查询数).TPS(每秒事务数)是吞吐量的常用量化指标,另外还有HPS(每秒HT

  • Python3调用百度AI识别图片中的文字功能示例【测试可用】

    本文实例讲述了Python3调用百度AI识别图片中的文字功能.分享给大家供大家参考,具体如下: 首先pip install命令安装baidu-aip模块,如下图所示(这里使用pip3 install baidu-aip命令): 编辑Python代码时注意,需要首先引入AipOcr和re两个模块,即: from aip import AipOcr import re 示例代码如下: from aip import AipOcr import re APP_ID='***' API_KEY='***

  • python挖矿算力测试程序详解

    谈到比特币,我们都知道挖矿,有些人并不太明白挖矿的含义.这里的挖矿其实就是哈希的碰撞,举个简单例子: 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数据结构之栈详解

    目录 0.学习目标 1.栈的基本概念 1.1栈的基本概念 1.2栈抽象数据类型 1.3栈的应用场景 2.栈的实现 2.1顺序栈的实现 2.1.1栈的初始化 2.2链栈的实现 2.3栈的不同实现对比 3.栈应用 3.1顺序栈的应用 3.2链栈的应用 3.3利用栈基本操作实现复杂算法 0. 学习目标 栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作的子集,但从数据类型的角度来讲,它们与线性表又有着巨大的不同.本节将首先介绍

  • Python数据结构之队列详解

    目录 0. 学习目标 1. 队列的基本概念 1.1 队列的基本概念 1.2 队列抽象数据类型 1.3 队列的应用场景 2. 队列的实现 2.1 顺序队列的实现 2.2 链队列的实现 2.3 队列的不同实现对比 3. 队列应用 3.1 顺序队列的应用 3.2 链队列的应用 3.3 利用队列基本操作实现复杂算法 0. 学习目标 栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作的子集,但从数据类型的角度来讲,它们与线性表又有

  • MySQL数据库设计之利用Python操作Schema方法详解

    弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

  • Python之str操作方法(详解)

    1. str.format():使用"{}"占位符格式化字符串(占位符中的索引号形式和键值对形式可以混合使用). >>> string = 'python{}, django{}, tornado{}'.format(2.7, 'web', 'tornado') # 有多少个{}占位符就有多少个值与其对应,按照顺序"填"进字符串中 >>> string 'python2.7, djangoweb, tornadotornado'

  • 基于python时间处理方法(详解)

    在处理数据和进行机器学习的时候,遇到了大量需要处理的时间序列.比如说:数据库读取的str和time的转化,还有time的差值计算.总结一下python的时间处理方面的内容. 一.字符串和时间序列的转化 time.strptime():字符串=>时间序列 time.strftime():时间序列=>字符串 import time start = "2017-01-01" end = "2017-8-12" startTime = time.strptime

  • Python探索之SocketServer详解

    SocketServer,网络通信服务器,是Python标准库中的一个模块,其作用是创建网络服务器.SocketServer模块定义了一些类来处理诸如TCP.UDP.UNIX流和UNIX数据报之上的同步网络请求. SocketServer模块处理网络请求的功能,可以通过两个主要的类来实现:一个是服务器类,一个是请求处理类. 服务器类 处理通信问题,如监听一个套接字并接收连接等: 请求处理类 处理"协议"问题,如解释到来的数据.处理数据并把数据发回给客户端等. 这种实现将服务器的实现过程

  • python学习 流程控制语句详解

    ###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的运行方向 # Ture:表示非空的量(String,tuple元组 .list.set.dictonary),所有非零的数字 # False:0,None .空的量 #逻辑表达式 可以包含 逻辑运算符 and or not if: ##################################

  • Python 调用Java实例详解

    Python 调用Java实例详解 前言: Python 对服务器端编程不如Java 所以这方面可能要调用Java代码 前提: Linux 环境  1 安装 jpype1 安装后测试代码: from jpype import * startJVM(getDefaultJVMPath(), "-ea") java.lang.System.out.println("Hello World") shutdownJVM() 2 调用非jdk的jar包, test.jar 包

  • python 编程之twisted详解及简单实例

    python 编程之twisted详解 前言: 我不擅长写socket代码.一是用c写起来比较麻烦,二是自己平时也没有这方面的需求.等到自己真正想了解的时候,才发现自己在这方面确实有需要改进的地方.最近由于项目的原因需要写一些Python代码,才发现在python下面开发socket是一件多么爽的事情. 对于大多数socket来说,用户其实只要关注三个事件就可以了.这分别是创建.删除.和收发数据.python中的twisted库正好可以帮助我们完成这么一个目标,实用起来也不麻烦.下面的代码来自t

随机推荐