當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

​你好,這裡是BIMBOX。

最近兩年區塊鏈的熱度越來越高,也有越來越多的宣傳,各種行業都要「+區塊鏈」,連咱們的BIM也有很高的呼聲。

很多人可能聽到區塊鏈這個名詞覺得很炫酷,又或者與騙子掛鉤,但其實並不瞭解它到底是個什麼東西,只知道好像和比特幣有關係,大概是個去中心化的東西,但再往深處聊,比特幣和區塊鏈有啥區別?為什麼能做到去中心化?就說不出所以然了。

很多文章講區塊鏈,喜歡略過技術細節,用一些淺顯的例子打比方,來說明去中心化和分佈式記賬是怎麼回事,這麼講的好處是誰都能聽懂,但也有個壞處,那就是聽了的人只能大概瞭解區塊鏈的優點,然後就「比方套著比方」,直接把區塊鏈技術給套用到其他技術上去了。這也是為什麼很多場合區塊鏈被過度宣揚,似乎成了無所不能的神器。

如果連基礎原理都搞不清楚就去談未來,就好像在談論怎麼能用電冰箱解決移民火星的問題一樣。

所以,我們打算跳過所有的比喻,用硬核的方法給你講清楚區塊鏈的工作原理、底層邏輯到底是什麼,幫你去掉心裡的區塊鏈崇拜或者牴觸,知道它能做什麼、不能做什麼,有哪些缺陷。同時也會思考區塊鏈的未來,它到底會對各個行業的發展產生什麼樣的影響。

1 比特幣:從支付說起

說區塊鏈之前,咱們得先聊比特幣。

可能你覺得,我不想炒比特幣,那玩意我不感興趣,就想聽聽區塊鏈在其他行業是怎樣應用的。但是,如果你想把區塊鏈搞清楚,那比特幣是繞不過去的,一切區塊鏈設計想法都來自比特幣。

比特幣是一種電子支付的方式,我們用的手機支付也是電子支付,但比特幣和手機支付不一樣。手機支付背後肯定有一家機構,或者是騰訊、阿里,或者是某家銀行。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

而比特幣的設計初衷是希望在支付中擺脫中央銀行的管制。比如說支付和收款雙方匿名,交易不能偽造,所有這些功能都由程序自動保障。既然沒有某個機構維護,就必須通過算法的設計了。

任何一項技術都不可能脫離其他技術單獨存在,比特幣也是一樣,它就是建立在一套完整的現代加密算法上的。

比特幣中的密碼學理解起來並不難,可是一層層套起來解決問題的思路卻閃耀著理性的光輝,咱們一個個來說。

2 SHA256:我的信息怎樣不被篡改?

作為一種虛擬貨幣,比特幣首先要解決的就是怎樣把一條信息加密,讓別人無法修改。這裡用到的就是第一個技術:SHA256加密

SHA256的全稱是「安全哈希算法」,它是Hash(哈希)函數的一種。

哈希函數的特點是,不論原始數據有多少位,經過運算後,得到的結果長度都是固定的。比特幣中用到的是SHA256,就代表運算結果是一個256位的2進制數字。

最終這個256位的字符串能用在加密上,需要滿足兩個條件:

➤ 不論原始信息多長多短,都能且只能計算出唯一結果;

➤ 算法必須是單向的,不能通過結果,反算出原始信息來。

這兩個目標要達成,就要用到數學裡的一種特殊運算方法,就是模運算

模運算不難理解,就是先規定一個模數,凡是超過這個模數的結果,就回到起點重新計算。

比如鐘錶上面的錶盤只有12個數字,它的模數就是12。假如我要把某個數字在錶盤上加密,比如加密方式是「把原始數字加上5」,那假設我的原始數字是9,那麼9+5等於多少呢?在這個模數為12的運算裡,結果不是14,因為已經超過模數了,結果應該是9+5-12=2。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

如果反過來運算,單憑結果2,你是無法反推出初始的數字9的,因為你不知道在這個模運算裡,數字繞著錶盤轉了幾圈。原始的數字既可能是9,也可能是21,或者任意一個9加12整數倍的數字。

而SHA256函數的運算結果,是一個模為2的256次方的值,所以這個值一定是可以寫成256位的。

