比特幣白皮書翻譯-part3

比特幣白皮書翻譯-part3

比特幣白皮書翻譯-part3

編者按:本文由Peter 王廣忠的技術分享,轉載請註明來自Peter 王廣忠,並聯系作者獲得授權。Peter 王廣忠,程序員,專業區塊鏈講解員

接上一篇 Peter 王廣忠:比特幣白皮書翻譯-part2

8. 簡化的支付驗證

不運行全節點也可以去驗證支付。通過請求網絡上的各個節點,用戶可以獲取到他認為最長的那條工作量證明鏈。用戶只需要去保存最長鏈的區塊頭,並且拿到連接交易和給它加上時間戳的區塊的默克爾分支。用戶自己並不能去檢查交易,但是通過把交易定位到鏈上的一個特定位置,就可以看到的確有節點接受了這個交易,而之後的區塊則可以證明這個交易是被全網接受的。

比特幣白皮書翻譯-part3

這樣,只要誠實的節點控制網絡,那麼驗證就是可信的,但是在攻擊者掌握較多算力的情況下,這種驗證方式是比較脆弱的。全節點可以自己驗證交易,而使用簡化驗證這種方法的用戶就很可能被掌握更多算力的攻擊者偽造的交易所迷惑。防範這個問題的策略是去接收節點發過來的警告。當節點發現無效區塊的時候,它會提醒用戶的軟件去下載完整的區塊和被警告的交易,然後自己確認一下問題是否真的存在。需要頻繁交易的業務場景還是最好運行自己的節點,這樣可以保證更獨立的安全性和更快的驗證速度。

9. 價值的組合與分割

儘管可以對幣作單個的處理,但是如果轉賬的時候把每一分錢都單獨做個交易,就顯得太傻了。為了實現價值的合併和分割,交易中可以有多個輸入和輸出。一般來講,如果之前的有一個交易數額夠用的話,輸入就是一個,否則就會有幾個輸入,以便湊夠數額。輸出最多就是兩個:一個用來支付,如果需要找零,才會另外有一個輸出指向發出方。

比特幣白皮書翻譯-part3

需要指出的是,這種扇形展開的形式,也就是一個交易會依賴多個交易,同時那些交易又依賴更多的交易,並不會造成問題,因為永遠沒有必要去抽出一個交易的完整且獨立的歷史。

10. 隱私

傳統的銀行模式達成隱私的方式是限制公眾訪問交易雙方以及可信第三方的信息。我們這裡因為需要對公眾宣佈所有的交易,這種方法就不可行了。但是通過保證公鑰持有者匿名,依然可以切斷信息流從而獲得隱私。公眾可以看到發送方轉了多大的數額給接收方,但是不能確認雙方的真實身份。這跟股票交易所發佈信息的隱私水平類似,可以讓公眾知道每個交易的時間和金額,但是不說出是誰在交易。

比特幣白皮書翻譯-part3

為了再增加一層安全,每次交易的時候都應該更換密鑰對,這樣就可以避免所有的信息都指向同一個人。對於有多個輸入的交易,有些指向還是避免不了的,這樣就必然會被識別出這些交易的輸入都是屬於同一個人的。這裡的最大的危險是,如果一旦一個密鑰的擁有者被曝光了,這種指向性會暴露這個人的其他密鑰對應的交易。

11. 計算

我們來思考一下攻擊者試圖去生成另一條鏈,並讓他的鏈的延長速度快於誠實鏈的情況。即使攻擊者做到了這一點,也不意味著可以對系統做任意的修改,例如憑空生成新幣,或者把從來不屬於自己的幣轉給自己。節點不能用無效的交易來進行支付,誠實的節點也絕不會接受包含無效交易的區塊。攻擊者唯一能做的就是通過修改自己的交易來把最近花掉的錢弄回來。

誠實鏈和攻擊鏈的競賽可以用二叉樹隨機漫步來描述。成功事件是誠實鏈延長了一個區塊,讓自己的優勢加1,失敗事件是攻擊者的鏈延長了一個區塊,把差距減1。

落後特定距離的攻擊者追上來的概率很類似賭徒破產問題。假定賭徒已經欠下了一些錢,但是擁有無限的透支信用,可以無限次的去賭來把錢還上。通過如下方法可以計算出賭徒能還上錢或者是攻擊者可以追上誠實鏈的概率:

比特幣白皮書翻譯-part3

假定 p>q ,概率會隨著需要追趕的區塊數量的增加而呈指數減小。由於他每次贏的機會都是偏小的,如果開始的時候它沒能特別走運而迅速翻身,後面隨著他落後的更遠,能夠追上的機會就幾乎不存在了。

現在我們來思考交易接收方需要等多久才能足夠確信發送方不能更改交易了。我們假定發送方是一個攻擊者,他想要讓接收方相信他已經支付,然後等一會兒卻又會把錢弄了回來。雖然收款人早晚會知道自己上當了,不過攻擊者希望那時已經太晚了。

接收方生成一對新的鑰匙,並要求發送方收到公鑰後立即簽署交易進行轉賬。否則就可能形成這樣的情況:發送方先偷偷運算幾個區塊出來,如果夠幸運他很有可能讓自己的鏈比大家的鏈領先足夠多的區塊,然後他才簽署一個把錢轉給接收方交易並廣播。但是當交易發出後,發送方繼續在自己私藏的那條鏈上運算,而這條鏈上的交易中不包含給接收者的那次轉賬。

接收者會等待交易被區塊收錄,並且後續已經延長了 z 個區塊。他不知道攻擊者的那條鏈上已經延長了幾個區塊了,假定生成每個區塊需要一個平均期待時間,攻擊者的延長數量滿足泊松分佈,期望值是:

比特幣白皮書翻譯-part3

為了得到攻擊者仍然能夠追上的概率,我們將攻擊者每個延長數量對應的泊松密度,乘以在該數量下依然能夠追趕上的概率:

比特幣白皮書翻譯-part3

重新整理,避免對無限數列求和:

比特幣白皮書翻譯-part3

轉換為 C 語言程序:

#include <math.h>
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
/<math.h>

運算部分結果,可以看到隨著 z 的增加,概率呈指數下降:

q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024

z=50 P=0.0000006

要保證 P 小於 0.1% …

P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340

12. 總結

我們提出了一個不依賴於信任的電子交易系統。首先引入了通過數字簽名實現的常見加密貨幣框架,這個框架可以保證明確的所有權,但是不能防止雙花。為此,我們提出了一個通過工作量證明來記錄交易歷史的一個點對點網絡,只要大部分的 CPU 算力被誠實節點掌握,就能使得攻擊者實際中難以改變交易記錄。網絡自身沒有任何結構限制,這種簡約保證了它的容錯能力。各個節點同時工作但是不需要進行任何的協調。節點也不需要標明身份,因為信息發送沒有明確的目的地,只需要儘可能廣泛的傳播即可。節點可以隨意的進出網絡,當重新加入網絡後,只要接受工作量證明鏈作為離開的這段時間內所發生的事情即可。節點通過 CPU 算力來投票,如果表示接受一些有效區塊,就會繼續延長它們,反之如果拒絕延長,就表示認為這些區塊是無效的。任何必要的規則和激勵都可以通過這種共識機制來推行。


分享到:


相關文章: