比特幣中的拜占庭將軍問題
㈠ 比特幣機制研究
現今世界的電子支付系統已經十分發達,我們平時的各種消費基本上在支付寶和微信上都可以輕松解決。但是無論是支付寶、微信,其實本質上都依賴於一個中心化的金融系統,即使在大多數情況這個系統運行得很好,但是由於信任模型的存在,還是會存在著仲裁糾紛,有仲裁糾紛就意味著不存在 不可撤銷的交易 ,這樣對於 不可撤銷的服務 來說,一定比例的欺詐是不可避免的。在比特幣出來之前,不存在一個 不引入中心化的可信任方 就能解決在通信通道上支付的方案。
比特幣的強大之處就在於:它是一個基於密碼學原理而不是依賴於中心化機構的電子支付系統,它能夠允許任何有交易意願的雙方能直接交易而不需要一個可信任的第三方。交易在數學計算上的不可撤銷將保護 提供不可撤銷服務 的商家不被欺詐,而用來保護買家的 程序化合約機制 也比較容易實現。
假設網路中有A, B ,C三個人。
A付給B 1比特幣 ,B付給C 2比特幣 ,C付給A 3比特幣 。
如下圖所示:
為了刺激比特幣系統中的用戶進行記賬,記賬是有獎勵的。獎勵來源主要有兩方面:
比特幣中每一筆交易都會有手續費,手續費會給記賬者
記賬會有打包區塊的獎勵,中本聰在08年設計的方案是: 每10分鍾打一個包,每打一個包獎勵50個比特幣,每4年單次打包的獎勵數減半,即4年後每打一個包獎勵25個比特幣,再過四年後就獎勵12.5個比特幣... 這樣我們其實可以算出比特幣的總量:
要說明打包的記錄以誰為準的問題,我們需要引入一個知名的 拜占庭將軍問題 (Byzantine failures)。拜占庭將軍問題是由萊斯利·蘭伯特提出的點對點通信中的基本問題。含義是在存在消息丟失的不可靠信道上試圖通過消息傳遞的方式達到一致性是不可能的。
假設有9個互相遠離的將軍包圍了拜占庭帝國,除非有5個及以上的將軍一起攻打,拜占庭帝國才能被打下來。而這9個將軍之間是互不信任的,他們並不知道這其中是否有叛徒,那麼如何通過遠距離協商來讓他們贏取戰斗呢?
口頭協議有3個默認規則:
1.每個信息都能夠被准確接收
2.接收者知道是誰發送給他的
3.誰沒有發送消息大家都知道
4.接受者不知道轉發信息的轉發者是誰
將軍們遵循口頭規則的話,那就是下面的場景:將軍1對其他8個將軍發送了信息,然後將軍2~9將消息進行轉達(廣播),每個將軍都是消息的接受者和轉發者,這樣一輪下來,總共就會有9×8=72次發送。這樣將軍就可以根據自己手中的信息,選擇多數人的投票結果行動即可,這個時候即便有間諜,因為少數服從多數的原則,只要大部分將軍同意攻打拜占庭,自己就去行動。
這個方案有很多缺點:
1.首先是發送量大,9個將軍之間要發送72次,隨著節點數的增加,工作量呈現幾何增長。
2.再者是無法找出誰是叛徒,因為是口頭協議,接受者不知道轉發信息的轉發者是誰,每個將軍手裡的數據僅僅只是一個數量的對比:
這里我們假設有3個叛徒,在一種最極端的情況下即叛徒轉發信息時總是篡改為「不進攻」,那麼我們最壞的結果就如上圖所示。將軍1根據手裡的信息可以推出要進攻的結論,卻無法獲知將軍裡面誰是叛徒。
這樣我們就有了方案二:書面協議。
書面協議即將軍在接受到信息後可以進行簽字,並且大家都能夠識別出這個簽字是否是本人,換種說法就是如果有人篡改簽字大家可以知道。書面協議相對比口頭協議就是增加了一個認證機制,所有的消息都有記錄。一旦發現有人所給出的信息不一致,就是追查間諜。
有了書面協議,那麼將軍1手裡的信息就是這樣的:
可以很明顯得看出,在最壞的一種情況——叛徒總是轉發「不進攻」的消息之下,將軍7、8、9是團隊里的叛徒。
這個方案解決了口頭協議里歷史信息不可追溯的問題,但是在發送量方面並沒有做到任何改進。
在我們的示例中,比特幣系統里的每個用戶發起了一筆交易,都會通過自己的私鑰進行簽名,用數學公式表示就是:
所以之前的區塊就變成了這樣:
這樣每一筆交易都由交易發起者通過私鑰進行數字簽名,由於私鑰是不公開的,所以交易信息也就無法被偽造了。
如書面協議末尾所說的那樣,書面協議未能解決信息交流過多的問題。當比特幣系統中存在上千萬節點的時候,如果要互相廣播驗證,請求響應的次數那將是一個非常龐大的數字,顯然勢必會造成網路擁堵、節點處理變慢。為了解決這個問題,中本聰乾脆讓整個10分鍾出一個區塊,這個區塊由誰來打包發出呢?這里就採用了工作量證明機制(PoW)。工作量證明,說白了就是解一個數學題,誰先解出來數學題,誰就能有打包區塊的權力。換在拜占庭將軍的例子中就是,誰先做出數學題,誰就成為將軍們裡面的總司令,其他將軍聽從他發號的命令。
首先,礦工會將區塊頭所佔用的128位元組的字元串進行兩次sha256求值,即:
這樣求得一個值Hash,將其與目標值相比對,如果符合條件,則視為工作量證明成功。
工作量證明成功的條件寫在了區塊鏈頭部的 難度數 欄位,它要求了最後進行兩次sha256運算的Hash值必須小於定下的目標值;如果不是的話,那就改變區塊頭的 隨機數 (nonce),通過一次次地重復計算檢驗,直到符合條件為止。
此外, 比特幣有自己的一套難度控制系統,使得比特幣系統要在全網不同的算力條件下,都保持10分鍾生成一個區塊的速率。這也就意味著:難度值必須根據全網算力的變化進行調整。難度調整的策略是由最新2016個區塊的花費時長與期望時長(期望時長為20160分鍾即兩周,是按每10分鍾一個區塊的產生速率計算出的總時長)比較得出的,根據實際時長與期望時長的比值,進行相應調整(或變難或變易)。也就是說,如果區塊產生的速率比10分鍾快則增加難度,比10分鍾慢則降低難度。
PoW其實在比特幣中是做了以下的三件事情。
這樣可以防止一台高性能機器同時跑上萬個節點,因為每完成一個工作都要有足夠的算力。
有經濟獎勵就會加速整個系統的去中心化,也鼓勵大家不要去作惡,要積極地按照協議本來的執行方式去執行。(所以說,無幣區塊鏈其實是不可行的,無幣區塊鏈一定導致中心化。)
也就是說,每個節點都不能以自身硬體條件去控制出快速度。現在的比特幣上平均10分鍾出一個塊,性能再好的機器也無法打破這個規則,這就能夠保證 區塊鏈是可以收斂到共同的主鏈上的 ,也就是我們所說的共識。
綜上,共識只是PoW三個作用中的一點,事實上PoW設計的作用有點至少有這么三種。
默克爾樹的概念其實很簡單,如圖所示
這樣,我們區塊的結構就大致完整了,這里分成了區塊頭和區塊體兩部分。
區塊鏈的每個節點,都保存著區塊鏈從創世到現在的每一區塊,即每一筆交易都被保存在節點上,現在已經有幾百個GB了。
每當比特幣系統中有一筆新的交易生成,就會將新交易廣播到所有的節點。每個節點都把新交易收集起來,並生成對應的默克爾根,拼接完區塊頭後,就開始調整區塊頭里的隨機數值,然後就開始算數學題
將算出的result和網路中的目標值進行比對,如果是結果是小於的話,就全網廣播答案。其他礦工收到了這個信息後,就會立馬放下手裡的運算,開始下一個區塊的計算。
舉個例子,當前A節點在挖38936個區塊,A挖礦節點一旦完成計算,立刻將這個區塊發給它的所有相鄰節點。這些節點在接收並驗證這個新區塊後,也會繼續傳播此區塊。當這個新區塊在網路中擴散時,每個節點都會將它作為第38936個區塊(前一個區塊為38935)加到自身節點的區塊鏈副本中。當挖礦節點收到並驗證了這個新區塊後,它們會放棄之前對構建這個相同高度區塊的計算,並立即開始計算區塊鏈中下一個區塊的工作。
整個流程就像下一張圖所展示的這樣:
簡單來說,雙花問題是一筆錢重復花了兩次。具體來講,雙花問題可分為兩種情況:
1.同一筆錢被多次使用;
2.一筆錢只被使用過一次,但是通過黑客攻擊或造假等方式,將這筆錢復制了一份,再次使用。
在我們生活的數字系統中,由於數據的可復制性,使得系統可能存在同一筆數字資產因不當操作被重復使用的情況,為了解決雙花問題,日常生活中是依賴於第三方的信任機構的。這類機構對數據進行中心化管理,並通過實時修改賬戶余額的方法來防止雙重支付的出現。而作為去中心化的點對點價值傳輸系統,比特幣通過UTXO、時間戳等技術的整合來解決雙花問題。
UTXO的英文全稱是 unspent transaction outputs ,意為 未使用的交易輸出 。UTXO是一種有別於傳統記賬方式的新的記賬模型。
銀行里傳統的記賬方式是基於賬戶的,主要是記錄某個用戶的賬戶余額。而UTXO的交易方式,是基於交易本身的,甚至沒有賬戶的概念。在UTXO的記賬機制里,除了貨幣發行外,所有的資金來源都必須來自於前面某一個或幾個交易。任何一筆的交易總量必須等於交易輸出總量。UTXO的記賬機制使得比特幣網路中的每一筆轉賬,都能夠追溯到它前面一筆交易。
比特幣的挖礦節點獲得新區塊的挖礦獎勵,比如 12.5 個比特幣,這時,它的錢包地址得到的就是一個 UTXO,即這個新區塊的幣基交易(也稱創幣交易)的輸出。幣基交易是一個特殊的交易,它沒有輸入,只有輸出。
當甲要把一筆比特幣轉給乙時,這個過程是把甲的錢包地址中之前的一個 UTXO,用私鑰進行簽名,發送到乙的地址。這個過程是一個新的交易,而乙得到的是一個新的 UTXO。
這就是為什麼有人說在這個世界上根本沒有比特幣,只有 UTXO,你的地址中的比特幣是指沒花掉的交易輸出。
以Alice向Bob進行轉賬的過程舉例的話:
UTXO 與我們熟悉的賬戶概念的差別很大。我們日常接觸最多的是賬戶,比如,我在銀行開設一個賬戶,賬戶里的余額就是我的錢。
但在比特幣網路中沒有賬戶的概念,你可以有多個錢包地址,每個錢包地址中都有著多個 UTXO,你的錢是所有這些地址中的 UTXO 加起來的總和。
中本聰發明比特幣的目標是創建一個點對點的電子現金,UTXO 的設計正可以看成是借鑒了現金的思路:我們可能在這個口袋裡裝點現金,在那個櫃子角落裡放點現金,在這種情況下不存在一個賬戶,你放在各處的現金加起來就是你所有的錢。
採用 UTXO 設計還有一個技術上的理由,這種特別的數據結構可以讓雙重花費更容易驗證。對比一下:
㈡ 拜占庭將軍很忙—《區塊鏈思維》第21塊
無論在鏈圈,還是在幣圈混,經常聽到一個名詞「拜占庭將軍問題」。
到底拜占庭是啥,拜占庭將軍怎麼啦,到處都被提及,這位將軍好忙啊!
先說拜占庭這個地方。很久很久以前的歐洲,建立在比中世紀還古老的時期,歷史上就是東羅馬帝國,跨越了千年的歷史期盼。
扯遠了,回到正題,什麼是拜占庭將軍問題。
拜占庭這個地方異常堅固,同時被十個獨立鄰邦環伺,分別有一位將軍,單獨攻城必敗,只有一半以上的將軍同時攻打才能破城。
十位將軍為了協調一致,在那個古老的時代,累死傳令兵,要麼飛鴿傳書(那時的歐洲比中國落後,好像沒有這個高速通信手段)。十位將軍相互通信一次就需要90次傳信,每位將軍都有各自的攻城計劃,要想達成統一就需要往復傳遞不知道多少次。
我們可以假設一個場景,一個桌子上坐著十位將軍,每個人各自說著自己的想法,同時聽其他九位的說法,但是信息的傳遞不是實時的,有快有慢,有早有晚。想明白了嗎?也就是說,這十位將軍如果想達成一致,理論上有可能,實際上他們的有生之年都實現不了,難怪拜占庭帝國經歷了千年也沒有被這十位將軍攻破。
中本聰這個神人,利用互聯網信息傳遞的及時性特點,引入時間戳可以明確知道「誰先說、誰後說」的特性,創造性地加入挖礦機制(就是用計算機算隨機數滿足一定難度才算成功)比拼各位將軍的智商來決定誰做本次進攻的統帥,使用非對稱加密保證信息傳輸的安全性等等手段融合到比特幣中,用實例說明自己破解了這個歷史難題「拜占庭將軍問題」。從而向世人證明解決60億人口的互信問題是有去中心化解決方案地。
幣圈和鏈圈的朋友很焦慮的另一個關鍵問題就是:這個圈子概念太TM多。除了這個「拜占庭將軍問題」,還有一個「拜占庭容錯」,這是什麼鬼?這兩個是一樣的嗎?這兩個是故意有一個被寫錯了嗎?還是說我的智商稅沒交夠?其實,你都說對了。
「拜占庭將軍問題」假設所有十個將軍都是好的,都想攻破拜占庭,只是達成共識很難,比特幣提供了好人達成共識的方案。
「拜占庭容錯」是說十個將軍可以很好地達成共識。但是,如果其中出了壞人,怎麼解決?
如果十個將軍中出現了壞人(叫叛徒也行),進攻計劃是否會永遠無法達成共識呢?
「拜占庭容錯」告訴大家,是可以達成地,並且,還能找出這些「叛徒」是誰。只是,10個將軍中叛徒的數量不能超過3個,超出了就無法「容錯」,也找不出這些叛徒是誰。對應的公式就是:3n+1。其中3n+1是將軍總數(區塊鏈的賬本/礦機總數),n是能夠「容錯」的「叛徒」(惡意記錯賬)總數。
對於十個將軍來說,最多容忍三個叛徒,多了就徹底沒戲啦。為了比特幣的容錯能力越來越強,就需要更多的節點,這樣才能容忍並找出更多的叛徒。懂了吧。
小結一下:拜占庭將軍問題是假設都是好人前提下如何達成共識,拜占庭容錯就是全網最多能夠容忍多少叛徒並且能找出他們。
請交智商稅到如下地址:
國稅BTC到Kcash:
地稅ETH及各種原生Token到 Imtoken:
不交稅的,祝你做「韭菜」一切順利 :D
㈢ 區塊鏈幾種共識演算法
理解區塊鏈中的共識問題,我們首先從著名的「拜占庭將軍問題」開始。這個問題描述了一支分隔開來的軍隊,需要全體將軍一致決定是否發動攻擊。然而,軍隊中可能存在叛徒,他們會誤導將軍們,導致決策不一致。這個問題在分布式系統中形成了共識問題的核心。
在區塊鏈領域,共識問題尤為重要。中心化的記賬系統如支付寶,雖然高效,但也存在單點故障和操作人員篡改數據的風險。區塊鏈通過去中心化記賬,利用分布式演算法,密碼學,經濟學原理,以及智能合約等技術,確保了賬本的一致性和安全性。
其中,工作量證明(Proof of Work,POW)機制是比特幣系統的核心,它要求網路中的節點通過計算復雜的問題來獲取記賬權。POW機制確保了網路的安全性,但也引發了能源消耗的爭議。權益證明(Proof of Stake,POS)機制則基於持有加密貨幣的權益來分配記賬權,降低了對能源的需求,但面臨著中心化風險和激勵機制復雜性的問題。委任權益證明(Delegated Proof of Stake,DPOS)則通過引入代理人角色,以減少中心化的影響,提高系統的效率和安全性。
在POW機制下,節點通過解決復雜的計算問題來獲取記賬權,這種機制保證了系統的安全性和去中心化。然而,隨著礦機技術的發展,POW機制面臨著算力集中化的問題,導致能源消耗巨大。POS機制通過持有加密貨幣的權益來分配記賬權,這減少了對能源的需求,但存在中心化風險和代幣經濟復雜性的問題。DPOS機制通過引入代理角色,將記賬權分配給經過投票選舉的代理人,從而在提高效率的同時,減少中心化的影響。
總的來說,區塊鏈的共識機制旨在解決分布式系統中的決策一致性問題,以確保數據的安全性、完整性和不可篡改性。不同的共識演算法,如POW、POS、DPOS等,各有優劣,但共同的目標是為區塊鏈應用提供一個公平、安全、高效的共識機制,以支持去中心化的數字資產交易和數據共享。
㈣ 比特幣因為什麼可以被稱為主流幣
拜占庭將軍問題
在討論比特幣為什麼會被稱為主流幣之前先看一個有趣的問題,這個問題的名字叫做拜占庭將軍問題。
這個問題是由萊斯利·蘭伯特提出的點對點通信的基本問題。
為什麼會被稱為拜占庭將軍問題呢?有兩大歷史淵源。
一、拜占庭位於如今土耳其的伊斯坦布爾,是東羅馬帝國的首都,由於羅馬帝國當時土地遼闊,每個軍隊都相隔較遠,信息傳遞全靠信差。而在戰爭時拜占庭的所有將軍必須達成是否攻擊的共識,這樣才能贏得戰爭。但是因為有叛徒和間諜的存在就會擾亂秩序,使得難以形成正確的共識。拜占庭將軍問題就這樣形成了。
二、Leslie Lamport(2013 年的圖靈講得主)用來為描述分布式系統一致性問題(Distributed Consensus)在論文中抽象出來一個著名的例子。
Leslie Lamport在20頁的文章中舉了一個具體的例子來描述什麼是拜占庭將軍問題,拜占庭排出了10支部隊去圍攻一個城池,10支部隊由10個將軍帶領,分布在城池的四周靠通信兵傳遞信息,由於敵人實力強悍,必須要6隊或以上的人馬同時發起進攻才能贏得戰爭。如何保證至少6支軍隊可以同時發起進攻。
從字面上看起來似乎不是一個很難的問題,其實際解決起來卻沒那麼容易,在中本聰提出比特幣網路概念之前這個問題一直就沒有得到較好的解決。
為什麼這么難解決呢?
因為信息傳遞是分散的,並且其中還可能存在間諜叛徒搗亂。
先不考慮有叛徒和間諜的情況,光10個將軍想要統一一個發動進攻的時間都很難,舉例:每一個將軍都有著自己的進攻想法,想要統一一個進攻時間就要將自己的想法讓通信兵傳達給剩餘的9位將軍,並詢問是否同意在這個時間發起進攻,又由於路途遠近的不同,收到的提議的時間都不同,這樣就很容易形成一個混亂的局面。
如果再加上叛徒和間諜就更可怕了,叛徒和間諜可以向不同的將軍發出不同的提案,或者同意多個將軍的進攻提案。
這樣來看這個問題是不是就極其復雜了。
其實拜占庭將軍問題,就是要解決分散的人們在沒有一個中心化指揮時,如何達成共識的問題。
那中本聰如何成功解決拜占庭將軍問題的呢?
POW工作量證明
中本聰提出用工作量證明的方法解決這個問題。
POW工作量證明通過增加信息發送的成本,降低節點發送信息的速率,保證在一個時間只有很少的節點進行信息的傳遞,並且信息的傳遞附上簽名的辦法很好的解決了拜占庭將軍問題。
那工作量證明是什麼呢?其實際就是一個散列函數,當你輸入一個任意值X進入這個函數進行運算,會對應得到H(X)的結果,但當你稍微變動一下X,H(X)就會發生巨大的變化 , 也就是說理論上你無法在得知H(X)的情況下反推出X的結果,想要算出X唯一的辦法就是窮舉運算,也就是我們常說的一個一個帶進去試 。 由於這個運算量很大,而運算的過程就是工作的過程。
哈希函數
前面說到的散列函數實際上就是哈希函數,只是翻譯不同哈希是Hash的音譯。
其實在比特幣網路的整體架構中,哈希函數到處都有體現,整個網路的運行就是圍繞中哈希函數展開的。
比特幣在記賬時,使用哈希函數對記錄的數據進行哈希,數據哈希可以帶來一下好處,首先信息變短並且原始信息被隱藏,其次有了標識和驗證信息的辦法。
下面用一個大概流程進行展示。
區塊鏈在記賬時先把正常的信息進行Hash,會得到一個Hash值。
1.Hash(序號0、記賬時間、交易記錄) = 123456ABC
賬頁的信息和Hash值組合就構成了一個完整的區塊。
在記下一頁賬時,將上一個區塊的Hash值和當前的賬頁信息一同Hash。
2.Hash(上一個Hash值、序號1、記賬時間、交易記錄) = 654321CBA
這樣第二個區塊不僅包含自己區塊的信息還間接包含了前一個區塊的信息。
礦工在挖礦時,實際上就是在計算Hash函數。之後會專門寫一篇文章來講解挖礦的過程。
在確定數字貨幣所有權方面,其實也是經過兩次Hash從私鑰得到了地址,這個地址平常我們打幣使用的地址。誰擁有私鑰誰就可以進行交易,私鑰就是你唯一的資產憑證,所以一定要保管好自己的私鑰。
為什麼比特幣可以被稱為主流幣呢?不是因為它漲幅有多麼驚人,市值有多高,而是因為它的出現解決了許多問題,給人們提供了一種全新的點對點電子分布式網路架構。