日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分布式共识四】POW共识算法

發(fā)布時(shí)間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式共识四】POW共识算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下面我來說說Bitcoin是如何通過Pow算法解決拜占庭將軍問題的。

比特幣

2008年,中本聰介紹了一個(gè)點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)--比特幣。比特幣的基石是拜占庭共識(shí)協(xié)議。比特幣怎樣實(shí)現(xiàn)了拜占庭共識(shí)協(xié)議將在接下來的章節(jié)中介紹。不過首先要先介紹一下比特幣

交易

比特幣協(xié)議在數(shù)字貨幣中提供了一種交易方法,在這個(gè)方法中每個(gè)人可以對(duì)貨幣所有權(quán),交易順序達(dá)成共識(shí)。貨幣所有權(quán)是通過公鑰來決定。整個(gè)網(wǎng)絡(luò)需要對(duì)貨幣數(shù)量與貨幣所有權(quán)之間的關(guān)系達(dá)成共識(shí)。貨幣所有權(quán)可以通過對(duì)轉(zhuǎn)賬交易(從一個(gè)賬戶轉(zhuǎn)移給另一個(gè)賬戶)簽名進(jìn)行轉(zhuǎn)移。整個(gè)網(wǎng)絡(luò)需要能個(gè)解決同一筆錢不能花費(fèi)兩次的難題。由于沒有一個(gè)中心化的權(quán)威機(jī)構(gòu)能夠校驗(yàn)交易,因此需要在沒有受信任第三方機(jī)構(gòu)的情況下解決這個(gè)問題。就是說需要用去中心化的方法解決這個(gè)問題。

解決方案:公開向網(wǎng)絡(luò)廣播每筆交易,網(wǎng)絡(luò)中的節(jié)點(diǎn)對(duì)先到達(dá)的交易是有效的達(dá)成共識(shí)。每個(gè)節(jié)點(diǎn)檢查先到達(dá)的交易的輸出之前是否被花費(fèi)。難點(diǎn)是:由于網(wǎng)絡(luò)通信不是及時(shí)的(異步網(wǎng)絡(luò)),所以導(dǎo)致所有節(jié)點(diǎn)收到的交易并不是完全一致的。在這個(gè)情況下找到一個(gè)確認(rèn)哪一個(gè)交易是最先到達(dá)的共識(shí)是困難的。為了對(duì)交易順序達(dá)成共識(shí),交易被打上時(shí)間戳存放在含有工作量證明的區(qū)塊中。

這個(gè)方法為交易順序共識(shí)提供了解決方案:區(qū)塊包含上一個(gè)區(qū)塊的Hash,最新交易。

Proof-of-Work?工作量證明

為了實(shí)現(xiàn)對(duì)交易打時(shí)間戳,Hash交易數(shù)據(jù)。比特幣用了工作量證明方法。網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)從事于解決一個(gè)適度困難的密碼難題。難題的解決方法是:把區(qū)塊中的所有數(shù)據(jù)做SHA256哈希運(yùn)算,并且得到哈希值小于給定的目標(biāo)值。區(qū)塊中還包含一個(gè)Nonce值,通過遞增Nonce來尋找正確的哈希值。這個(gè)密碼謎題被設(shè)計(jì)成,每隔10Mins會(huì)找到一個(gè)謎題答案。

一旦正確的哈希值被找到,節(jié)點(diǎn)就會(huì)向網(wǎng)絡(luò)中廣播這個(gè)哈希值。這個(gè)哈希值可以很容易的被網(wǎng)絡(luò)中的其他節(jié)點(diǎn)驗(yàn)證,節(jié)點(diǎn)可以對(duì)收到區(qū)塊后對(duì)區(qū)塊中的數(shù)據(jù)進(jìn)行SHA256運(yùn)算哈希值。

花費(fèi)的CPU就是工作量證明。要修改一個(gè)區(qū)塊需要重做這個(gè)區(qū)塊以及這個(gè)區(qū)塊之后所有區(qū)塊的工作量證明。這就意味比特網(wǎng)絡(luò)更傾向于最誠(chéng)實(shí)的鏈,只要網(wǎng)絡(luò)中大多數(shù)節(jié)點(diǎn)是誠(chéng)實(shí)的。


Pow的過程可以被看做是一個(gè)投票的過程。每個(gè)新增的區(qū)塊累積了以前的歷史交易(區(qū)塊是串聯(lián)成鏈的),每個(gè)節(jié)點(diǎn)都會(huì)繼續(xù)對(duì)以有最多投票數(shù)量的鏈繼續(xù)投票。

?

攻擊比特幣網(wǎng)絡(luò)

