python挖矿算力测试程序详解

作者:charles_lun 时间:2022-01-06 18:19:29 

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


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共识基本实现了

来源:https://blog.csdn.net/baidu_17508977/article/details/80559120

标签:python,挖矿,算力,测试
0
投稿

猜你喜欢

  • Linux下MySQL整个数据库的备份与还原

    2008-12-29 13:20:00
  • Oracle 触发器的使用小结

    2009-05-24 19:54:00
  • Python 中的 global 标识对变量作用域的影响

    2021-11-24 00:16:47
  • python扩展库numpy入门教程

    2022-05-05 14:28:05
  • python读取oracle函数返回值

    2022-10-07 23:47:48
  • Pytorch Tensor的索引与切片例子

    2022-12-08 16:28:10
  • Javascript调试之console对象——你不知道的一些小技巧

    2023-08-07 19:24:14
  • python应用Axes3D绘图(批量梯度下降算法)

    2023-04-19 11:41:45
  • Django2.1.7 查询数据返回json格式的实现

    2023-09-28 09:54:20
  • Python random模块制作简易的四位数验证码

    2023-06-29 07:41:50
  • python 基于pygame实现俄罗斯方块

    2021-07-22 15:47:23
  • 使用Python实现简单的学生成绩管理系统

    2022-04-28 11:33:07
  • 解析Python扩展模块的加速方案

    2022-12-26 04:53:00
  • Oracle中时间日期转化函数to_date和to_char的具体使用

    2023-07-15 20:20:20
  • python调用私有属性的方法总结

    2023-09-06 03:16:18
  • python调用win32接口进行截图的示例

    2021-07-22 07:19:45
  • python实现简易数码时钟

    2023-09-20 12:32:57
  • Oracle收购TimesTen 提高数据库软件性能

    2010-07-21 13:03:00
  • 文章内链(标签)的一个思路

    2009-10-31 19:03:00
  • msxml3.dll 错误 ‘800c0005’解决方案

    2009-10-05 18:36:00
  • asp之家 网络编程 m.aspxhome.com