現今世界的電子支付系統已經十分發達,我們平時的各種消費基本上在支付寶和微信上都可以輕松解決。但是無論是支付寶、微信,其實本質上都依賴於壹個中心化的金融系統,即使在大多數情況這個系統運行得很好,但是由於信任模型的存在,還是會存在著仲裁糾紛,有仲裁糾紛就意味著不存在 不可撤銷的交易 ,這樣對於 不可撤銷的服務 來說,壹定比例的欺詐是不可避免的。在比特幣出來之前,不存在壹個 不引入中心化的可信任方 就能解決在通信通道上支付的方案。
比特幣的強大之處就在於:它是壹個基於密碼學原理而不是依賴於中心化機構的電子支付系統,它能夠允許任何有交易意願的雙方能直接交易而不需要壹個可信任的第三方。交易在數學計算上的不可撤銷將保護 提供不可撤銷服務 的商家不被欺詐,而用來保護買家的 程序化合約機制 也比較容易實現。
假設網絡中有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 設計還有壹個技術上的理由,這種特別的數據結構可以讓雙重花費更容易驗證。對比壹下: