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
投稿
猜你喜欢
- 前言在使用PC时与PC交互的主要途径是看屏幕显示、听声音,点击鼠标和敲键盘等等。在自动化办公的趋势下,繁琐的工作可以让程序自动完成。比如自动
- LCase:转成小写 UCase:转成大写 下面是ASP中的代码,可以直接演示效果的。 代码如下:<% dim s
- 一、python读取excel表格数据1、读取excel表格数据常用操作import xlrd# 打开excel表格data_excel =
- 如果你写一个 bug 管理系统,用了这个 PeriodLimit 你就可以限制每个测试人员每天只能给你提一个 bug。工作是不是就轻松很多了
- 如下所示:RuntimeError: stack expects each tensor to be equal size, but got
- 1.反变换法设需产生分布函数为F(x)的连续随机数X。若已有[0,1]区间均匀分布随机数R,则产生X的反变换公式为:F(x)=r, 即x=F
- mysql更改数据文件的存放路径感觉直接把/etc/my.cnf中的datadir改一下重启一下服务就行,但是从网上搜了n多资料,大部分都是
- 一、MySQL的下载 1.登陆MySQL的官网下载适用于64位系统的ZIP压缩包(https://dev.mysql.com/do
- 本文实例为大家分享了wxPython分隔窗口的具体代码,供大家参考,具体内容如下1、分割窗口分隔窗口(wx.SplitterWindow)就
- python 3.10上安装pyqt5前言首先,看一下自己电脑上的python的版本,网上有太多乱七八糟的教程,啥也不说就硬教,跟着做的话就
- 1.首先生成array数组import numpy as npa = np.random.rand(5,5)print(a)结果:array
- UNIONUNION语义:取两个子查询结果的并集,重复的行只保留一行表初始化CREATE TABLE t1(id INT PRIMARY K
- 如下所示:#保存 cookie 到变量import urllib.requestimport http.cookiejarcookie =
- 为了能够正常使用,先把所提供的global.asa文件放到该应用程序的根目录中。最简单的办法是把global.asa文件放到缺省Web网站的
- 1. 查看数据库的版本 select @@version 2. 查看数据库所在机器操作
- 根据GB11643-1999公民身份证号码是特征组合码,由十七位数字本体码和一位数字校验码组成,排列顺序从左至右依次为:六位数字地址码八位数
- 操作:输入带分页的地址,去掉最后面的数字,设置一下起始页数和终点页数功能:下载对应页码的所有页面并储存为HTML文件,以当前时间命名代码:#
- 如下所示:# -*- coding: utf-8 -*-# @Time : 2018/5/17 15:05# @Author :
- 本文实例为大家分享了Vue编写时钟插件的具体代码,供大家参考,具体内容如下效果图代码奉上:<template> &n
- 本文实例为大家分享了JavaScript实现简易购物车的具体代码,供大家参考,具体内容如下代码:<!DOCTYPE html>&