透視區塊鏈里的密碼學
大多數人對區塊鏈的理解還只是一個大概印象,雖然很多人都認為區塊鏈是去中心化的可信基礎,但只有少部分人可以理解其中的具體原因。現在談到的區塊鏈,其實是基于一系列密碼學算法構建而成的。對于非密碼學專業的人來說,理解起來是很艱澀的。
本文,我們將從密碼學的角度對整個區塊鏈結構進行一個整理講解。針對具體的密碼學技術,盡量使用通俗的例子,希望能幫助大家增加對區塊鏈的理解。
賬戶
深入學習區塊鏈之前,我最好奇的就是每個人的賬戶在一個分布式系統中都是如何生成的。
畢竟在中心化系統中,賬戶是由服務方進行生成和驗證的。比如我們申請微信號,微信號是騰訊在他們自己的服務器里幫我們創建并管理。但在區塊鏈系統中沒有一個中間企業幫我們創建賬戶,那在區塊鏈里是如何生成賬戶的呢?
安全隨機數
這里就需要引入密碼學里的第一個概念,【安全隨機數】,即在本地隨機生成一個字符串,也就是我們的私鑰。由安全隨機數算法生成的隨機數,我們可以無限假設是安全的。
比如,現在允許你在全宇宙中隨機選擇一個原子,不做標記,然后讓你的朋友在不知情的情況下找出這個原子,你可以想象一下這個難度,而基于不同的足夠安全的隨機數種子生成相同的隨機字符串的概率比找到那個【原子】還低的多得多。因此,雖然我們都是在本地生成區塊鏈私鑰,但是完全可以認為是安全的。
公鑰算法
通過安全隨機數算法生成了私鑰,那么如何通過私鑰生成公鑰以至地址呢?這里就需要引入第二個密碼學概念【公鑰算法】。
【公鑰算法】通俗來講就是公鑰加密,私鑰解密,任何擁有你公鑰的人都可以用你的公鑰來對數據進行加密,但是只有對應的私鑰才能對這個數據進行解密。就好比是你造了保險箱,任何人都可以把他的東西放在保險箱里,然后鎖上箱子,一旦鎖上只有你才能打開。這個公鑰算法在區塊鏈里用的是橢圓曲線,原理則是數學上對大數進行因數分解的困難。
比如,大家都知道 6 可以由 2 乘上 3 得到,這個很簡單,但如果給你超級大的數呢?比如一千位?兩千位?你可能會想著用自己的電腦來計算,畢竟數學已經發展這么多年計算機算力也幾何式增長,肯定算得出,但是很遺憾的告訴你這個時間是成千上萬年,足夠我們每個人回歸地球母親了。
給一個足夠長的私鑰,我們可以得到一個公鑰,基于大數因數分解的困難性,沒有人可以通過這個公鑰計算出私鑰,這樣我們就得到了一個區塊鏈賬戶。這個賬戶僅僅包含私鑰和公鑰,那么我們通常使用的地址又是怎么來的呢?
簡單來說我們通常使用的地址就是公鑰的小名,比如迪麗熱巴·迪力木拉提是迪麗熱巴的全名,但是這個名字太長了,所以我們通常叫她熱巴。公鑰也是這樣,雖然公鑰的長度保證了安全性,但在使用時沒這個必要,畢竟數據是要存儲起來的,沒必要的數據也就沒必要存在,因此我們對區塊鏈賬戶的公鑰進行了一系列的【哈希】操作,并添加一些版本信息以及校驗信息等等生成我們最終的區塊鏈地址。后文也將提到這個重要的密碼學概念【哈希/摘要】。
以上介紹了區塊鏈里的賬戶,基本邏輯就是 隨機數→私鑰→公鑰→地址。隨機數是不可重復的,公鑰和地址是可以計算的,因此你一定要保護好自己的私鑰,有私鑰,有一切。沒私鑰,那你可能也要像英國小哥一樣天天在垃圾站扒拉自己的硬盤了。
交易
交易對于大對數用戶來說,算是了解區塊鏈最多的地方了,畢竟大家用區塊鏈主要還是為了【交易】。假如最開始中本聰提出的比特幣沒有幣這種激勵概念,那恐怕無論區塊鏈還是比特幣現在都早就被遺忘了。
國內現在習慣使用支付寶和微信來進行轉賬發紅包,這個過程是由支付寶和騰訊這種中心化機構來幫助我們處理的。
比如我給你轉5毛,你給我轉500,這個過程都只是數據的流動,支付寶會真的把五毛錢挪來挪去嗎?不會,都只是數據庫里的數字變化而已。但因為支付寶和騰訊是大企業,具有公信力,因此我們相信他們不會擅自動我們賬戶里的錢。無論你查看多少次,五毛也不會突然變五個億。
但是區塊鏈的交易就會出現問題,我們沒有一個中心化的企業幫我們管理這幾個億。我說給你轉1個億,但是我賬戶里只有五毛,怎么辦?我說給你轉五毛,但是區塊鏈從我的賬戶里給你轉了一個億,我怎么辦?
數字簽名
【數字簽名】密碼學算法,可以解決這樣的困擾。【數字簽名】顧名思義就是數字化的簽名。
在日常生活中,簽名代表著自己的授權,具有法律效力。在數字時代,取代古時候簽字畫押的就是【數字簽名】,畢竟你不能對著電腦屏幕按指紋。數字簽名也是基于我們提到的【公鑰算法】,但是反著來,前面提到公鑰加密與私鑰解密,這里我們用私鑰對輸入數據生成一段可驗證的字符串稱為簽名,這個簽名可以用公鑰來進行驗證。數字簽名可以保證原數據的完整性和真實性。
比如,你給你女朋友發個 I love U, 并附帶你的簽名,你女朋友驗證了簽名后知道是你發的,又知道數據沒有被改過,這就是個浪漫的愛情故事。但如果沒有簽名,中間被情敵改成了 I hate U,你女朋友又沒法驗證,那你的下一個520可能就要自己過了。
同理,【數字簽名】在區塊鏈的交易過程中也扮演著同樣的角色,保證交易的完整性和真實性。
完整性即交易的準確數額,真實性即交易的存在與否。具體而言,我生成一筆交易寫上給你轉五毛,然后用我的私鑰對數據進行簽名,說明這個交易確實是我授權的,然后把交易廣播出去,別的節點就會驗證這個交易,一看簽名確認數據是正確且真實的,那剩下的事情就交給共識了。但是如果發現數據和簽名對不上,那不好意思,你的五毛沒有了,一毛都不給了。
區塊
查閱區塊鏈圖片時,基本通篇都是數字化鐵鏈的圖片,雖然看上去很酷炫,也和【鏈】這個詞很契合,但是區塊就很委屈了,畢竟鐵鏈子的結構里完全看不到區塊原本的樣子。這里需要給區塊正名下,我區塊,今天從這里跳下去,哪怕打包到分叉上,也不當一個鐵環。
從數據結構上來說,一個合格的區塊應該像一顆二叉樹,或者類似于生物譜系圖,從爺爺輩到父輩到自己這輩整體看下來就是個分叉樹,不過區塊是個二叉的。這樣的結構是因為區塊本身是基于Merkel Tree這種數據結構來進行組織的,最下層是交易的【哈希】,往上是兩個交易哈希的哈希,再往上是兩個「兩個交易哈希」的哈希的哈希。通俗點理解就是你的公司,最下面是干活的你;上面是看你干活的主管;再上面是主管的主管,看下級主管和干活的你,以此類推到 CEO。
哈希
這里著重提一下【哈希/摘要】,哈希算法是一種基于哈希函數/散列函數的單項算法,具有定長性和不可逆性。定長是指無論你輸入多長的數據,輸出都是固定長度的字符串;不可逆性是指你無法通過輸出的數據逆推出原本的輸入。比如【碼】,在加碼的過程中,無論原本的數據多么內涵,輸出的都是固定大小的色塊,原本的數據信息其實是大量混淆并且丟失了的,你無法根據碼后的數據恢復出碼前的數據。
區塊鏈
區塊鏈本身是容易理解的,網上的許多圖片都是一串大鏈子,由一個個區塊串聯而成。而且在每個區塊生成的同時,它也已經被固定在區塊鏈上,不需要額外生成一條鏈的過程。
我們在講區塊的時候忽略掉了一部分數據,就是關于當前區塊在區塊鏈上的高度,以及前區塊的哈希值。有了這兩個數據,每一個區塊在所有的由區塊構成的鏈式結構里都具有了位置的唯一性和數據的不可篡改性。
比如,小學組織出游,老師為了避免學生走丟,都讓每個學生依次記住另一個學生。如果老師想查人,只要讓每個學生查看鄰邊的學生即可。如果你中間想自己跑著玩,你鄰邊的學生立即就知道你不見了。
你可能會問,如果你偷偷把朋友也叫過來一起玩夾在你之后呢,但是每個學生也有自己的編號,如果你偷偷夾了朋友,那你朋友的編號必然要么跟你或者跟你的后一個人是重復的,這樣也很容易發現。基于這樣的組織形式,我們就從交易打包成區塊,又從區塊連接成了完整的區塊鏈。
結語
以上從分布式系統中的賬戶生成、交易驗證、區塊結構、哈希算法等密碼學角度,大致介紹了區塊鏈技術的概念。
如果你還不能完全理解區塊鏈時,就多品一品那些通俗易懂的例子。當以后有朋友問你區塊鏈概念時,就用例子以說之。