談到比特幣,我們都知道挖礦,有些人并不太明白挖礦的含義。這里的挖礦其實(shí)就是哈希的碰撞,舉個(gè)簡(jiǎn)單例子:
import hashlib
x = 11
y = 1
#這里可以調(diào)節(jié)挖礦難度,也就是哈希的長(zhǎng)度
while hashlib.sha256(f'{x*y}'.encode("utf-8")).hexdigest()[5:7]!="00":
print(x*y)
y +=1
print("找到了:",(x*y))
結(jié)果如下:
當(dāng)然比特幣的挖礦要比這個(gè)復(fù)雜太多,但是原理差不多,有個(gè)大概的認(rèn)知。
關(guān)于節(jié)點(diǎn)的同步,是取整個(gè)節(jié)點(diǎn)中最長(zhǎng)的區(qū)塊鏈進(jìn)行同步,如圖所示:
有了以上內(nèi)容鋪墊,代碼實(shí)現(xiàn)和理解就容易了,代碼如下:
#挖礦原理與網(wǎng)絡(luò)共識(shí)
import datetime
import hashlib
import json
import requests
class Blockchain2:
def __init__(self):
self.chain = [] #區(qū)塊鏈列表
self.nodes = set() #節(jié)點(diǎn)集合
self.current_tranactions = [] #交易列表
self.new_block(proof=100,preHash=1) #創(chuàng)建第一個(gè)區(qū)塊
#新建一個(gè)區(qū)塊,需要計(jì)算,才能追加
def new_block(self,proof,preHash = None):
block={
"index":len(self.chain)+1,#區(qū)塊索引
"timestamp":datetime.datetiem.now(),#區(qū)塊時(shí)間戳
"transactions":self.current_tranactions,#區(qū)塊交易記錄集合
"proof":proof,#算力憑證
"preHash":preHash or self.hash(self.chain[-1]), #上一塊的哈希
}
self.current_tranactions = [] #開(kāi)辟新的區(qū)塊,初始化區(qū)塊交易記錄
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]
#挖礦,依賴(lài)上一個(gè)模塊,獲取工作量證明,即POW共識(shí)機(jī)制
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
#校驗(yàn)工作量
@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" #可以調(diào)整計(jì)算難度
#區(qū)塊一致性,同步算法,
def resolve_conflicts(self):
neighbours = self.nodes
new_chain = None
max_length = len(self.chain)
#遍歷所有節(jié)點(diǎn),找出最長(zhǎng)的鏈
for node in neighbours:
#獲取節(jié)點(diǎn)區(qū)塊鏈信息
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
#校驗(yàn)區(qū)塊鏈的合法性
def valid_chain(self,chain):
last_block = chain[0]
current_index = 1
#校驗(yàn)每一個(gè)區(qū)塊的prehash,proof合法性
while current_index
算力校驗(yàn)和pow共識(shí)基本實(shí)現(xiàn)了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