把一個信息轉換為一個特定數字,最早是為了驗證兩個文件是否一致。比如你在一些論壇下載軟件的時候,經常會隨著軟件附帶一個校驗碼,有時候是SHA256,有時候是MD5,它就是把整個軟件的全部數據,經過算法生成這麼一串字符,你下載好軟件,在本地也可以使用校驗工具把它算出一個結果,和論壇上的字符串做對比,如果一致,就代表這個軟件沒有被篡改過。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

一行文字哪怕只是標點上有些微小變化,對應的SH256值也會產生很大變化。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

你可以百度搜索一下SHA256,第一個結果就是在線SHA加密,輸入一個句子,然後稍微改動一點點,看結果是不是有天壤之別。

這個函數非常重要,會貫穿我們講述整個區塊鏈的過程中。

首先,它就是用來解決支付信息加密的問題。

比如我要付給開開200塊錢,就在網絡上寫下一條信息:「老孫需要支付200元給開開」,這就是支付信息。但這條信息是有風險的,萬一有人把200改成800,那我可就要哭了。

而剛剛的SHA256算法,就避免了信息被篡改的問題。這條支付信息的哈希值是確定的,(哈希值就是SHA256算出來的數值)。在發出信息的同時給出計算出來的哈希值,和剛才說在論壇上下載軟件的例子一樣,之後任何的改動都會被發現,只要被改動就視為無效。

但只保證了支付信息沒有被改動過還不夠。因為如果有人就是心理陰暗,發出很多條「老孫需要支付200元給開開」,然後錄入支付系統,那我也要虧死了。

所以,光是加密信息還不行,還需要數字簽名。它的作用是用來保證「老孫需要支付200元給開開」是老孫本人親手發出的,而不是其他人發出的。

3 非對稱鑰匙:怎樣確保信息源?

我們現實生活裡使用手寫簽名,是因為筆跡很難造假。但電子信息中,誰都可以敲出「老孫同意」這幾個字,怎麼用電子簽名來確認一條支付信息是我本人確認的呢?

這就得靠「非對稱鑰匙」了。

任何信息都可以通過計算變成一段數字,比如我要給熊仔發一串數字「666」,我要加密這段數字之後發給熊仔,我倆可以事先約定一種加密方式,比如給每個數字都+3,熊仔那裡收到的結果是999,按我們之前約定過的,每個數字都減去3,就得到了結果666。在這個過程中,數字「3」就叫做鑰匙,又因為加密和解密都用的是它,所以叫「對稱鑰匙」。

在開放的互聯網上,對稱鑰匙有著致命的缺點,因為鑰匙至少需要單獨傳遞一次,無論是打電話、還是發郵件,我得事先和熊仔約定鑰匙是「3」。而傳遞鑰匙這條信息本身是沒有加密的。如果這個鑰匙被人知道了,那誰都可以給熊仔發任何信息,熊仔也不知道哪條是我本人發的。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

這時候「非對稱鑰匙」就要登場了。你可以這樣理解它:加密和解密用的不是同一把鑰匙,我選則其中一把加密的話,另一把鑰匙就可以解密。

兩把鑰匙,我把其中的一把保留在自己手裡誰也不告訴,叫做「私鑰」,另一把鑰匙則是公開給大家,誰都可以看見,叫做「公鑰」。公鑰和私鑰是通過一種不可逆的數學計算關聯成對的。是的,不可逆的運算還是基於剛才說的模運算。

數字簽名的問題就是這麼解決的。當我發出一條交易信息時,我先用自己的私鑰給信息加密,再把加密後的內容連同公鑰一起發佈出去。別人如果用公鑰解開了,就說明當初這條信息是用這把公鑰對應的私鑰加的密,那就是我本人了。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

這兩個知識點你理解了,我們就可以還原一次比特幣交易的過程了。

比如我要給開開發200比特幣,我的比特幣客戶端軟件會做這麼幾件事:

➤ 把「老孫給開開200比特幣」當作原始信息,對它做一次SHA-256運算,得到一個原始哈希值

➤ 用私鑰給原始哈希值加密,得到加密的哈希值