現(xiàn)在考慮一下網(wǎng)絡(luò)中可以存在的一種攻擊。一個(gè)惡意的節(jié)點(diǎn)試圖雙花之前已花費(fèi)的交易。攻擊者需要重做包含這個(gè)交易的區(qū)塊,以及這個(gè)區(qū)塊之后的所有的區(qū)塊,創(chuàng)建一個(gè)比目前誠(chéng)實(shí)區(qū)塊鏈更長(zhǎng)的區(qū)塊鏈。只有網(wǎng)絡(luò)中的大多數(shù)節(jié)點(diǎn)都轉(zhuǎn)向攻擊者創(chuàng)建的區(qū)塊鏈,攻擊者的攻擊才算成功了。考慮交易T包含在區(qū)塊b1中。每個(gè)后續(xù)區(qū)塊b2,b3,b4,.........bn會(huì)降低交易T被修改的可能性,因?yàn)樾薷倪@些后續(xù)的區(qū)塊需要更多的算力。中本聰用概率理論證明,六個(gè)區(qū)塊后攻擊者追趕上最長(zhǎng)鏈的可能性降低到0.0002428%。在過四個(gè)或更多區(qū)塊后這個(gè)可能行會(huì)降到0.0000012%。每新增一個(gè)區(qū)塊bn,攻擊的可能性就會(huì)以指數(shù)形式下降,很快整個(gè)攻擊的可能性就會(huì)低到可以忽略的程度。在實(shí)際中,比特幣交易會(huì)在六個(gè)區(qū)塊后被確認(rèn),因?yàn)樵谶@種情況下,攻擊者追趕上的可能性已經(jīng)非常低了,可以認(rèn)為這個(gè)交易是有效的,不再會(huì)被修改。

工作量證明Pow實(shí)現(xiàn)拜占庭共識(shí)

現(xiàn)在我們看一下比特幣的工作量證明是如何解決計(jì)算機(jī)網(wǎng)絡(luò)中的拜占庭將軍問題的。比特幣網(wǎng)絡(luò)是就交易的順序,沒有中心化機(jī)構(gòu)的情況下達(dá)成共識(shí)的,同樣拜占庭將軍也是做得同樣的事情。拜占庭將軍需要攻擊城堡,所有將軍需要對(duì)任何將軍可能提出的攻擊時(shí)間達(dá)成共識(shí)。

方案一:被所有將軍都接受到的攻擊計(jì)劃,被認(rèn)為是正式的攻擊計(jì)劃。問題是:兩個(gè)或多個(gè)將軍有可能同時(shí)發(fā)出不同的攻擊計(jì)劃。

這個(gè)問題模型被工作量證明簡(jiǎn)化了,比特幣工作量證明系統(tǒng)中,不會(huì)追蹤交易順序,取而代之是在將軍之間達(dá)成共識(shí)。每個(gè)將軍基于工作量證明,解決一個(gè)難度適當(dāng)?shù)?/span>Hash難題,每個(gè)難題有足夠的難度,僅當(dāng)在所有的將軍同時(shí)工作時(shí),平均10Mins會(huì)找到一個(gè)難題的答案(solution)。當(dāng)一個(gè)將軍找到問題的答案,它會(huì)把這個(gè)答案連同攻擊計(jì)劃在網(wǎng)絡(luò)中廣播。一旦收到Solution,每個(gè)將軍調(diào)整難題為在廣播中收到的攻擊時(shí)間,攻擊計(jì)劃。然后將軍繼續(xù)解決下一個(gè)工作量證明。這樣接下來每個(gè)solution會(huì)依次在第一個(gè)solution后串聯(lián)成鏈。如果有將軍還在繼續(xù)在對(duì)另一個(gè)不同的攻擊方案進(jìn)行工作量證明計(jì)算,它會(huì)切換到這個(gè)最長(zhǎng)的鏈上。這個(gè)最長(zhǎng)鏈上積累了最多的CPU算力。

平均一個(gè)小時(shí)后,這個(gè)鏈上會(huì)有六個(gè)區(qū)塊。每個(gè)將軍可以判斷是否有足夠多的將軍工作在含有相同初始攻擊計(jì)劃的最長(zhǎng)鏈上。鏈會(huì)在一小時(shí)累積到六個(gè)區(qū)塊,說明大多數(shù)將軍對(duì)相同的攻擊計(jì)劃進(jìn)行工作量證明計(jì)算(CPU投票)。因此將軍對(duì)攻擊時(shí)間達(dá)成共識(shí)。

結(jié)論

在沒有中心化權(quán)威機(jī)構(gòu)存在的P2P網(wǎng)絡(luò)上,比特幣共識(shí)協(xié)議功能上等同于一個(gè)受信任的中心化機(jī)構(gòu)。這個(gè)協(xié)議解決了拜占庭將軍問題中缺少中心化權(quán)威機(jī)構(gòu)的難題。幫組將軍在攻擊時(shí)間上達(dá)成共識(shí)。而且,它緩解了多個(gè)攻擊計(jì)劃同時(shí)提交的可能性,同時(shí)也降低了攻擊的可能性。因此比特幣共識(shí)協(xié)議現(xiàn)代拜占庭將軍中的問題。


