python挖矿算力测试程序详解
作者:charles_lun 发布时间:2022-01-06 18:19:29
标签: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共识基本实现了
来源:https://blog.csdn.net/baidu_17508977/article/details/80559120
0
投稿
猜你喜欢
- 前言本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详
- python多进程下实现日志记录按时间分割,供大家参考,具体内容如下原理:自定义日志handler继承TimedRotatingFileHa
- 本文实例讲述了Python实现带参数的用户验证功能装饰器。分享给大家供大家参考,具体如下:user_list = [ {'
- 最近,使用 golang 去管理本地应用的生命周期,期间有几个有趣的点,今天就一起看下。场景一我们来看看下面两个脚本会产
- 背景:用python画AR模型的时序图。结果:代码:import numpy as npimport matplotlib.pyplot a
- 本文详细罗列并说明了Python的标准库与第三方库如下,供对此有需要的朋友进行参考:Tkinter———— Python默认的图形界面接口。
- strstr 定义和用法注释:该函数是二进制安全的。语法strstr(string,search,before_search)参数
- Python实现文件的全备份和差异备份之前有写利用md5方式来做差异备份,但是这种md5方式来写存在以下问题:md5sum获取有些软连接的M
- 一些MySQL发布对MySQL数据库中的系统表的结构进行了更改,添加了新权限或特性。当你更新到新版本MySQL,你应同时更新系统表,以确保它
- 条件判断计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if
- 1.找到python的安装路径: 如果忘记可以在Pycharm运行如下代码:import
- 描述的意思是HTML为中心的前端开发也差不多是web标准的意思。1.HTML是基础2.CSS依靠选择符提供视觉;3.Javascript 依
- 封装Python将多个值用逗号隔开,进行赋值。会将这些值封装成一个tuple返回#示例a = 1,2type(a)结果:<class
- 微信小程序中使用地图(map)组件,通过点击(tap)获取经纬度,按照官方的回应,暂时是没法做到的,从地图组件API多有残缺判断,怀疑是个实
- 日期的转换及计算对于日期,有时需执行不同时间单位的转换,或者接受字符串格式的日期,转换为 datetime 对象。有时需计算日期的范围,以及
- 准备工作下载python,本文以python3.6为例。python3.6下载地址:python3下载地址,选择合适的版本安装。安装成功后,
- python-try-except:pass用法1.为了跳过for循环里的某次循环以下代码当某次循环发生错误时,执行except代码块,co
- 前言:本篇文章基于卷积神经网络CNN,使用PyTorch实现MNIST数据集手写数字识别。一、PyTorch是什么?PyTorch 是一个
- 代码:import sysfrom PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel
- 需要把一个从csv文件里读取来的数据集等距抽样分割,这里用到了列表表达式和dataframe.iloc先生成索引列表:index_list