➤ 把原始信息、公鑰、加密的哈希值,這三個內容同時發佈到全網去,給別人驗證。哈希值用來保證信息沒有被篡改,加密和解密保證信息出自我本人。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

到此為止,我們解決了信息源可靠且不可更改的難題,其實這兩個問題現在任何一家銀行都能解決,並不是區塊鏈的特權。可是別忘了,區塊鏈可是要「去中心化」呢!那如果沒有了銀行這個中心機構,會面臨什麼麻煩呢?

4 去中心:誰來幫我記錄餘額?

沒有中心機構,首先的問題就是每個人的賬戶餘額由誰來記錄。比如,老孫支付開開200元錢,可是老孫賬戶裡的餘額夠嗎?

這個疑問在傳統銀行系統裡不是問題,因為銀行可以查看任何人的賬戶餘額。在銀行的系統裡,你是相信銀行不會篡改你的賬本的。

但在比特幣系統中,餘額有多少,不能自己說了算,自己說了也沒人信。而且,任何一個參與者和其他參與者有同樣高的權限,當然也沒有一個「說了算」的人來統一監管每個人的餘額,所以還是隻能通過程序和算法的設計。

這一步的程序解決方法是——每筆交易都必須以上一次交易作為基礎

比如「老孫支付200元給開開」,這筆交易可以進行的前提是,之前有人付給老孫過錢。

假設之前熊仔已經給過老孫200塊錢了。那麼老孫給開開付錢時,發送的標準信息是這樣的:「熊仔支付200元給老孫,老孫支付200元給開開」,再加上老孫的數字簽名和公鑰,一塊發出去。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

你看,到這兒是不是有點「鏈條」的意思了?不過,我們的旅程還沒有結束,光是把信息發出去還不夠,我們還得把它記錄下來。這就要涉及到區塊鏈的本質了。

5 分佈式記錄:區塊鏈登場

當我把一筆交易的信息發佈到全網之後,就會有其他比特幣參與者幫我驗證。這些人就是挖礦的「礦工」。

為啥叫挖礦?我們一會再說,先說說曠工們的驗證工作。

➤ 首先把我發的原始信息(老孫給開開200比特幣)做SHA256的運算,得到一個原始信息的哈希值

➤ 用我提供的公鑰,把加密的哈希值解密,得到一個新的哈希值

➤ 把兩個哈希值做對比,如果一致,就代表這條信息確實來自我本人,且沒有被篡改過。

這個過程和前面講的發送這條信息過程正好是反過來的。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

如果以上驗證通過,就進行下一步的記錄操作。當然,這些工作都是比特幣軟件自動完成的。

那麼礦工是不是把這條記錄存在自己的電腦裡,就萬事大吉了?還不行。

我們說比特幣的特點是分佈式記賬,那就得保證所有交易記錄在每一臺電腦上都必須存著一模一樣的副本。但要實現這一點還真的很難。

沒有任何一箇中央機構來24小時不間斷的記賬,所有記賬的人都是分佈在全球各地的,他們有的在交易發生的下一秒參與了驗證,有的當時不在線,隔一天才收到需要驗證的記錄,有的可能幾個月都沒開電腦。那麼交易記錄的同步就成了問題。

這時候,區塊鏈終於登場了。

咱們先說「區塊」,再說「鏈」。

在區塊鏈中,每一個區塊裡都包含著上千條交易記錄。礦工收到一個區塊,檢查通過之後,他的保存方式是把新的區塊添加到自己電腦裡的鏈條最末尾

,同時也會把這個新區塊發給其他礦工,他們也會做同樣的工作。

前面講了,每一條交易都必須是基於以前的交易,所以礦工的保存不單單是一個儲存的動作,還有一個「加鏈」的動作,這個動作還是通過計算來解決。

通過一定的算法,新區塊的生成要得到一個字符串,它由以下三部分組成:

➤ 新區塊的基本信息,比如版本號、區塊產生的時間(也叫時間戳)

➤ 這個新區塊本身包含的上千條交易記錄,累積用SHA256算出一個哈希值,叫做Merkle根

➤ 前一個區塊用SHA256計算的哈希值

區塊鏈之所以被叫做鏈,最關鍵的就是第三部分:前一個區塊的SHA256函數值,它就是區塊與區塊間首尾銜接的「鏈」。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

