谈到比特币,我们都知道挖矿,有些人并不太明白挖矿的含义。这里的挖矿其实就是哈希的碰撞,举个简单例子:
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共识基本实现了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月15日
2024年11月15日
- 陈崎凡《CHEN》[320K/MP3][81.13MB]
- skt都在哪一年夺冠 英雄联盟skt夺冠赛季介绍
- 炉石传说抢先体验乱斗什么时候结束 深暗领域体验乱斗结束时间
- 炉石传说抢先乱斗卡组有什么 深暗领域抢先体验乱斗卡组推荐
- 荣耀手机腕上最佳搭档 荣耀手表5首销开启
- 雷克沙ARES 6000 C28战神之翼 AMD 9800X3D超强搭档
- 咪咕快游感恩同游,超值回馈尽在咪咕咪粉节!
- 陈崎凡《CHEN》[FLAC/分轨][326.32MB]
- 群星《我们的歌第六季 第2期》[320K/MP3][74.05MB]
- 群星《我们的歌第六季 第2期》[FLAC/分轨][385.16MB]
- 童丽《每一个晚上》[低速原抓WAV+CUE]
- 乌兰齐齐格《呼伦牧歌》[原抓WAV+CUE]
- 黄乙玲1988-无稳定的爱心肝乱糟糟[日本东芝1M版][WAV+CUE]
- 群星《我们的歌第六季 第3期》[320K/MP3][70.68MB]
- 群星《我们的歌第六季 第3期》[FLAC/分轨][369.48MB]