區(qū)塊鏈這個(gè)東西是好癣丧,但區(qū)塊越深,通過創(chuàng)建新鏈來替換它所需要的計(jì)算量就越大洪灯。鏈條越長坎缭,運(yùn)行攻擊的代價(jià)就越昂貴。這就是一個(gè)矛盾签钩。那么,到底能不能把它做小呢坏快?Google工程師這篇文章將對最小可行性區(qū)塊鏈原理進(jìn)行深入解析铅檩,希望對你有所幫助。
加密貨幣莽鸿,特別是比特幣昧旨,幾乎從各個(gè)方面都得到了大量關(guān)注:規(guī)則、管理祥得、稅務(wù)兔沃、技術(shù)、產(chǎn)品創(chuàng)新等等级及,不勝枚舉乒疏。“點(diǎn)對點(diǎn)(去中心化)電子現(xiàn)金系統(tǒng)”的概念顛覆了我們以前對貨幣和金融所持有的設(shè)想饮焦。
圖1
即便如此怕吴,把數(shù)字貨幣方面擱到一邊窍侧,還有一個(gè)可以說是更有趣更深遠(yuǎn)的創(chuàng)新,即底層的區(qū)塊鏈技術(shù)转绷。無論你對比特幣或是它的山寨幣衍生品有什么看法伟件,作為一種貨幣和價(jià)值存儲(chǔ)手段,它們背后的運(yùn)作基礎(chǔ)都來自于中本聰概括的區(qū)塊鏈原理:
我們運(yùn)用點(diǎn)對點(diǎn)網(wǎng)絡(luò)提出了重復(fù)花費(fèi)問題的解決方案议经。網(wǎng)絡(luò)通過將交易散列到一個(gè)進(jìn)行中的基于散列的工作量證明鏈斧账,來對交易進(jìn)行時(shí)間戳標(biāo)記,并形成一個(gè)記錄煞肾,這個(gè)記錄只有在重做工作量證明的情況下才能被改變咧织。最長的鏈不僅作為它所見證事件發(fā)生時(shí)序的證據(jù),而且也證明它來自最大的CPU功率池……網(wǎng)絡(luò)本身要求架構(gòu)最小化扯旷。
區(qū)塊鏈對任何“貨幣”都是不可知的拯爽。事實(shí)上,它可以適用于促成很多其他使用案例钧忽。因此毯炮,理解“最小可行區(qū)塊鏈”背后的方法和原理是有好處的:
以下將從頭開始解釋為什么需要特定的部分(數(shù)字簽名、工作量證明耸黑、交易區(qū)塊)桃煎,以及它們?nèi)绾渭掀饋硇纬删哂凶吭叫阅艿摹白钚】尚袇^(qū)塊鏈”。
用三式記賬法保障交易安全
Alice和Bob是集郵愛好者大刊,偶爾會(huì)做做交易为迈。如果雙方都看到喜歡的東西,可以當(dāng)場協(xié)商完成交換缺菌。換言之葫辐,這是個(gè)簡單的以物易物的系統(tǒng)。
有一天Bob拿來一枚郵票伴郁,Alice覺得她必須要收藏耿战,但問題是Bob對Alice所提供的交換物不是特別感興趣。Alice沮喪不已焊傅,她繼續(xù)和Bob協(xié)商剂陡,最后達(dá)成一致:他們做個(gè)單方交易,Bob先把郵票給Alice狐胎,Alice承諾以后再償還Bob鸭栖。
Bob和Alice已經(jīng)認(rèn)識(shí)有一陣子了, 但是為了確保兩個(gè)人都信守承諾(主要是Alice)握巢,他們同意讓朋友Chuck來對交易“進(jìn)行公證”晕鹊。
圖2
他們把圖2這個(gè)可以表明Bob給了Alice一枚“紅色郵票”的交易收據(jù)做了三個(gè)副本(三方各持一份)。Bob和Alice可以用收據(jù)來記錄他們的交易, Chuck存儲(chǔ)副本作為交易證據(jù)捏题。這個(gè)設(shè)定很簡單玻褪,但其中有一些很重要的屬性:
1. Chuck可以鑒定Alice和Bob兩個(gè)人的真實(shí)性,以確保不會(huì)有人在他們不知情的情況下蓄意偽造交易公荧。
2. Chuck賬簿中的收據(jù)證明了交易發(fā)生带射。如果Alice聲稱交易從未發(fā)生,那么Bob可以去找Chuck循狰,用他的收據(jù)來證明Alice說謊窟社。
3. 如果Chuck的賬簿中沒有收據(jù),就證明交易未發(fā)生過绪钥。Alice和Bob都不能偽造交易灿里。他們可以偽造交易收據(jù),聲稱對方說謊程腹,但同樣的匣吊,他們可以去找Chuck,查看他的賬簿寸潦。
4. Alice和Bob都不能篡改當(dāng)前的交易色鸳。如果任意一方篡改了交易,他們可以去Chuck那兒见转,用儲(chǔ)存在Chuck賬簿中的副本核實(shí)他們的副本命雀。
以上操作就是“三式記賬法”,操作簡便斩箫,對參與雙方都能提供很好的保障吏砂。但你也看到了它的缺點(diǎn),對吧乘客?我們對中間人寄予了很大的信任狐血。如果Chuck決定和另一方串通,那么整個(gè)系統(tǒng)就土崩瓦解了易核。
用公鑰基礎(chǔ)設(shè)施(PKI)保障交易安全
Bob不滿于使用“可靠中間人”的不安全性氛雪,他決定研究一下,發(fā)現(xiàn)公鑰密碼可以免去使用中間人的需要耸成!這里解釋一下:
公鑰密碼,也叫做不對稱密碼浴鸿,指的是一種密碼算法井氢,它需要兩個(gè)單獨(dú)的鑰匙,一個(gè)是秘密的(私有的)岳链,另一個(gè)是公共的花竞。盡管這個(gè)鑰匙對應(yīng)的兩部分不同,但有數(shù)學(xué)聯(lián)系。公鑰用于對純文本加密或者查驗(yàn)數(shù)字簽名约急;私鑰用于解密密碼文本或者創(chuàng)建數(shù)字簽名零远。
運(yùn)用第三方(Chuck)的原本意圖是要確認(rèn)有三個(gè)屬性:
1. 驗(yàn)證真實(shí)性: 不能有惡意的一方偽裝成其他人。
2. 不可否認(rèn)性: 事實(shí)發(fā)生后厌蔽,參與方不能聲稱交易沒有發(fā)生過牵辣。
3. 完整性:事實(shí)發(fā)生后,不能再修改交易收據(jù)奴饮。
結(jié)果是纬向,公鑰密碼可以滿足以上所有要求。簡單地說戴卜,工作流程如圖3所示逾条。
圖3
1. Alice和Bob分別生成一個(gè)固定的公鑰-私鑰對。
2. Alice和Bob公布出他們的公鑰投剥。
3. Alice以純文本的形式寫一個(gè)交易收據(jù)师脂。
4. Alice用她的私鑰對交易信息的純文本進(jìn)行加密。
5. Alice在密碼文本上添加一個(gè)“由……簽名”的純文本備注江锨。
6. Alice和Bob都儲(chǔ)存相應(yīng)的輸出結(jié)果吃警。
注意只有在多方參與的時(shí)候才需要第五步:如果你不知道是誰簽署了信息,就不知道該用誰的公鑰來解密泳桦,這個(gè)問題很快就會(huì)變得有關(guān)緊要汤徽。
這看起來像是沒什么特別理由的大量工作,但我們還是來檢驗(yàn)一下新收據(jù)的屬性:
1. Bob不知道Alice的私鑰灸撰,但問題不大谒府,因?yàn)樗梢圆樵兯墓€(公鑰是全世界共享的),然后用公鑰來解密交易的密碼文本浮毯。
2. Alice并不是真的在給交易內(nèi)容“加密”完疫,而是通過使用她的私鑰給她“簽名”的交易編碼:任何人都可以用她的公鑰對密碼文本進(jìn)行解密,由于她是唯一擁有私鑰的人债蓝,這個(gè)機(jī)制保證了只有她能生成交易的秘密文本壳鹤。
Bob或針對這個(gè)問題的任何其他人,如何獲得Alice的公鑰饰迹?有很多種方法來分發(fā)私鑰——例如芳誓,Alice公布在她的網(wǎng)站上。我們可以假定有這樣的合適的機(jī)制啊鸭。
因此锹淌,使用公鑰基礎(chǔ)設(shè)施(PKI)可以滿足我們之前所有的要求:
1. Bob可以用Alice的公鑰通過解密密碼文本來證明簽名交易的真實(shí)性。
2. 只有Alice知道她的私鑰赠制,因此Alice不能否認(rèn)交易的發(fā)生——她已經(jīng)簽名了赂摆。
3. 沒有Alice的私鑰,Bob或任何其他人都不能偽造或修改交易。
4. 注意第二條烟号,Alice可以否認(rèn)她是那個(gè)有爭議的公鑰——私鑰對的真正所有者绊谭。
5. Alice和Bob只儲(chǔ)存了簽名交易的副本,消除了對中間人的需要。“神奇”的公鑰密碼和雙方以物易物系統(tǒng)完美匹配逞泄。
余額 = Σ(收據(jù))
隨著公鑰基礎(chǔ)設(shè)施到位且轨,Bob和Alice又完成了一些交易:Alice從Bob處得到另一張郵票,Bob從Alice那兒也挑了一張郵票。它們都按照與之前相同的步驟,生成簽名交易并將它們附加到各自的分類賬簿中。
圖4
記錄是安全的逊朽,但有一個(gè)小問題:不清楚是否任何一方有未結(jié)余額。先前只有一個(gè)交易曲伊,很清楚是誰欠誰的(Alice欠Bob)以及欠了多少(一枚紅色郵票)叽讳,但是有多個(gè)交易以后,情況變得模糊起來坟募。所有的郵票都是等值的嗎岛蚤?如果是,那么Alice有一個(gè)負(fù)余額懈糯。如果不是涤妒,那就誰也說不準(zhǔn)了!為了解決這個(gè)問題赚哗,Alice和Bob達(dá)成一致如下:
1. 黃色郵票的價(jià)值是紅色郵票的兩倍她紫。
2. 藍(lán)色郵票和紅色郵票等值。
最后為了確保他們新協(xié)議的安全性屿储,他們用交易的相對值更新了每個(gè)交易贿讹,重新生成了分類賬簿。新的賬簿看起來像圖5那樣够掠。
圖5
這樣民褂,計(jì)算最終余額現(xiàn)在變成了一個(gè)簡單的事,循環(huán)訪問所有的交易疯潭,將適當(dāng)?shù)慕栀J記錄應(yīng)用于各方赊堪。最終結(jié)果是Alice欠Bob 2個(gè)“價(jià)值單位”。什么是“價(jià)值單位”竖哩? 它是由Alice和Bob都同意的任意交換媒介雹食,另外,由于“價(jià)值單位”并不耳熟能詳期丰,Alice和Bob同意將1個(gè)價(jià)值單位稱為1個(gè)chroma(復(fù)數(shù)形式:chroms)。
上面這些看起來都是小事,但每一個(gè)參與者的余額都是分類賬簿中所有收據(jù)的一個(gè)函數(shù)這一事實(shí)有重要的意義:任何人都可以計(jì)算大家的余額钝荡。不需要任何可靠的中間人街立,也不必對系統(tǒng)進(jìn)行審計(jì)。任何人都可以遍歷整個(gè)分類賬簿埠通,核實(shí)交易赎离,計(jì)算出每一方的未結(jié)余額。
多方轉(zhuǎn)移和驗(yàn)證
接下來端辱,Bob無意中發(fā)現(xiàn)John有一枚郵票梁剔,他實(shí)在很喜歡。他告訴John他和Alice在使用的安全分類賬簿舞蔽,并問他是否愿意做個(gè)交易荣病,Bob把Alice欠他的余額作為支付手段轉(zhuǎn)移給John——即Bob從John那兒獲得郵票,Alice之前欠Bob的金額將變成她欠John的渗柿。John同意了个盆,但現(xiàn)在他們有個(gè)問題:Bob如何能以安全和可驗(yàn)證的方式把他的余額“轉(zhuǎn)移”給John?經(jīng)過一番協(xié)商朵栖,他們想出一個(gè)巧妙的計(jì)劃(如圖6所示)颊亮。
圖6
Bob按照與之前相同的步驟創(chuàng)建了一個(gè)新交易,不過他先計(jì)算出他想要轉(zhuǎn)移的加密交易的SHA-256校驗(yàn)和(一個(gè)唯一的指紋)陨溅,然后將校驗(yàn)和嵌入新收據(jù)中“是什么”一欄终惑。事實(shí)上,他在將之前與Alice的交易與新的轉(zhuǎn)移收據(jù)鏈接起來门扇,這樣就把它的價(jià)值轉(zhuǎn)移給了John雹有。
為了保持事物的簡單性,我們假定所有的轉(zhuǎn)移都會(huì)“消費(fèi)掉”被轉(zhuǎn)移交易的全部價(jià)值悯嗓。要把這個(gè)系統(tǒng)擴(kuò)展到使部分轉(zhuǎn)移成為可能并不難件舵,但此時(shí)沒有必要考慮得那么復(fù)雜。
隨著新交易到位脯厨,John為了安全起見铅祸,做了一個(gè)加密分類賬簿的副本(現(xiàn)在有三個(gè)副本)并運(yùn)行了一些檢查來驗(yàn)證它的完整性:
1. John提取了Alice和Bob的公鑰,驗(yàn)證前三個(gè)交易的真實(shí)性合武。
2. John證實(shí)了Bob轉(zhuǎn)移的是一個(gè)“有效”交易:
2-1. 待轉(zhuǎn)移交易的地址是Bob临梗。
2-2. Bob此前沒有把這個(gè)交易轉(zhuǎn)移給任何其他人。
如果所有檢查都通過了稼跳,他們就完成交易盟庞,我們可以通過遍歷分類賬簿來計(jì)算新的余額:Bob有一個(gè)凈零數(shù)余額,Alice有2個(gè)chroma的借額汤善,John有2個(gè)chroma的貸額(由Alice提供)什猖。這樣John現(xiàn)在就可以把他的新分類賬簿拿給Alice并要求她支付票彪,即使Alice沒有出席交易,也沒有問題:
1. Alice可以用Bob的公鑰核實(shí)新轉(zhuǎn)移交易的簽名不狮。
2. Alice可以核實(shí)轉(zhuǎn)移的交易是對她和Bob一個(gè)有效交易的引用降铸。
以上轉(zhuǎn)移和驗(yàn)證過程是系統(tǒng)一個(gè)了不起的屬性!注意要讓它全部能工作摇零,我們需要兩個(gè)使能技術(shù):一個(gè)是公鑰基礎(chǔ)設(shè)施的運(yùn)用推掸,使數(shù)字簽名驗(yàn)證成為可能;另一個(gè)是收據(jù)賬簿驻仅,使我們能夠查看完整的交易記錄以驗(yàn)證余額并鏈接先前的交易來進(jìn)行轉(zhuǎn)移谅畅。
John和Bob對這個(gè)巧妙的解決辦法很滿意,然后兩人分頭回家:Bob帶著新郵票噪服,John有了新的分類賬簿毡泻。表面上看一切完美,但是他們剛剛把自己暴露在了一個(gè)極具挑戰(zhàn)性的安全問題之下……你發(fā)現(xiàn)了嗎芯咧?
重復(fù)消費(fèi)和分布式一致性
在與John完成交易后不久牙捉,Bob意識(shí)到他們剛剛在他們的系統(tǒng)中引入了一個(gè)嚴(yán)重的漏洞,如果他迅速行動(dòng)敬飒,就可以利用這個(gè)漏洞:Bob和John都更新了他們的分類賬簿來包括新的交易邪铲,但是Alice和其他任何人都不知道交易已經(jīng)發(fā)生。結(jié)果是无拗,沒有什么能阻止Bob接近網(wǎng)絡(luò)中的其他人带到,給他們展示舊的賬簿副本,而舊的賬簿副本里沒有他和John的交易英染!如果Bob說服他們進(jìn)行交易揽惹,就像他和John做的那樣,他就可以“重復(fù)消費(fèi)”同一個(gè)交易四康,想進(jìn)行多少次都可以搪搏!
圖7
當(dāng)然,一旦多人拿著新的分類帳簿要求Alice支付闪金,欺詐行為將被檢測到疯溺,但這已經(jīng)無濟(jì)于事了——Bob已經(jīng)帶著戰(zhàn)利品跑掉了!
只有兩個(gè)參與者的時(shí)候哎垦,不可能受到雙重消費(fèi)攻擊囱嫩,因?yàn)橐瓿山灰祝阋?yàn)證并同時(shí)更新兩個(gè)分類賬簿漏设,因此所有分類賬簿始終保持同步墨闲。然而當(dāng)我們再添加另外一個(gè)參與者時(shí),我們就引入了各參與者之間賬簿不完全和不一致的可能性郑口,這就使雙重消費(fèi)成為可能鸳碧。
在計(jì)算機(jī)科學(xué)語言中盾鳞,雙方分類賬簿具有“強(qiáng)一致性”,超過兩方的分類賬簿則需要某種形式的分布式一致性以解決雙重消費(fèi)的問題杆兵。
這個(gè)問題最簡單的可能的解決方案是要求分類賬簿中列出的各方都必須在每個(gè)新交易發(fā)生時(shí)都在場雁仲,以便每個(gè)人可以同時(shí)更新他們的賬簿。這個(gè)策略對小型的群組有效琐脏,但不能擴(kuò)展到有大量參與者的情況。
分布式一致性網(wǎng)絡(luò)的要求
我們來設(shè)想一下缸兔,我們想要將分類賬簿擴(kuò)展到全世界所有集郵者日裙,這樣任何人都可以用一種安全的方式交易他們喜歡的郵票。顯然惰蜜,由于地理位置昂拂,時(shí)區(qū)和其他限制,要求每個(gè)參與者在每個(gè)交易登記的時(shí)候都在場是不可能實(shí)現(xiàn)的抛猖。我們能建立一個(gè)不需要每個(gè)人都在場批準(zhǔn)的系統(tǒng)嗎格侯?
1. 地理位置算不上一個(gè)真正的問題:我們可以把交流轉(zhuǎn)移到線上。
2. 時(shí)區(qū)問題可以通過軟件解決财著,我們不需要每個(gè)人手動(dòng)更新分類賬簿联四。相反,我們可以建立一個(gè)軟件撑教,它能在每個(gè)參與者的計(jì)算機(jī)上運(yùn)行并代表他們自動(dòng)接收朝墩、批準(zhǔn)以及向分類賬簿添加交易。
事實(shí)上伟姐,我們可以建立一個(gè)點(diǎn)對點(diǎn)(P2P)網(wǎng)絡(luò)收苏,負(fù)責(zé)分發(fā)新的交易并獲得每個(gè)人的批準(zhǔn)! 但很可惜愤兵,說起來容易做起來難鹿霸。例如,雖然P2P網(wǎng)絡(luò)可以解決我們的地理位置和時(shí)區(qū)問題秆乳,但試想即便只有一個(gè)參與者離線懦鼠,會(huì)出現(xiàn)什么情況? 我們是不是要阻止所有交易矫夷,直到他們再次上線葛闷?
注意,“如何”構(gòu)建P2P網(wǎng)絡(luò)本身就是一個(gè)龐大的課題双藕,構(gòu)建這樣一個(gè)網(wǎng)絡(luò)的底層機(jī)制也遠(yuǎn)超出我們討論的范圍……我們把它作為一個(gè)練習(xí)留給讀者淑趾。
圖8
原來分布式一致性的問題在計(jì)算機(jī)科學(xué)中已經(jīng)被深入研究過,并且已經(jīng)提出了一些有希望成功的解決方案忧陪。例如扣泊,兩階段提交(2PC)和Paxos都使這樣一種機(jī)制成為可能近范,即我們只需要參與者的大多數(shù)法定人數(shù)(50%以上)接受就能安全地提交新的交易:只要大多數(shù)人已經(jīng)接受交易,就能保證群組中剩下的人最終匯合在同一個(gè)交易歷史延蟹。
即便如此评矩,單單有2PC或Paxos是不夠的。比如阱飘,在每天都有新參與者加入而其他人不預(yù)先通知就消失的情況下斥杜,2PC或Paxos如何知道我們P2P集郵者網(wǎng)絡(luò)中的參與者總數(shù)?如果有一個(gè)先前的參與者離線沥匈,他們是臨時(shí)還是永久離線蔗喂? 相似地,還有另一個(gè)我們必須考慮的更具挑戰(zhàn)性的“Sybil攻擊”:沒有辦法阻止一個(gè)惡意參與者創(chuàng)建許多檔案高帖,以在我們的P2P網(wǎng)絡(luò)中獲取不公平的投票權(quán)份額缰儿。
如果系統(tǒng)中的參與者數(shù)量是固定的,并且已經(jīng)驗(yàn)證他們的身份真實(shí)有效(也就是說散址,這是一個(gè)可信網(wǎng)絡(luò))乖阵,那么2PC和Paxos都會(huì)工作得很好。但我們不斷變化的集郵者P2P網(wǎng)絡(luò)并不是這樣的情況预麸。我們走進(jìn)死胡同了嗎瞪浸? 嗯,并不盡然……
這個(gè)問題有個(gè)明顯的解決方案是從問題陳述中消除“分布的”部分师崎。我們可以不建立一個(gè)P2P分布式系統(tǒng)默终,而是建立一個(gè)所有集郵者的全局注冊表,記錄他們的帳戶信息犁罩,對他們進(jìn)行驗(yàn)證并(嘗試)確保沒人能通過創(chuàng)建多個(gè)身份作弊齐蔽,最重要的是,保證有一個(gè)共享的分類賬簿副本床估!具體來說含滴,我們可以建立一個(gè)網(wǎng)站,這些交易在網(wǎng)站上進(jìn)行丐巫,網(wǎng)站將在它的集中式數(shù)據(jù)庫里記錄所有的交易谈况,以此確保交易的完整性和正確排序。
以上是一個(gè)實(shí)用的解決方案递胧,但我們得承認(rèn)碑韵,它不盡如人意,因?yàn)樗仁刮覀兪チ朔诸愘~簿系統(tǒng)點(diǎn)對點(diǎn)的性質(zhì)缎脾。它將所有的信任置于一個(gè)單一的集中式系統(tǒng)祝闻,這就帶來了一組全新的問題:什么是系統(tǒng)的正常運(yùn)行時(shí)間,安全性和冗余遗菠;誰來維護(hù)系統(tǒng)联喘,他們維護(hù)系統(tǒng)的動(dòng)因是什么华蜒;誰有管理訪問權(quán)限等等。集中式帶來了它自己的一系列挑戰(zhàn)豁遭。
讓我們回顧一下在P2P設(shè)計(jì)中遇到的一些問題:
1. 確保每個(gè)參與者始終保持更新狀態(tài)(強(qiáng)一致性系統(tǒng))會(huì)產(chǎn)生很高的協(xié)調(diào)成本叭喜,影響可用性。如果單個(gè)點(diǎn)不可達(dá)蓖谢,整個(gè)系統(tǒng)都無法提交新交易捂蕴。
2. 在實(shí)踐中,我們不知道P2P網(wǎng)絡(luò)的全局狀態(tài):參與者人數(shù)闪幽,個(gè)體是暫時(shí)離線還是決定離開網(wǎng)絡(luò)等启绰。
3. 假設(shè)我們可以解決上述限制,系統(tǒng)仍然可能受到Sybil攻擊沟使,惡意用戶可以偽造許多身份行使不公平的投票權(quán)。
不幸的是渊跋,解決上述所有限制是不可能的腊嗡,除非我們放松一些要求: CAP定理告訴我們,我們的分布式系統(tǒng)不能有很強(qiáng)的一致性拾酝,可用性和分區(qū)容忍性燕少。因此在實(shí)踐中,我們的P2P系統(tǒng)必須在(更)弱一致性的假設(shè)下操作并克服它可能帶來的影響:
1. 我們必須接受一些分類賬簿不同步(至少是暫時(shí)不同步)蒿囤;
2. 系統(tǒng)最終必須收斂于所有交易的整體序(線性一致性)客们;
3. 系統(tǒng)必須以可預(yù)測的方式解決分類賬簿沖突;
4. 系統(tǒng)必須強(qiáng)制執(zhí)行全局不變量——例如材诽,沒有重復(fù)消費(fèi)底挫;
5. 系統(tǒng)應(yīng)該免受Sybil和類似的攻擊。
保護(hù)網(wǎng)絡(luò)免受Sybil攻擊
在分布式系統(tǒng)中實(shí)現(xiàn)一致性脸侥,比如通過對每個(gè)參與者的投票計(jì)數(shù)建邓,會(huì)出現(xiàn)很多關(guān)于各節(jié)點(diǎn)“投票權(quán)”的問題:允許誰參與,某些節(jié)點(diǎn)是否有更多的投票權(quán)睁枕,是否每個(gè)人都平等官边,以及我們?nèi)绾螐?qiáng)制執(zhí)行這些規(guī)則?
為了保持簡單外遇,我們假定每個(gè)人的投票是平等的注簿。第一步,我們可以要求每個(gè)參與者用私鑰在他們的投票上簽名跳仿,就像在他們的交易收據(jù)上簽名一樣诡渴,并將投票傳播到他們的節(jié)點(diǎn)上——在投票上簽名確保了別人不能代表他們投票。然后我們可以制定一個(gè)規(guī)則塔嬉,只允許提交一票玩徊。如果同一個(gè)鑰匙簽名了多個(gè)投票租悄,那么所有的投票都作廢——已經(jīng)下定決心!到目前為止還好恩袱,現(xiàn)在難的部分來了……
最開始我們怎么知道允許哪個(gè)特定的節(jié)點(diǎn)參與泣棋?如果只需要一個(gè)獨(dú)特的私鑰來簽名投票,那么惡意用戶可以簡單地生成無限的新密鑰充斥網(wǎng)絡(luò)畔塔。根本問題是潭辈,當(dāng)生成和使用偽造身份很便宜時(shí),任何投票系統(tǒng)都很容易被顛覆澈吨。
為了解決這個(gè)問題把敢,我們需要使提交投票的過程變得“昂貴”。提高生成新身份的成本谅辣,或者提交投票的過程必須產(chǎn)生足夠高的成本修赞。為了讓問題更明確,我們來想幾個(gè)現(xiàn)實(shí)世界的例子:
1. 你在當(dāng)?shù)卣x舉中投票時(shí)桑阶,會(huì)要求你出示身份證件(例如護(hù)照)柏副,而偽造身份證件的成本很高(希望如此)。理論上蚣录,沒什么能阻止你生成多個(gè)偽造的身份證件割择,但如果成本足夠高(偽造的貨幣成本,被抓的風(fēng)險(xiǎn)等)萎河,那么運(yùn)行Sybil攻擊的成本將遠(yuǎn)大于其收益荔泳。
2. 或者,假設(shè)提交投票給你帶來了一些其他成本(例如支付費(fèi)用)虐杯。如果成本足夠高玛歌,那么再次的,運(yùn)行大規(guī)模Sybil攻擊的障礙也增強(qiáng)了厦幅。
注意沾鳄,上述例子都不能完全“解決”Sybil攻擊,但它們也不需要被完全解決确憨。只要我們將攻擊的成本提高到大于成功破壞系統(tǒng)所能得到的值译荞,那么系統(tǒng)就是安全的,會(huì)按照預(yù)期運(yùn)行休弃。
注意吞歼,我們所使用的“安全”的定義是很寬松的。系統(tǒng)仍然會(huì)受到操縱塔猾,確切的投票計(jì)數(shù)會(huì)受到影響篙骡,但關(guān)鍵是惡意參與者不能影響最終的結(jié)果。
參與所要求的工作量證明
任何用戶都可以通過生成新的私鑰—公鑰對來輕易地(并且花很少的錢)在我們的P2P網(wǎng)絡(luò)中生成新的“身份”。同樣糯俗,任何用戶都可以用他們的私鑰簽名投票并將其發(fā)送到P2P網(wǎng)絡(luò)——這也很便宜尿褪,我們的收件箱中大量的垃圾郵件清楚地說明了這一點(diǎn)。 因此得湘,提交新的投票很便宜杖玲,惡意用戶可以輕易地用盡可能多的投票淹沒網(wǎng)絡(luò)。
但是淘正,如果將以上其中一個(gè)步驟變得昂貴摆马,使你不得不消耗更多的精力、時(shí)間或金錢鸿吆,情況會(huì)怎樣呢囤采? 這就是工作量證明背后的核心思想:
1. 工作量證明步驟對于發(fā)送者來說應(yīng)該是“昂貴的”。
2. 他人驗(yàn)證工作量證明的步驟應(yīng)該是“便宜的”惩淳。
這樣一種方法有很多種可能的執(zhí)行方式蕉毯,但是為了達(dá)到我們的目的,我們可以再次使用之前遇到的密碼散列函數(shù)的屬性(如圖9所示)思犁。
圖9
1. 很容易計(jì)算任何給定消息的散列值恕刘。
2. 生成具有給定散列值的消息很昂貴。
我們可以在我們的系統(tǒng)中施加一個(gè)新規(guī)則抒倚,要求每個(gè)簽名投票必須具有以特定子串開始的散列值,即需要部分散列沖突坷澡,比如兩個(gè)零的前綴托呕。如果這看起來完全是任意的,那是因?yàn)樗_實(shí)是任意的频敛。跟著我的思路项郊,我們通過幾個(gè)步驟來看看這是如何生效的:
1. 我們假定一個(gè)有效的投票陳述是個(gè)簡單的字符串:"I vote for Bob" (“我投票給Bob”)。
2. 我們可以用同樣的SHA-256算法來為我們的投票生成一個(gè)散列值斟赚。
sha256("I vote for Bob") → b28bfa35bcd071a321589fb3a95cac...
3. 生成的散列值無效因?yàn)樗鼪]有以我們要求的兩個(gè)零子串開頭着降。
4. 我們修改一下投票陳述,附加一個(gè)任意字符串再試一下:
sha256("I vote for Bob - hash attempt #2") → 7305f4c1b1e7...
5. 生成的散列值也不滿足我們的條件拗军,我們更新值任洞,一次又一次地嘗試…… 155次嘗試之后我們最終得到了:
sha256("I vote for Bob - hash attempt #155") → 008d08b8fe...
上述工作流程的關(guān)鍵屬性是,每次我們修改完輸入发侵,加密散列函數(shù)(在這種情況下是SHA-256)的輸出是完全不同的:當(dāng)我們增加計(jì)數(shù)時(shí)交掏,前一次嘗試的散列值并不能透露下一次嘗試所得到的散列值的任何信息。因此刃鳄,生成有效投票并不僅僅是個(gè)“難的問題”盅弛,我們可以把它比喻成彩票,每次新嘗試都會(huì)給你一個(gè)隨機(jī)的輸出。同時(shí)我們也可以通過更改所需前綴的長度來調(diào)整彩票的賠率:
1. SHA-256校驗(yàn)和中的每個(gè)字符都有16個(gè)可能的值: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f.
2. 為了生成有兩個(gè)零前綴的有效散列挪鹏,發(fā)送者平均需要256 (16^2)次嘗試见秽。
3. 將要求變?yōu)?個(gè)零平均會(huì)需要1,000,000 (16^5) 多次嘗試……關(guān)鍵是,我們可以輕易提高成本讨盒,讓發(fā)送者找到一個(gè)有效散列需要耗費(fèi)更多CPU周期解取。
我們可以在一個(gè)現(xiàn)代CPU上計(jì)算多少個(gè)SHA256校驗(yàn)和?它的成本取決于信息大小催植,CPU 架構(gòu)和其他變量肮蛹。如果你對此感到好奇,可以打開控制臺(tái)创南,運(yùn)行一個(gè)基準(zhǔn)測試程序: $> openssl speed sha.
最終結(jié)果是伦忠,生成有效投票對于發(fā)送者來說是“昂貴的”,但對于接收者驗(yàn)證仍然是微不足道的稿辙。接收者散列交易(一次運(yùn)算)并且核實(shí)校驗(yàn)和中包含所需的散列沖突前綴……太好了昆码,那么這對我們的P2P系統(tǒng)有什么用呢?上述工作證明機(jī)制使我們能夠調(diào)整提交投票的成本邻储,從而使破壞系統(tǒng)的總成本(即假冒足夠多的有效投票來確保特定結(jié)果)高于攻擊系統(tǒng)能夠獲得的價(jià)值赋咽。
注意,“生成消息的高成本”在很多其他環(huán)境中是個(gè)有用的屬性吨娜。例如脓匿,垃圾郵件能夠運(yùn)作恰恰是因?yàn)樯尚畔⑻貏e便宜。如果我們可以提高發(fā)送電子郵件的成本宦赠,例如要求工作量證明簽名陪毡,那么我們可以通過使成本高于利潤來打破垃圾郵件的商業(yè)模式。
建立最小可行區(qū)塊鏈
我們已經(jīng)談到了很多基礎(chǔ)內(nèi)容勾扭。在討論區(qū)塊鏈如何幫助我們構(gòu)建安全的分布式賬簿之前毡琉,我們來快速地扼要概述一下我們的網(wǎng)絡(luò)設(shè)定,屬性和待解決的挑戰(zhàn)(如圖10所示):
圖10
1. Alice和Bob完成交易并記錄在各自的分類賬簿中妙色。 完成后桅滋,Bob有一個(gè)來自Alice的受公鑰基礎(chǔ)設(shè)施保障的借據(jù)。
2. Bob和John完成一個(gè)交易身辨,他將Alice的收據(jù)轉(zhuǎn)移給John丐谋。Bob和John都更新了賬簿,但是Alice對交易尚不知情煌珊。
2-1. 皆大歡喜的情景:John要求Alice償還他的新借據(jù)笋鄙,然后Alice得到Bob的公鑰,核實(shí)了他的交易怪瓶,如果交易有效萧落,她向John支付所需金額践美。
2-2. 不太歡樂的情景:Bob用沒有記錄他和John交易的舊賬簿與Katy創(chuàng)建了一個(gè)重復(fù)消費(fèi)交易,然后Katy和John同時(shí)出現(xiàn)在Alice家卻發(fā)現(xiàn)只有一個(gè)人能得到報(bào)償找岖。
由于分布式賬簿的“弱一致性”陨倡,重復(fù)消費(fèi)是有可能的:Alice和Katy都不知道John和Bob之間的交易,這就使Bob利用了不一致性為自己謀利许布。有解決辦法嗎兴革?如果網(wǎng)絡(luò)很小,所有參與者都是已知的蜜唾,那么我們可以要求每個(gè)交易在被認(rèn)定為有效前必須被網(wǎng)絡(luò)“接受”:
1. 全體一致:每當(dāng)交易發(fā)生時(shí)杂曲,雙方聯(lián)系所有其他參與者,告知他們交易的有關(guān)內(nèi)容袁余,等所有參與者“同意”后才能提交交易擎勘。因此,所有分類賬簿同時(shí)更新颖榜,不可能發(fā)生重復(fù)消費(fèi)棚饵。
2. 法定人數(shù)一致:提高網(wǎng)絡(luò)的處理速度和可用性(即如果有人離線,仍然可以處理交易)掩完,我們可以將上述全體一致的情況放寬到法定人數(shù)一致(整個(gè)網(wǎng)絡(luò)的50%)噪漾。
對于參與者已知且已核實(shí)的小型網(wǎng)絡(luò),以上任何一個(gè)策略都能立即解決問題且蓬。然而欣硼,兩種策略都不能擴(kuò)展應(yīng)用于更大型的動(dòng)態(tài)網(wǎng)絡(luò),因?yàn)樵谌魏螘r(shí)間點(diǎn)都無法得知參與者的總數(shù)和他們的身份:
1. 我們不知道要聯(lián)系多少人來獲得他們的同意恶阴。
2. 我們不知道要聯(lián)系誰來獲得他們的同意分别。
3. 我們不知道在與誰通話。
注意我們可以用任意通信手段來滿足上述工作流程:當(dāng)面存淫,通過網(wǎng)絡(luò),信鴿通訊等等沼填!
由于缺乏網(wǎng)絡(luò)參與者的身份和對他們的全局認(rèn)識(shí)桅咆,我們必須要放寬限制。雖然我們不能保證任意特定交易都有效坞笙,那并不能阻止我們對接受交易有效的可能性做出陳述:
1. 零確認(rèn)交易:我們可以在不聯(lián)系任何其他參與者的情況下接受交易岩饼。這是對交易付款方誠信的完全信任——相信他們不會(huì)重復(fù)消費(fèi)。
2. N確認(rèn)交易:我們可以聯(lián)系網(wǎng)絡(luò)中(已知)參與者的一部分子集薛夜,讓他們驗(yàn)證我們的交易籍茧。 我們聯(lián)系的節(jié)點(diǎn)越多,抓住企圖欺詐我們的惡意方的可能性越大梯澜。
“N”的值多大為好寞冯?答案取決于要轉(zhuǎn)移的金額以及你與對方的信任度和關(guān)系。如果金額很小,你可能愿意接受更高的風(fēng)險(xiǎn)級(jí)別吮龄,或者你會(huì)根據(jù)對另一方的了解程度來調(diào)整風(fēng)險(xiǎn)容忍度俭茧。或者漓帚,你會(huì)做些額外的工作母债,聯(lián)系其他參與者驗(yàn)證你的交易。在任一情況下尝抖,處理交易速度(零確認(rèn)是瞬時(shí)發(fā)生的)毡们,額外工作和交易無效的風(fēng)險(xiǎn)之間都存在一個(gè)折衷。
圖11
到目前為止一切順利昧辽。不過衙熔,有個(gè)額外的并發(fā)問題我們必須考慮:我們的系統(tǒng)依賴于來自其他節(jié)點(diǎn)的交易確認(rèn),但是沒有什么能阻止惡意用戶按照所需生成盡可能多的偽造身份(回想一下奴迅,我們系統(tǒng)中的“身份”僅僅是個(gè)公鑰—私鑰對青责,隨便就能生成)來滿足 Katy的驗(yàn)收標(biāo)準(zhǔn)。
Bob是否要進(jìn)行攻擊是一個(gè)簡單的經(jīng)濟(jì)學(xué)問題:如果收益高于成本取具,他就會(huì)考慮實(shí)行攻擊脖隶。相反,如果Katy可以使運(yùn)行攻擊的成本高于交易的價(jià)值暇检,那么她應(yīng)該是安全的(除非Bob和她有私仇或者愿意在交易上賠錢产阱。但這不在考慮范圍內(nèi))。為了讓問題更明確块仆,我們做出如下假設(shè):
1. Bob轉(zhuǎn)移10個(gè)chroma給Katy构蹬。
2. 生成偽造身份和交易響應(yīng)的成本是0.001chroma:維持電腦運(yùn)行的能源成本,支付網(wǎng)絡(luò)連接等悔据。
如果Katy要求1001次確認(rèn)庄敛,對于Bob來說實(shí)行攻擊就沒有(經(jīng)濟(jì))意義了。反之科汗,我們可以為每次確認(rèn)增加一個(gè)工作量證明要求藻烤,將每次有效響應(yīng)的成本從0.001chroma增加到1chroma,即找到一個(gè)有效散列會(huì)占用CPU時(shí)間头滔,轉(zhuǎn)化為更高的能源費(fèi)用怖亭。因此,Katy只要求11次確認(rèn)就可以達(dá)到同樣效果的安全保障坤检。
注意兴猩,Katy每次請求確認(rèn)也會(huì)導(dǎo)致一些成本:她必須耗費(fèi)努力來發(fā)出請求,然后驗(yàn)證響應(yīng)早歇。此外倾芝,如果生成確認(rèn)和驗(yàn)證的成本是一對一的讨勤,那么Katy將承擔(dān)與交易價(jià)值相等的總成本來驗(yàn)證交易……當(dāng)然,這沒有任何經(jīng)濟(jì)意義蛀醉。這就是為什么工作量證明的不對稱很關(guān)鍵悬襟。
很好,問題解決了拯刁,對吧脊岳?在這個(gè)過程中,我們似乎……造成了另一個(gè)經(jīng)濟(jì)困境。我們的網(wǎng)絡(luò)現(xiàn)在驗(yàn)證每個(gè)交易產(chǎn)生的成本與交易本身的價(jià)值相等甚至更高。雖然這是對惡意參與者的經(jīng)濟(jì)威懾碧囊,但合法參與者怎么會(huì)愿意為他人承擔(dān)成本?理性的參與者根本不會(huì)亿驾,這毫無意義。
添加“區(qū)塊”和交易費(fèi)用激勵(lì)
如果網(wǎng)絡(luò)中的參與者必須承擔(dān)成本來驗(yàn)證彼此的交易账嚎,那我們必須為他們提供經(jīng)濟(jì)激勵(lì)莫瞬。事實(shí)上,我們至少要抵消他們的成本郭蕉,否則一個(gè)“空閑”參與者(任何沒有提交自己交易的人)將會(huì)代表網(wǎng)絡(luò)繼續(xù)累積成本——這樣是行不通的疼邀。還有一些我們需要解決的其他問題:
1. 如果驗(yàn)證交易的成本等于或高于交易價(jià)值本身(為了制止惡意參與者),那么總交易價(jià)值是凈零召锈,或負(fù)數(shù)旁振!例如,Bob把10個(gè)chroma轉(zhuǎn)移給Katy涨岁, Katy又花了10個(gè)chroma來補(bǔ)償其他節(jié)點(diǎn)來驗(yàn)證交易拐袜,Katy很傷心。
2. Katy如何為確認(rèn)進(jìn)行支付梢薪?如果那是它自己的交易蹬铺,就會(huì)有一個(gè)遞歸問題。
讓我們從顯而易見的問題開始:交易費(fèi)用不能和交易本身的價(jià)值一樣高秉撇。當(dāng)然甜攀,Katy不必原封不動(dòng)地把所有價(jià)值都用于確認(rèn)交易(比如,她可以分配一半的價(jià)值用于確認(rèn))畜疾,但這樣又變成了一個(gè)利潤問題:如果剩余利潤(交易價(jià)值減去驗(yàn)證費(fèi))足夠高,欺詐的動(dòng)機(jī)仍然存在印衔。相反啡捶,理想情況下,我們希望承擔(dān)最低的交易費(fèi)用奸焙,并仍然對惡意參與者有強(qiáng)大的威懾瞎暑,有解決方案嗎彤敛?
我們可以通過允許網(wǎng)絡(luò)中的參與者一次性匯集和確認(rèn)多個(gè)交易來激勵(lì)他們,也就是對一個(gè)交易“區(qū)塊”進(jìn)行確認(rèn)了赌。這樣做能讓他們匯總交易費(fèi)用墨榄,從而降低每個(gè)單獨(dú)交易的驗(yàn)證成本。
圖12
一個(gè)區(qū)塊僅僅是(一個(gè)或多個(gè))有效交易的集合——把它想象成等同于物理分類賬簿中的一個(gè)頁面勿她。反過來袄秩,每個(gè)區(qū)塊包含對前一交易區(qū)塊(上一頁)的引用,整個(gè)分類賬簿是區(qū)塊的鏈接序列逢并,也就是之剧,區(qū)塊鏈。想想上面的案例:
1. Alice和Bob生成新交易并公布到網(wǎng)絡(luò)上砍聊。
2. Chris正在等著聽新交易通知背稼,每個(gè)交易通知包含發(fā)送方愿意支付于網(wǎng)絡(luò)驗(yàn)證和確認(rèn)交易的交易費(fèi)用:
2-1. 直到有直接的經(jīng)濟(jì)激勵(lì)(交易費(fèi)用總額大于他的成本)來完成必要工作來驗(yàn)證未決交易,Chris對未確認(rèn)的交易進(jìn)行匯總玻蝌。
2-2. 一旦過了這個(gè)門檻蟹肘,Chris首先驗(yàn)證每個(gè)未決交易,方法是核實(shí)所有的輸入都不是重復(fù)消費(fèi)俯树。
2-3. 所有交易都被核實(shí)后帘腹,Chris在未決列表上再添加一個(gè)交易(上圖中用綠色標(biāo)識(shí)),將所發(fā)布交易的費(fèi)用額轉(zhuǎn)移給他自己聘萨。
2-4. Chris生成一個(gè)包含未決交易列表的區(qū)塊竹椒,引用前一區(qū)塊(使我們可以遍歷區(qū)塊并看到整個(gè)分類賬簿),并執(zhí)行工作量證明挑戰(zhàn)米辐,來生成符合網(wǎng)絡(luò)既定規(guī)則的區(qū)塊散列值胸完,例如N個(gè)前導(dǎo)零的部分散列沖突。
2-5. 最后一旦Chris發(fā)現(xiàn)有效區(qū)塊翘贮,他就分發(fā)給所有的其他參與者赊窥。
3. Alice和Bob在等著監(jiān)聽新的區(qū)塊公告,尋找他們在列表中的交易:
3-1. Alice和Bob驗(yàn)證區(qū)塊的完整性狸页,也就是驗(yàn)證工作量證明和區(qū)塊所包含的交易锨能。
3-2. 如果區(qū)塊有效,他們的交易在列表中芍耘,那么交易就被確認(rèn)了址遇!
我們在這里前進(jìn)了一大步。以前我們的網(wǎng)絡(luò)中只記錄了一種類型——簽名的交易≌海現(xiàn)在我們簽名了交易和區(qū)塊倔约。前者由參與交易的個(gè)人生成,后者由有意通過驗(yàn)證和確認(rèn)交易收費(fèi)的各方生成坝初。
另外請注意浸剩,上述方案需要系統(tǒng)中的最小交易量來維持個(gè)人創(chuàng)建區(qū)塊的動(dòng)機(jī):交易越多钾军,單個(gè)交易所需的費(fèi)用越低。
Alice宣布了一個(gè)新的交易绢要,并收到一個(gè)Chris確認(rèn)它的有效區(qū)塊吏恭。有了一個(gè)確認(rèn),那其余的呢重罪? 而且Chris(但愿)不是唯一一個(gè)受到激勵(lì)來生成區(qū)塊的參與者樱哼。如果其他人同時(shí)生成了另外一個(gè)區(qū)塊,這兩個(gè)區(qū)塊哪個(gè)“有效”蛆封?
競爭以贏取交易費(fèi)用
通過驗(yàn)證交易區(qū)塊來引入?yún)R總費(fèi)用的能力唇礁,它了不起的部分在于,為網(wǎng)絡(luò)中的新參與者創(chuàng)造了一個(gè)角色惨篱,他們有直接的經(jīng)濟(jì)激勵(lì)來保障網(wǎng)絡(luò)盏筐。你現(xiàn)在可以通過驗(yàn)證交易賺取利潤,可以盈利的地方砸讳,競爭就隨之而來琢融,這只會(huì)加強(qiáng)網(wǎng)絡(luò)——一個(gè)良性循環(huán)和聰明的社會(huì)工程!
即便如此簿寂,驗(yàn)證交易的競爭動(dòng)機(jī)又產(chǎn)生了另一個(gè)有趣的困境:我們?nèi)绾卧诜植际骄W(wǎng)絡(luò)中協(xié)調(diào)區(qū)塊生成工作漾抬?簡短的回答,你可能已經(jīng)猜到了常遂,我們不會(huì)去協(xié)調(diào)纳令。我們在系統(tǒng)中再額外添加一些規(guī)則,看看它們?nèi)绾谓鉀Q這個(gè)問題:
1. 允許任意數(shù)量的參與者參加(“競賽”)創(chuàng)建有效區(qū)塊克胳。不需要協(xié)調(diào)平绩,感興趣的參與者反而會(huì)去找新的交易,決定是否想要以及何時(shí)想要嘗試生成有效區(qū)塊漠另,領(lǐng)取交易費(fèi)用捏雌。
2. 生成有效區(qū)塊時(shí),立即廣播到網(wǎng)絡(luò)中笆搓。
2-1. 其他節(jié)點(diǎn)檢驗(yàn)區(qū)塊的有效性(檢查每個(gè)交易和區(qū)塊本身的有效性)性湿,如果有效,就將其添加到他們的分類賬簿中满败,然后最終重新廣播到網(wǎng)絡(luò)中的其他節(jié)點(diǎn)肤频。
2-2. 添加以后,新的區(qū)塊成為分類賬簿的“最高檔”算墨。如果同一個(gè)節(jié)點(diǎn)也在生成區(qū)塊宵荒,那么他們需要中止之前的工作重新開始:他們現(xiàn)在需要更新對最新區(qū)塊的引用,并且從最新區(qū)塊中包含的未確認(rèn)列表里刪除所有交易。
2-3. 完成以上步驟后骇扇,開始創(chuàng)建新區(qū)塊,希望他們第一個(gè)發(fā)現(xiàn)下一有效區(qū)塊面粮,這樣他們能夠領(lǐng)取交易費(fèi)少孝。
3. 重復(fù)以上步驟直到宇宙熱寂。
生成區(qū)塊的所有參與者之間缺乏協(xié)調(diào)意味著網(wǎng)絡(luò)中會(huì)有重復(fù)的工作熬苍,這也OK稍走!雖然不能保證單個(gè)參與者獲得特定區(qū)塊,只要參與網(wǎng)絡(luò)的預(yù)期價(jià)值(獲得區(qū)塊的概率乘以預(yù)期支出柴底,減去成本)是正的婿脸,系統(tǒng)就可以自我維持。
注意柄驻,接下來要驗(yàn)證交易的節(jié)點(diǎn)之間沒有一致性狐树。每個(gè)參與者匯總自己的列表,運(yùn)用不同策略來使預(yù)期收益最大化鸿脓。此外抑钟,由于我們工作量證明函數(shù)(為區(qū)塊SHA-256校驗(yàn)和找到一個(gè)部分散列沖突)的屬性,增加獲得區(qū)塊概率的唯一方法是耗費(fèi)更多的CPU周期野哭。
圖13
還有一個(gè)需要應(yīng)對的警告:兩個(gè)節(jié)點(diǎn)可能會(huì)幾乎同時(shí)發(fā)現(xiàn)一個(gè)有效區(qū)塊在塔,并開始在網(wǎng)絡(luò)中傳播——例如上表中的Kent和Chris。因此拨黔,一部分網(wǎng)絡(luò)最終可能會(huì)接收Kent的區(qū)塊作為最高區(qū)塊蛔溃,其余的會(huì)接受Chris的區(qū)塊。現(xiàn)在怎么辦篱蝇?
解決鏈沖突
再次的贺待,我們將采取一種不干涉的手段,讓區(qū)塊生成過程中的任意屬性來解決沖突态兴,雖然還有另外一個(gè)規(guī)則:如果檢測到多個(gè)鏈狠持,參與者應(yīng)立即切換到最長的鏈,并在其頂部創(chuàng)建瞻润。我們來看看這在實(shí)踐中如何工作:
圖14
1. 一些節(jié)點(diǎn)會(huì)開始在Kent的區(qū)塊上建立新區(qū)塊喘垂,其他人在Chris的區(qū)塊上建立。
2. 在某一時(shí)刻绍撞,有人會(huì)發(fā)現(xiàn)新的區(qū)塊正勒,開始在網(wǎng)絡(luò)中傳播。
2-1. 其他節(jié)點(diǎn)接受新的區(qū)塊時(shí)傻铣,與一個(gè)不同的最高區(qū)塊合作的那部分網(wǎng)絡(luò)將檢測到現(xiàn)在有一個(gè)更長的鏈可替換章贞,這意味著它們需要切換到更長的鏈上面。
2-2. 作為被丟棄區(qū)塊的一部分但尚未被確認(rèn)的任何交易都被放在未決列表中非洲,重新開始這個(gè)過程鸭限。
2-3. 可能的情況是蜕径,競爭狀況會(huì)持續(xù)多個(gè)區(qū)塊,但最終某個(gè)分支會(huì)超過另一個(gè)败京,網(wǎng)絡(luò)的其余部分將收斂到同一個(gè)最長的鏈上兜喻。
很好,我們現(xiàn)在有了一個(gè)策略來解決網(wǎng)絡(luò)中不同鏈之間的沖突赡麦。具體來說朴皆,網(wǎng)絡(luò)通過將交易記錄在鏈接的區(qū)塊列表中來允諾交易的線性化。但至關(guān)重要的是泛粹,它沒有允諾個(gè)別區(qū)塊可以“保證”任意一個(gè)交易的狀態(tài)遂铡。想想上面的案例:
1. Alice將她的交易發(fā)送到網(wǎng)絡(luò)。
2. Chris生成一個(gè)確認(rèn)她交易的有效區(qū)塊晶姊。
但是鏈中有一個(gè)分叉扒接,當(dāng)稍后網(wǎng)絡(luò)收斂在Kent的分支鏈上時(shí),Chris的區(qū)塊會(huì)被“移除”们衙。因此珠增,即使當(dāng)Alice接收到一個(gè)有她交易的區(qū)塊,她也不能確定這個(gè)區(qū)塊將來不會(huì)被撤消砍艾!
沒有哪個(gè)區(qū)塊是“最后一個(gè)”
沒有哪個(gè)區(qū)塊是“最后一個(gè)”蒂教,永遠(yuǎn)不會(huì)有。 如果檢測到更長的鏈脆荷,任何區(qū)塊都可以被“撤消”凝垛。實(shí)際上,檢測分叉相當(dāng)快速蜓谋,但總是存在出現(xiàn)替代鏈的可能梦皮。但是,我們唯一能說的是桃焕,特定區(qū)塊在鏈中的位置“更深”剑肯,它被撤銷的可能性就更小。因此观堂,也沒有哪個(gè)交易可以被視為“最終一個(gè)”让网,我們只能陳述它被撤銷的概率。
1. 0確認(rèn)交易:不必等待任何包含交易的區(qū)塊就可以進(jìn)行交換师痕。
2. 1確認(rèn)交易:最新的有效區(qū)塊包含交易溃睹。
3. N確認(rèn)交易:有一個(gè)包含交易的有效區(qū)塊,以及N-1個(gè)區(qū)塊建立在那個(gè)有效區(qū)塊上胰坟。
如果愿意接受風(fēng)險(xiǎn)因篇,你可以總是選擇采用0確認(rèn)交易:沒有交易費(fèi)用,也不必等待確認(rèn),不過你要對對方抱有極大的信任竞滓。
但如果你想降低風(fēng)險(xiǎn)咐吼,就要等待一個(gè)或多個(gè)區(qū)塊建立在你交易所在的區(qū)塊上。你等的時(shí)間越長商佑,在包含你交易的區(qū)塊上建立的區(qū)塊越多汽烦,出現(xiàn)一個(gè)撤銷你交易的替代鏈的可能性越低。
“撤消”指的是參與者使網(wǎng)絡(luò)接受一個(gè)替代交易莉御,將資金轉(zhuǎn)移到除你以外的其他帳戶上的情形——例如,你完成交易俗冻,移交組件礁叔,獲得收據(jù),但攻擊者接著會(huì)注入一個(gè)交易迄薄,把同樣的資金“雙重消費(fèi)”到另一帳戶琅关。
為什么區(qū)塊鏈的長度可以很好地代表交易“安全性”?如果攻擊者想要撤消一個(gè)特定交易讥蔽,那么他需要建立一個(gè)鏈涣易,鏈開始于列出交易區(qū)塊的前一區(qū)塊,然后建立一個(gè)由其他區(qū)塊組成的冶伞、比網(wǎng)絡(luò)當(dāng)前所用鏈更長的鏈新症。因此,區(qū)塊越深响禽,通過創(chuàng)建新鏈來替換它所需要的計(jì)算量就越大徒爹。鏈條越長,運(yùn)行攻擊的代價(jià)就越昂貴芋类。
在接受交易之前隆嗅,你要等待多少個(gè)區(qū)塊?它沒有一個(gè)明確的數(shù)字侯繁,答案取決于網(wǎng)絡(luò)的特性(生成每個(gè)區(qū)塊的時(shí)間胖喳,交易和區(qū)塊的傳播延時(shí),網(wǎng)絡(luò)大小等)以及交易本身:它的價(jià)值贮竟,你對另一方的了解丽焊,你的風(fēng)險(xiǎn)預(yù)測等。
(最小可行)區(qū)塊鏈的屬性
【個(gè)體交易的安全受公鑰基礎(chǔ)設(shè)施保障】
驗(yàn)證交易真實(shí)性:惡意方不能偽裝成他人咕别,代表他人簽名交易粹懒。
交易真實(shí)性認(rèn)證只與公鑰—私鑰對有關(guān)。不需要將密鑰對與參與者其他數(shù)據(jù)鏈接的“強(qiáng)認(rèn)證”顷级。事實(shí)上凫乖,單個(gè)參與者可以生成和使用多個(gè)密鑰對!從這一層面上看,網(wǎng)絡(luò)允許匿名交易帽芽。
不可否認(rèn)性:事實(shí)發(fā)生后删掀,參與方不能聲稱交易沒有發(fā)生過。
完整性:事實(shí)發(fā)生后导街,交易不能被修改披泪。
【交易一旦被創(chuàng)建,就被廣播到點(diǎn)對點(diǎn)網(wǎng)絡(luò)中】
交易一旦被創(chuàng)建搬瑰,就被廣播到點(diǎn)對點(diǎn)網(wǎng)絡(luò)中
【一個(gè)或多個(gè)交易聚集在“區(qū)塊”上】
一個(gè)區(qū)塊可以驗(yàn)證一個(gè)或多個(gè)交易并領(lǐng)取交易費(fèi)用款票。
這使得交易費(fèi)用與每個(gè)交易的價(jià)值相比仍然是很低的。
有效區(qū)塊必須有有效的工作量證明解決方案泽论。
有效的工作量輸出很難生成艾少,但驗(yàn)證起來很便宜。
工作量證明用于提高生成有效區(qū)塊的成本翼悴,使運(yùn)行對網(wǎng)絡(luò)的攻擊成本更高缚够。
任意節(jié)點(diǎn)都能用于生成有效區(qū)塊,一旦有效區(qū)塊生成鹦赎,就被廣播到網(wǎng)絡(luò)中谍椅。
任意節(jié)點(diǎn)都能用于生成有效區(qū)塊,一旦有效區(qū)塊生成古话,就被廣播到網(wǎng)絡(luò)中雏吭。
每個(gè)區(qū)塊有一個(gè)與前一有效區(qū)塊之間的鏈接,使我們能夠遍歷網(wǎng)絡(luò)中所有交易記錄的完整歷史陪踩。
【節(jié)點(diǎn)們尋找新的交易通知思恐,將它們并入分類賬簿中】
在區(qū)塊中包含交易,作為交易“確認(rèn)”膊毁,但這一事實(shí)本身不會(huì)將交易“最終化”胀莹。相反,我們以鏈的長度代表交易的“安全性”婚温。每個(gè)參與者可以選擇自己的風(fēng)險(xiǎn)承受水平描焰,從0確認(rèn)交易到等待任意數(shù)量的區(qū)塊。
所有上述規(guī)則和基礎(chǔ)設(shè)施的組合提供了一個(gè)去中心化栅螟、點(diǎn)對點(diǎn)的區(qū)塊鏈荆秦,用于實(shí)現(xiàn)簽名交易排序的分布式一致性。說得有點(diǎn)多力图,我知道步绸,但它也為一個(gè)大難題提供了巧妙的解決方法。區(qū)塊鏈的單個(gè)部分(會(huì)計(jì)吃媒,密碼技術(shù)瓤介,網(wǎng)絡(luò)吕喘,工作量證明)并不新穎,但所有這些部分結(jié)合起來形成的新屬性很值得關(guān)注刑桑。
原文鏈接:https://www.igvita.com/2014/05/05/minimum-viable-block-chain/
感謝llya授權(quán)《程序員》翻譯本文
作者簡介:Ilya Grigorik氯质,Google網(wǎng)絡(luò)性能工程師,W3C網(wǎng)絡(luò)性能工作組聯(lián)合主席祠斧,《高性能瀏覽器網(wǎng)絡(luò)(O’Reilly)》作者闻察。
譯者簡介:汪曉明,朝夕網(wǎng)絡(luò)創(chuàng)始人琢锋,前Beltal CTO辕漂。