以上的每個部分,都使用SHA256計算得到唯一的字符串,最終合到一起,再計算出一個總的哈希值,也就是當前區塊的哈希值,作為下一個區塊引用的字符串。

這樣,全網所有的電腦並不是分散著記錄一筆一筆的交易,而是把所有的歷史交易全部串成一個鏈條,所有人儲存的都是歷史上的全部交易的總和,只不過它們是用SHA256函數計算出來的。我們前面講這個函數時候說過,它不能通過結果反算出原始信息來。所以也不必擔心具體的交易信息被洩露。

問題結束了嗎?還沒有。別忘了,任何一個網絡中,都有貪婪的壞人。

6 挖礦:對付壞人的大數計算

因為沒有中央機構,就沒法保證全網在同一時刻只存在一條鏈,區塊鏈在記錄的過程中有可能會「分叉」,有時是因為操作失誤,但更多時候是來自惡意。

舉個例子:老孫從別人那收到了200個比特幣,把它支付給了開開,緊跟著又操作一遍,把這200個比特幣支付給了熊仔。這樣200就能當400花了。

注意,這兩條信息都是真實的,也都按照規則,基於前邊一個交易,也就是「老孫收入了200比特幣」作為上一個區塊。

結果,全球各地安裝了比特幣軟件的人,因為網速的原因,有人會先收到第一筆支付信息,有人會先收到第二筆支付信息,哪個才是有效的?如果這兩條交易都被記錄下來,那可就亂套了。

你可能會想:不對吧,老孫把錢支付給了開開,那他的餘額應該是0了,不能再支付給熊仔了呀?如果你這麼想,就還是沒離開傳統的記賬方式,別忘了,在比特幣世界裡,沒有中央機構負責記錄每個人的賬戶餘額。

區塊鏈網絡的解決辦法是:限制單位時間裡產生新區塊的數量,比如十幾分鍾之內只允許產生一個新區塊。可是既然沒有中央機構來監督,這個限制動作本身又是怎樣完成呢?

答案是:讓全網的計算機同時算一道難題,所有計算機的算力加起來,平均十幾分鍾才能算完這道題。

這麼難的題怎麼出呢?

剛才我們說,生成一個區塊要算出一個字符串來,這個字符還不能作為最終結果加到整個鏈條上,而是要再加一步操作:由軟件生成一個隨機數,和剛剛的字符串一起組成一個新的字符串,接下來,要把這個組合成的字符串再用SHA256算一次,會得到一個新的256位數。

運算的結果必須是前72位全部都是0,才算正確答案,也只有前72位全都是0的結果,才能作為這個區塊的哈希值,被下一個區塊引用。

如果算一次結果不正確,那就再給個隨機數,再計算,直到算出來為止。

所以,我們要在前面的圖上加點東西,下面這張圖才是一個區塊的完整版:

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

那麼,既然軟件給的是一個隨機數,哪能那麼巧,算出來前72位全都是0呢?沒錯,這就是關鍵。

區塊鏈網絡設置這道題,就是要讓算出來這個結果的概率很低,低到什麼程度呢?每一位結果可能是0或者1。第一位是0的概率是1/2,第二位還是0的概率是1/4,第三位還是0的概率是1/8……這樣延續下去,整個網絡裡大概平均要進行2的72次方次運算,才會有一臺機器,幸運地算出了正確答案。

按照目前全網的算力估算,得到一個正確答案的時間,差不多就是10分鐘。區塊鏈就是通過這種方法來控制新區塊出現的頻率。

如果以後的計算機算力越來越強,算出答案的平均時間越來越小怎麼辦?很簡單,只要修改一下規則,把72位全是0改成73位、74位,每增加一位,難度就翻一翻。

這個運算量很大,而且它的目的只是為了「拖延時間」,其實是一個沒有意義的運算。那大家憑什麼願意拿出電腦來算這個數,幫別人記賬呢?

比特幣的規則規定,最先算出來的人,獎勵一定數量的比特幣,這也就是為什麼參與比特幣的人叫礦工了,他們挖的礦,就是系統獎勵的比特幣。

