比特幣共識機制(輕松讀懂比特幣區塊鏈的工作機制)
2022年2月20日,冬奧會閉幕,全國人民為谷愛凌、蘇翊鳴等喝彩點贊。你可能不知道,這屆奧運會從1986年以來首次增加了一種支付手段:數字人民幣。而且數字人民幣交易量遠超東奧合作伙伴VISA。去年11月10日,在你蹲守著雙十一搶購時,比特幣達到歷史最高69000美金。再半年以前5月10日,馬斯克在電視上被迫“承認”:“狗狗幣就是一場騙局”。回到當前,我們冬奧如火如荼之時,大洋彼岸超級碗公羊隊2月14日奪冠,觀眾席明星陣容比球場內的表演還閃耀,號稱全球最貴的廣告,有一段廣告把crypto的發明與車輪、電燈相提并論。僅僅幾年,即使你了解加密貨幣是什么?但你肯定聽說過比特幣過山車式的投機故事。
那么,這熱火的數字人民幣、區塊鏈、加密貨幣,到底是什么?他們真的是未來嗎?我們不鼓勵加密貨幣的投機,我們只了解區塊鏈技術。希望這篇文章能幫助你理解初步的區塊鏈技術。
萬丈高樓平地起,施工之前看地基。了解區塊鏈之前,先看看這一切的基礎,cryptography。
【密碼學】
密碼和加密由來已久,公元前400年古希臘伯羅奔尼撒戰爭西方已開始用密文,中國更早,公元前1000年商周大戰姜子牙發明"虎符"傳遞軍事信息。到了近代,最知名的要數二戰時期德國的英格瑪密碼機,圖靈帶領一群數學家發明雛形計算機,破解德軍英格瑪,據說此舉一下將二戰結束提前兩年。古典密碼學主要關注信息傳遞的保密和破譯。現代密碼學不只是保密這么簡單,要涉及信息完整性驗證、真實性、信息發布的不可抵賴性等,這里面最重要的是你怎么證明這是你說的,怎么證明你說的沒被修改。還好,這個比前些年網絡熱議的“證明你媽是你媽”要簡單得多,我們只要通過兩個算法工具即非對稱加密算法和離散(哈希)算法就可以充分證明。
【非對稱加密算法】
1974年,正在加州大學伯克萊分校讀大四的Ralph C. Merkle提出了一個想法,有沒有一種加密方法,我用密碼加密,但是密碼我不想告訴對方,我又希望對方能解密。最好的辦法是用兩個密碼,用密碼一加密,用密碼二可以解密;密碼一保密,密碼二告訴對方。有這種可能嗎?偉大的數學工具還真就有。1976年W.Diffie和M.Hellman兩位學者就首次發明了非對稱密碼體制的概念,前面提到的的密碼一即私鑰,密碼二即公鑰。當時周瑜讓黃蓋去曹操處做臥底,寫一封信,周瑜用自己的私鑰加密,把自己的公鑰和加密后的信發給黃蓋,黃蓋收到后,用周瑜的公鑰解密,在不知周瑜私鑰的情況下,就可以明白接下來的一頓棍棒不是真心揍他,只是假意打傷好去做臥底。身雖痛,心卻明。
1977年麻省理工的三位大神Ron Rivest、Adi Shamir、Leonard Adleman發明了至今應用非常廣泛的非對稱加密算法RSA,就是三人姓氏首字母。加密的安全性強弱與密碼長度成正比,目前RSA已知的被破解的長度時768位密鑰,如果超過1024位,目前認為時安全的,超過2048位極其安全。RSA長度增加,保障了安全性,但同時影響了計算的效率。
1985年都曾在哈佛大學畢業的兩位數學家Neal I. Koblitz和Victor Saul Miller各自獨立的發明了一種新的非對稱加密方法,即橢圓曲線密碼學ECC (Elliptic curve cryptography)。ECC在效率和安全性上完勝RSA,有測試顯示,160位的ECC強度可以達到1024的RSA。這種效率,更加有利于信息的加密解密和信息存儲、傳遞。
目前常用的非對稱加密算法除了RSA、ECC,還有ElGamal、Rabin、DSA、ECDSA。其中DSA是ElGamal的變體,在1991年被美國國家標準技術研究所用于數字簽名,而ECDSA則是基于ECC橢圓曲線算法的DSA。
這里我們看到非對稱加密算法的起源和發展,先不需要理解復雜的數學計算,它的基本特點就是用私鑰和公鑰這一對鑰匙分別來做數據信息的加密和解密,不同的算法使用不同的、更為復雜的計算方式來提升加密的安全性和效率。用非對稱算法的這個特點,很大的一個應用就是數字簽名,作為區塊鏈的始祖比特幣,用的是其中的ECDSA算法。
【散列算法(哈希函數)】
有人會問哈希函數是不是一個叫哈希的人發明的?不是,Hash function的Hash(哈希)的原意是弄亂、切碎,在數學和加密的意思上就是把一段原文信息給打亂,提取特征值,做成摘要,也就是散列的意思。嚴格意義上講散列算法不屬于加密算法,它的重要作用是生產信息摘要,用以驗證信息的完整性和來源。摘要無法推導原文,就比如一部數十萬字的小說,作者為了簡介,寫了一段幾百字的摘要,原理上是無法從摘要推導到小說內容的。這里最重要的一個概念是哈希碰撞(collision),即不同的原文,通過哈希摘要之后,摘要不能相同,如果相同了就發生哈希碰撞。而一旦發生哈希碰撞,即原文不同摘要容易相同,哈希算法就失去了意義。摘要的數值有限,而原文可以是全世界的信息組合,如何做到無論輸入任何文字組合,都讓摘要不一致,就是優秀的哈希算法的首要任務。
常見的哈希算法有MD4、MD5,美國國家安全局設計的SHA-1,SHA-2,SHA-3,比利時魯汶大學(Katholieke Universiteit Leuven)COSIC小組設計的RIPEMD,其中MD4、MD5常用于下載數據的校驗,MD4、MD5已被證明存在缺陷。SHA-1在2005年也被發現可以使用破解方法產生哈希碰撞產生。SHA-1被認為不夠安全,2010年以來已被逐步放棄,用2001年發表的SHA-2和和2005年發表的SHA-3來替代。SHA2/3和RIPEMD的下面根據位數有不同的版本。例如SHA-256、SHA-384、SHA-512、RIPEMD-160等等,RIPEMD的原始版在2004年同SHA-1類似也發現有碰撞現象產生,而RIPEMD-160則仍非常安全。
同非對稱算法一樣,我們先不必理解散列算法(哈希算法)復雜的數學計算,依然把它當成一個黑盒子工具,它的功能就是將原文變成摘要,且滿足不同的原文不可能出現相同的摘要,即無法被破解。當把非常長的原文變成很短的摘要后,就更容易做計算和驗證。比特幣區塊鏈用到的是SHA-2中的SHA-256算法,和RIPEMD-160算法。
哈希算法還有一個特性,即原文生成摘要時,當原文稍微有改動,比如10萬字的小說增減一個字或一個標點符號,那么摘要就會變得完全不同,摘要隨機且唯一,并且無法預測。拿SHA-256舉例,十萬字原文增減一個字后,可能整個256位摘要值(哈希值)每一位都不同。如果此時我們有個特殊需要,要讓256位的哈希值第1位數值是0,此時是無法準確計算得出我們想要的結果,只能一次一次地試。比如十萬字小說,為了得到第1位為0的哈希值,我翻著字典把不同的字逐個輪換加到十萬字最后一句,輸入到SHA-256的黑盒子里,如果看到算出的結果第1位不是0,就丟掉繼續換字計算。直到得到第1位為0的結果,達到要求。這里的翻著字典輪換的字就是我們說的隨機數。記住這個特性,后面會用到。
散列算法(哈希函數)的這兩個功能在比特幣區塊鏈中有重要應用,一個是摘要用來做驗證;一個是上述用隨機數變換原文不停嘗試的符合特殊要求的哈希值。
【比特幣-區塊鏈的工作機制】
了解了上述兩類算法,就容易理解區塊鏈技術了。
我們舉個例子,假如有一次劉備從曹操那搞了50萬塊錢,他計劃給關羽發20萬,給張飛發25萬年終獎。我們看看用區塊鏈技術怎么實現劉備給關羽和張飛這兩筆轉賬。這些錢不用黃金也不是白銀,也不是銀票,而是區塊鏈意義上的錢。不同于黃金白銀有實物,區塊鏈的錢類似于銀票,只是這個銀票不是西漢皇帝蓋章的,而是人民群眾蓋章認可。即使老百姓每個人家里都有個賬本記上了劉備從曹操那里搞了50萬。每個人的手機上展示出來的賬本都看到劉備有了50萬的銀票。
劉備先把二弟喊來,說“我劉備給二弟關羽20萬”,然后把三弟喊來,“我劉備給三弟張飛25萬”,并把這兩句話廣告天下。但是老百姓收到這兩句話,首先先看下劉備是不是有足夠的錢,大家的記賬本先檢索一下劉備的過往交易,發現賬本上確實記錄著他從曹操那搞了50萬,是足夠發出45萬。余額核對完,但大家并不知道這兩句話是不是真的劉備說的,這時候就需要進行驗證。
只簡單地把兩句話廣告天下還不行,他還得對說的這兩句話進行加密,并提供驗證方法。怎么讓大家驗證確實這是他說的呢?這時就用到前面我們提到的兩個算法,考慮到三國時期區塊鏈技術已經非常成熟,全國人民每人都有一個哈希算法的黑盒子,和一個非對稱加密的黑盒子。劉備首先使用哈希算法(SHA-256)的黑盒子,輸入“我劉備給二弟關羽20萬”,哈希黑盒子輸出一個摘要,我們叫“摘要1”。
同時他的非對稱加密(ECDSA)黑盒子也用上,這個黑盒子標配一對私鑰和公鑰,劉備把“摘要1”加上自己的私鑰,輸入ECDSA黑盒子,輸出一段密文。
這時,劉備便把“我劉備給二弟關羽20萬”的原文、非對稱加密后的密文、和他自己的公鑰,一起廣告天下。
全國人民收到消息后,馬上利用這三個信息去驗證,每個人用自己的哈希黑盒子計算“我劉備給二弟關羽20萬”的原文生成“摘要2”,這里“摘要2”如果和劉備自己手里的“摘要1”是一樣,根據前面我們講的合格的哈希算法,沒有哈希碰撞,不會存在不同原文同樣摘要,那么“摘要1”樣就證明原文是一樣的。就可以證明原文真實。
劉備手里的“摘要1”大家并不知道,只是收到了“摘要1”的密文,那么根據前面我們說的非對稱加密黑盒子,私鑰加密的可以用公鑰解密,大家用收到的密文和劉備的公鑰解密,解密出“摘要3”。正常情況下“摘要2”、“摘要3”都應該與“摘要1”相同。
如果“摘要2”、“摘要3”相同,則可證明確實是劉備給了關羽20萬。
因為哈希黑盒子和非對稱加密黑盒子不會犯錯,如果“摘要2”和“摘要1”不同,則說明劉備發出來的話跟他實際說的話肯定不一致,如果“摘要3”和“摘要1”不同,則說明這就不是劉備說的,因為私鑰公鑰不匹配。“摘要2”和“摘要3”不同,則上述兩種可能都有;相同,則證明不僅是劉備本人說的,而且說的內容也沒錯。
此外,用哈希算法和非對稱算法,解決了防偽驗證的問題。
劉備給關羽張飛發完錢,突然趙云也跑過來要獎金,可是劉皇叔手上只剩5萬拿不出手,他想耍個小聰明。現在全國人民都在驗證他剛才說的兩句話,計算和驗證都需要點時間,他想趁著大家都在驗證,還沒入賬,把給張飛的二十五萬再發一遍給趙云,緊接著他馬上說了一句“我劉備給趙云20萬”,并像上面一樣,把這句話原文非對稱加密后的密文、和他自己的公鑰,一起廣告天下。
此時全國人民也收到了這句話,但是有的先收到“我劉備給三弟張飛25萬”,有的先收到“我劉備給趙云20萬”,首先檢驗劉備的賬上“余額”只夠付一筆25萬或20萬,大家就只認可先收到的那句,后面收到的因為余額不足將直接丟棄。假設諸葛亮和周瑜工作之余也在兼職做記賬先生(相當于我們說的區塊鏈礦工),靠記賬收取點手續費來賺點外快。記賬先生就需要負責把這句話確認打包加到區塊鏈條中的下一個區塊上。諸葛亮先收到了“我劉備給三弟張飛25萬”,周瑜則先收到了“我劉備給趙云20萬”,他倆后收到的第二句話因余額不足而各自丟棄,但此時以他倆哪個為準呢?比特幣規定他倆誰先能打包成功加到鏈上,就以誰的為準。這里用到前面我們提到的哈希函數算法中的特殊哈希值特性,諸葛亮和周瑜不是各自收到一句話,驗證無誤就能輕易打包上鏈的,他們倆得在驗證完對這句話再次用哈希黑盒子打包,而且按照區塊鏈規則規定,使用哈希黑盒子打包時,得生成的哈希值是特殊哈希值才允許打包上鏈,區塊鏈的要求是SHA-256的前n位是0。前面我們說到哈希函數不能算出我們想要的結果,只能生成離散的數值,如果想要前n位是0,只能在原文基礎上增加隨機數不停的嘗試。這里諸葛亮和周瑜就要不停的改變隨機數,在各自黑盒子里不停嘗試,直到其中一個嘗試出前n位為0的哈希值,被允許打包上鏈。
假設周瑜先嘗試到了,周瑜打包的區塊成功上鏈,則劉備耍的小聰明就無法實現一筆錢花兩次,大家都會認可趙云收到了錢,張飛則沒收到。
此時聰明的你可能會問,那如果諸葛亮和周瑜碰巧都同時嘗試算到了前n位為0的哈希值都同時上鏈了呢,不怕這時候趙云和張飛的錢都還不算入賬,區塊鏈規定的是最長鏈原則,全國老百姓的黑盒子都在記賬和打包,接下來看諸葛亮和周瑜上鏈的區塊的下一個區塊,誰的鏈能被其他人最快的時間鏈接上下一個區塊,誰的鏈長誰就被認可。如果諸葛亮和周瑜的打包是同時上鏈,但是緊接著還是周瑜下一個區塊比諸葛亮的下一個區塊更快打包上鏈成功,則以周瑜的為準,趙云的錢入賬,張飛沒收到。這也是為什么比特幣交易需要等至少10分鐘以上才能確認入賬的原因。
這里需要提示一下,諸葛亮的哈希黑盒子和周瑜的哈希黑盒子雖然用的算法都一樣,都是SHA-256,但是這倆黑盒子可能計算能力不一樣,也許一個是小米,一個是華為。因為都是一個一個去嘗試,那么計算能力強的那個理論上嘗試成功的幾率就大很多。所以真實中的礦工都在軍備競賽一樣提升各自黑盒子的算力。
這個機制從根本上解決劉備這種一筆錢兩次花的小聰明,同樣,最長鏈原則也可以解決篡改的問題,假設劉備給過關羽20萬反悔了,他想修改他的話,從區塊鏈系統上抹去。那他不得不偽造另一個鏈,“我劉備給二弟關羽20萬”已經是全國人民已經不停的記賬鏈條中的一個節點,而且在這個節點之后還在不斷地加長,如果劉備要篡改,就需要在這個節點之前另外起一條鏈,我們說過,記賬、打包、上鏈沒有捷徑,只能用哈希黑盒子一次一次的嘗試,如果劉備想讓自己篡改的鏈被全國人民認可,他的鏈就要更長,那就意味著他的算力要更強,超過全國所有其他人,才有可能。邏輯上講如果他一個人的黑盒子算力能超過全國,也沒必要篡改,因為他正常計算獲得的外快收益也遠遠超過他篡改的那筆收益了。
我們通過劉備發錢的過程可以看到,區塊鏈就是利用哈希函數和非對稱加密兩個數學工具,實現一套記賬系統的完備運行。這套系統很完備解決了記賬問題,比皇帝蓋章還可靠,解決了防偽問題,也解決了一筆錢兩次花,即雙花的問題。目前被很多人所接受并使用,但小鏈君并不是建議你去投資,畢竟現在加密貨幣缺乏監管,還是野蠻生長狀態,到處是割韭菜的鐮刀。我們只了解其技術,和這項技術的應用,區塊鏈并不是只用在加密貨幣中,在一些人類需要保存的信息,例如檔案、房產證等等公共信息中,也可以得到很廣泛的應用。深圳在2021年7月開出第一張基于區塊鏈技術的《代理出口貨物證明》,開始了區塊鏈技術在出口退稅領域的應用
【未來這套加密能被破解嗎?】
現在看區塊鏈的算法和機制還沒有破解的可能,哈希函數和非對稱加密算法可預見的未來內仍非常安全,有的大聰明會問,當量子計算機未來得到應用,現在的算法會不會遭到破解,從而使得區塊鏈的基礎動搖呢?目前的估算認為,破解256位素數域上的橢圓曲線,需要2330個量子比特與1260億個托佛利門。而破解2048位的RSA則需要4098個量子比特與5.2萬億個托佛利門。換成人話是目前人類還不沒有建造如此大型量子計算機的科學技術,因此橢圓曲線密碼學至少在未來十年(或更久)依然是安全的。然而密碼學家已經積極展開了后量子密碼學的研究。其中,超奇異橢圓曲線同源密鑰交換(SIDH)有望取代當前的常規橢圓曲線密鑰交換(ECDH),實現量子計算的安全保障。廣袤的宇宙中,未知總比已知更多,浩瀚的數學里加密更比破解難。相信未來即便遇到新技術的更迭,區塊鏈技術隨之更新可以應對任何挑戰。