?拜占庭將軍問題和Bitcoin?對(duì)比?
拜占庭將軍問題?BitCoin
攻擊時(shí)間上達(dá)成共識(shí)目標(biāo)對(duì)合法的交易達(dá)成共識(shí)
將軍分布在城堡周圍分布情況節(jié)點(diǎn)分布在網(wǎng)絡(luò)中
忠誠(chéng)的將軍和副官好的可信任的節(jié)點(diǎn)
叛徒壞的作惡節(jié)點(diǎn)
篡改消息(干擾忠誠(chéng)的將軍達(dá)成共識(shí))破壞向區(qū)塊中加入無效非法的交易
怎么才能知道那個(gè)消息是真的難點(diǎn)怎么才能知道那個(gè)交易是合法的
暫無解決方案Pow
暫無共識(shí)BlockChain + Pow



Pow?是如何運(yùn)行的

?

#!/bin/python

?

import sys

import time

import hashlib

from struct import unpack, pack

?

timestamp = str(time.time()) ????????????????? # Work timestamp

message = "This is a random message." ????? # Plaintext message

nonce = 0????????????????????????????

guess = 99999999999999999999

payload = timestamp + message

throttle = 100000000

target = 2**64 / throttle

?

payloadHash = hashlib.sha256(payload).digest()

?

start = time.time()

while guess > target:

???????? nonce += 1

???????? guess,=unpack('>Q',hashlib.sha256(hashlib.sha256(pack('>Q',nonce)+payloadHash).digest()).digest()[0:8])

???????? print(guess);

end = time.time()

?

print "%s:%s:%s:%s:%s:%s:%s" % (timestamp, message, nonce, guess, payload, target, end-start)

?

?

l??timestamp?開始產(chǎn)生區(qū)塊的時(shí)間戳

l??message?類似比特別中的交易,這里只做演示用字符串替代

l??payload?is a combination of the things that you will encrypt.

l??nonce?會(huì)從0N遞增,直到找到target為止

l??guess?將會(huì)保存謎底,一開始初始化為無窮大

l??throttle?相當(dāng)于比特幣中的難度

l??target?8個(gè)字節(jié)的整數(shù)最大值?2^64)除以難度(throttle?

?

Timestampmessagepayload是你要發(fā)送到網(wǎng)絡(luò)中的東西。它可以是區(qū)塊數(shù)據(jù)

Nonce,guess,throttle target是用來進(jìn)行工作量證明運(yùn)算。Pow最重要的是難于生成易于驗(yàn)證。

?

while guess > target:

???????? nonce += 1

???????? guess,=unpack('>Q',hashlib.sha256(hashlib.sha256(pack('>Q',nonce)+payloadHash).digest()).digest()[0:8])

?

這三行就是Pow算法主要內(nèi)容。這是一個(gè)簡(jiǎn)單的循環(huán)。它使用SHA256對(duì)數(shù)據(jù)進(jìn)行兩輪哈希。前八個(gè)字節(jié)作為我們的謎底。

?

比特幣的除數(shù)(難度)2016個(gè)區(qū)塊后調(diào)整一次 增加或下降。上圖顯示隨著難度的增加正確謎底的可能值范圍縮小,也就是越難于發(fā)現(xiàn)Guess

nonce += 1

Nonce表示CPU的工作量,在本例子nonce?表示發(fā)現(xiàn)一個(gè)低于target的guess的累計(jì)工作量。因?yàn)槊恳粋€(gè)guess都有相同的可能性會(huì)低于target,它和nonce生成的方式是無關(guān)的。所以nonce從0開始遞增比生成隨機(jī)數(shù)成本更低。當(dāng)區(qū)塊提交到網(wǎng)絡(luò)中,nonce會(huì)被用來證明區(qū)塊的正確性。

guess,=unpack('>Q',hashlib.sha256(hashlib.sha256(pack('>Q',nonce)+payloadHash).digest()).digest()[0:8])

Guess是把nonce和payload經(jīng)過兩輪SHA256哈希之后值的前8個(gè)字節(jié)。因?yàn)閠arget的范圍是0..2^8,所以guess不可能超過target.在每次循環(huán)后,nonce是唯一會(huì)改變的值。

向網(wǎng)絡(luò)中提交nonce是安全的。因?yàn)槊總€(gè)曠工的payload是獨(dú)一無二的。如果曠工Alice使用了曠工Bob提交的nonce,Alice需要提供相同的payload,由于Alice不能在payload把Bob的公鑰自己的公鑰,因?yàn)檫@會(huì)改變兩輪SHA256哈希的輸出。改變后的輸出就一定滿足小于target這個(gè)條件。由于Alice的payload不同于Bob的payload,所以Bob的nonce對(duì)Alice就不適用。


http://www.blockchainbrother.com/article/9

總結(jié)

以上是生活随笔為你收集整理的分布式共识四】POW共识算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。