當然,這個獎勵不是一成不變的,否則錢越來越多,就會通貨膨脹。一開始是獎勵50比特幣,往後每推進21萬個塊,獎勵就會減半,這樣一直減下去,總數加起來大概就是2100萬個比特幣封頂,這也就是為什麼比特幣越來越值錢的原因。

其他礦工看到有人挖到了礦,只能乾著急,因為軟件是一個個生成隨機數,算出正確答案,就更新到自己鏈的末尾,同時發佈給全網。誰先給出來符合要求的結果,誰就說了算,誰就能得到獎勵。

而剛才的問題也就有了答案:老孫在1秒鐘內給開開和熊仔先後轉賬,最終哪一筆算數,不在於老孫操作的順序,而在於這兩筆交易中哪一筆被幸運的人先算出正確的答案來,另外一筆由於失效會被作廢。

7 長鏈優先:拒絕造假

看完上面的講述,你會不會覺得比特幣網絡完全安全了?並不是。

壞人不止一種,還有人可以在不犯規的前提下,偽造比特幣,其實也就是偽造記錄。

比如熊仔比老孫還要利慾薰心,在當前區塊鏈的基礎上,自己給自己付一大筆錢,然後提交到全網,怎麼辦呢?

注意,這裡面他並沒有違背前面說的原則,他偽造的基礎是基於上一個正確的區塊,發佈的信息也是經過正確加密的,只要他的電腦算力夠好,算出了前72位都是0的正確數值,這條交易就會被記錄並且發佈出去。

這樣的問題怎麼解決呢?這就得說到區塊鏈的另一條規則:全網只認最長的那一條鏈

熊仔可以憑運氣做出一個區塊,相當於做了一條分叉,但是在這條分叉上的下一個區塊還得他一個人做,下下個區塊還得他自己做。而在另一條沒有造假的鏈條上,是全網所有人在做區塊,一臺電腦的算力無論如何是比不上全網的,很快他的鏈條長度就被甩在後面,無人問津了。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

實際上,因為全網的客戶端都是自動選擇最長的鏈條去做區塊,更大的可能是熊仔的電腦還沒來得及算出來72個0的結果,全網中正確的鏈條就已經往前推進十幾個區塊了,熊仔做出來的假區塊根本就不會被人家搭理。

看了這些你可能會想,動用了這麼多的技術,把計算搞這麼麻煩,到底是為什麼呢?其實這背後全都是為了去中心化所付出的代價。那為啥一定要去中心化?這就不是技術問題,而是理念問題了。

比特幣和區塊鏈是由一群極客發明的,他們的原始願望,就是打造一個人人平等的、沒有任何機構管控的互聯網世界。至於區塊鏈後來被其他人、甚至其他機構用起來,那就是另外一個故事了,我們放到下一期再給你細說。

8 總結、福利和預告

今天我們從比特幣出發,給你在微觀的層面上講解了區塊鏈的技術原理,其實它的本質,就是利用一系列的加密算法,代替中央機構的作用,而這些算法本身並不是很難理解。

你可以看到它為什麼能在根本上實現去中心化、不可篡改,同時也能看到它為了實現去中心化的目的,也帶來了處理效率低、浪費算力等弊端。

但是,我們的話題還遠遠沒有講完,區塊鏈發展到今天已經很多年了,它後來又經歷了哪些變革?它可能被黑客攻擊嗎?所有區塊鏈都是一樣的嗎?什麼是公鏈、私鏈和聯盟鏈?除了做電子支付,區塊鏈在其他行業裡還能做什麼?又有哪些宣傳言過其實了?

這些內容,我們放在下一期宏觀內容裡給你講。

另外,今天我們講到的哈希函數、模運算、公鑰和私鑰加密等各種加密算法,全都來自於這本《碼書:編碼與解碼的戰爭》,從最簡單的字母移位加密法,一路講到量子計算的世界,讀起來燒腦又過癮,強烈推薦給你。

當我們談“BIM+區塊鏈”的時候,到底搞懂區塊鏈了嗎?

讀完今天的內容,歡迎你寫下自己的看法,我們會給留言點贊前三名的小夥伴免費寄出這本書。

有態度,有深度,BIMBOX,咱們下次見!


分享到:


相關文章: