區塊鏈是什么?
我理解區塊鏈就是一個去中心化不可篡改的數據庫,或者說是一個分布式賬本,有一個小故事幫助大家理解區塊鏈技術是怎么回事:
“比特村的故事”,在一個村子里,一開始村民相互交易用的是黃金,后來村民發現直接用金條交易方式非常不方便,一是金條容易磨損;二是金條質量比較重,進行交易時可能需要隨身攜帶,特別不方便。
后來他們提出一種辦法,由村里一位德高望重的村長替大家記賬,把金條收到村長那里,記錄一下每個人有多少錢,余額信息就在村長賬本里記錄。之后村民們互相交易時只需要跟村長說轉了多少錢,比如張三買牛轉了多少錢給李四,村長完成這筆交易記錄之后,這筆轉帳就算是完成了。這就是中心化的賬本,也可以理解為數字貨幣的時代。
但是中本聰發現這種模式可能會存在一些問題:
1、中心信任程度問題,村長可以做假帳,把自己或自己朋友余額增加,普通村民沒辦法去監管這樣的改變,這樣可能整個市場中流通的貨幣會增加,造成通貨膨脹。
2、這個賬本只保存在村長這里,那么賬本維護可能會有問題。如果賬本損壞或者其他因素造成歷史記錄丟失,可能就再也找不回來了。
中本聰提出了去中心化賬本的構想,目的是在沒有一個可信中心的環境建立一個全民賬本,這個賬本主要原理是大家一起記賬,每筆賬目都需要所有記賬人共識,并且每個人都存在這樣一份相同的賬本,這樣就不用擔心有個別記賬員造假、丟失的問題了。
一是個人造假的賬本不會得到大家的認可,二是個人丟失賬本可以通過其他人重新獲取這個賬本來恢復所有的歷史交易記錄。不過這種分布式賬本會有一些問題需要解決:
第一個問題:賬本一致問題,因為所有人都參與記賬,每個人賬本如何保持一致是最關鍵的一個問題;
第二個問題:每個人都有這樣的賬本,意味著所有人的交易都是公開的,很可能所有人的余額也是公開的,能否做到對交易匿名處理,就是把所有人資產信息隱藏起來;
第三個問題:交易怎么鑒別真偽?即如何防止別人冒充你花你的錢?
第四個問題:大家都記賬,記賬肯定有消耗,需要消耗存儲、消耗精力,如何讓記賬員長期維持下去?
針對這幾個問題,中本聰提出一些關鍵技術來解決這些問題,我們后面會一一講解。
區塊鏈技術架構可以分為七層,從底層往上依次是加密層、數據層、網絡層、共識層、激勵層、合約層和應用層,而每一層都運用了一些技術來保證整個區塊鏈系統的正常運作。
加密層
1.哈希函數;
也叫散列函數,是把一段數據壓縮成一個摘要,這個摘要相比原始信息更小,但有一些比較特別的性質,首先是確定性,如果相同的輸入數據得到的輸出是相同的。
基本是不可逆的,給定一個輸出,無法直接推算出輸入,雖然我們知道有無數個輸入會輸出同一個哈希值,但如果知道哈希值的話,很難計算出任何一個輸入。
“雪崩”效應,輸入信息只要修改一小部分,哪怕是一個單詞,一個字母,甚至1bit值,輸出的哈希值就會產生翻天覆地的變化,這一點保證它是不可逆的。
哈希函數有什么用?
在分布式賬本里,為了保證數據完整性,會采用哈希值進行校驗。如,一筆交易、一頁賬本(也就是區塊的概念),用了哈希之后生成摘要,意味著整個區塊交易信息無法進行篡改(即無法在篡改數據之后保持摘要不變)。
區塊鏈原始的定義或狹義的理解就是區塊+鏈的形式,這個鏈是通過哈希鏈接起來,每一個區塊可能都有很多交易,整個區塊又可以通過哈希函數產生摘要信息,然后規定每一個區塊都需要記錄上一個區塊的摘要信息,這樣一來所有區塊都可以連成一條鏈。
如果改了歷史中某一個區塊的數據,意味著這個區塊摘要值(即哈希值)會改變,那么下一個區塊中記錄的上一個區塊的哈希也得做相應的修改,以此類推,也就是說如果要修改歷史記錄的話,要從那一個點開始往后所有記錄都要修改才能保證賬本的合法性,哈希函數就提高了賬本篡改的難度。
2.采用非對稱加密技術。
這是相對對稱加密而言的,對稱加密中加密和解密過程用的是同一把鑰匙,而非對稱加密是加密和解密過程用的是一對密鑰,這對密鑰分別稱為“公鑰”和“私鑰”,公鑰是可以公開的,私鑰是個人存儲、個人維護的。
公鑰加密的數據只能用配對的私鑰來解密,私鑰加密的數據同樣也只能用配對的公鑰來解密。用非對稱加密就可以產生數字簽名。
假設有一筆交易,我給你轉10元,這個消息或這筆交易有固定的數據格式,通過哈希函數算出這個交易的哈希值(即消息摘要),通過使用私鑰加密,得到一個數字簽名,然后可以把數字簽名以及這個消息同時發送給其他人。
其他人拿到這個消息和數字簽名后,首先可以把這個消息的消息摘要算出來,然后就可以用公鑰驗證這個簽名是否真的是由這個消息摘要算出來的,進而判斷這個消息是否由我簽署并且沒有被篡改。
這就是數字簽名的效果,它的作用:一是可以確認消息歸屬,即檢驗消息是否真的由私鑰擁有者發出的,只要拿對應的公鑰驗證去簽名,驗證通過就可以證明消息是由私鑰擁有者發出的;二是確保消息完整,如果消息被篡改,那么哈希值就發生了變化,用同樣的數字簽名就無法驗證通過。
非對稱加密和數據簽名解決了“比特村”的兩個問題:第一,交易可以鑒別真偽;第二,可以保證交易進行匿名化。
現在不需要實名認證每個人有多少錢,只需要用公鑰作為錢包的地址,要花公鑰錢包里的錢只需要用對應私鑰對一筆交易簽名,即可證明你是錢包的所有者,這筆交易別人無法篡改和偽造。
而且公私鑰可以在線下自己生成,并不需要在賬本里進行實名注冊,如果沒有賬本外的額外信息,任何人都不知道某個公鑰錢包到底屬于誰的,這就達到了交易匿名的目的。
數據層
剛才說到區塊的概念,可以理解為賬本中的一頁記賬紙,里面記錄了若干筆交易,除此以外,區塊里需要包含哪些信息?
首先有一個區塊高度,可以理解為賬本的頁碼;包含上一個區塊摘要信息,這個是為了保證整個區塊鏈鏈式賬本不可篡改性;包含本區塊里所有數據交易哈希摘要值。
網絡層
網絡層是用P2P網絡來進行消息的傳播,P2P網絡是對等式網絡,也可以稱為是無中心的自組織網絡,特點是沒有中心化的服務器,任何節點在這個網絡中既是服務器,也是客戶端。
消息的發送、網絡的組織都是自發的,整個網絡可以無限擴展,任何節點可以隨時加入、隨時退出。網絡層規定了區塊鏈系統中交易是怎么傳輸的,以及每一頁賬本(即區塊)是怎么傳輸的。
共識層
就是要讓全網所有記賬員賬本保持一致,也就是說對所有交易有一個先后順序,達成完全一致。具體而言,共識機制主要需要解決以下三個問題:
1、What,下一個區塊包含哪些交易;2、Who,下一個區塊由誰產生;3、When,下一個區塊在什么時候產生;區塊鏈共識算法用的最多的是PoW,字面意思是工作量證明,即證明你做了一定量的工作。
工作量證明官方定義是要求用戶進行一些比較耗時的復雜運算,然后得出這個答案能夠被其他人快速驗證,用工作期間耗用的時間、設備、能源作為擔保成本,來確保資源是被真正需求方所使用。
PoW最早是在反垃圾郵件中使用,在發送一個郵件之前,需要在本地進行平均幾秒的PoW計算,目的是為了增加黑客群發一些垃圾郵件的成本,對于正常用戶來說發送一封郵件是低頻操作,每次等待幾秒完全可以接受;但對于制造垃圾郵件的人,就大幅增加了成本。
PoW一般用哈希函數實現,哈希函數特點是結果確定,但不可逆,知道一個哈希值或哈希值特征,很難推算出輸入,如何使用哈希函數實現PoW呢?假設現在有一條消息,哈希值是確定的,如果規定允許在這個消息后面加上一個隨機數(我們稱為nonce值),然后再計算哈希,那么這個哈希就可以隨著nonce值的改變而改變,我們不斷地嘗試不同的nonce值,就可以得到不同的哈希值。
當得到哈希值符合某一個特征,比如前三位為0或者小于某個特定的數,那么就接受該nonce值作為一個符合要求的答案。這個過程中需要計算方嘗試很多次才能得到符合條件的答案,條件越苛刻,需要計算的次數就越多,而這個答案在驗算方這邊只需要進行一步哈希計算,就可以知道這個nonce值是否是符合條件的答案。PoW通過使用哈希函數保證了難計算、易驗證的特點。
PoW運用在比特幣這邊,區塊頭部有一個nonce值,每一個礦工需要不斷調整區塊的Nonce值,使得整個區塊的哈希值小于某一個目標哈希(這個目標哈希值由難度值確定,難度值越高,目標哈希值越小),這樣一個區塊才是合法的區塊,誰先算出這個合法的區塊,廣播到網絡中,這個合法的區塊就會被其他人接受。POW的優點是工程上非常簡單可靠,容易實現,容錯率可以達到50%,控制全網算力沒有達到50%,基本上不可能篡改歷史記錄,這在中本聰一篇論文里有嚴格的數據論證,是比較公平的機制,投入越多算力,獲得記賬權概率越大,越有可能產生新的區塊。
缺點則是效率低,對于算力和能源浪費非常嚴重,有人統計過現在整個區塊鏈網絡電力消耗超過一個小型國家全國的電力消耗。
同時POW會有分叉,可能有若干個礦工,同時算出下一個區塊,因為算哈希值是隨機的,可能有人在相近時間內算出來了,因為網絡有延遲,不同礦工接受不同的區塊,然后就產生了分叉,分叉可能需要等待多個區塊來確認,這個交易的確認時間也是不確定的。
目前階段算力越來越集中,因為一個獨立的礦工想要挖下一個區塊的話,以你的算力可能在全網比例非常低,挖到下一個區塊的概率非常低,以至于一輩子可能都挖不上一個區塊。
這時候最好的選擇就是加入某一個礦池,貢獻你的算力,按照算力份額分成,比如整個礦池挖出下一個區塊,把下一個區塊獎勵平均分給整個礦池里面算力的,這樣加入礦池就可以獲得比較穩定的獎勵,也導致算力越來越集中在礦池手里。
共識層除了POW,還有其他算法,比如POS權益證明,就是占有的比例越多,獲得下一個區塊發布權的概率越大。POW簡單理解就是按勞分配,多勞多得,POS就是按錢分配,持有越多,獲得的收益也就越大。
早期的POS也是跟POW一樣,結合POW,通過計算當前持有的權益所占比例來決定這個節點的難度,可能持有越多,需要計算的難度值越低,就越有可能算出下一個區塊,這是早期的POS。
之后有人提出純POS想法,完全由節點權益決定區塊形成,這時候不需要計算POW進行挖礦,但是現在工業界沒有一個公認安全可靠的純POS項目,但在學術界有一些論文,也提出一些解決方案,對安全性有比較嚴格的數據論證,但他們的工程化難度非常高。
POS的優點是資源消耗少;共識效率高;權益平等。缺點是實現復雜,安全性有待驗證,容易導致馬太效應,富者越富,權益會越來越集中,跟POW有差不多的特點。
前面講了加密層、數據層、網絡層、共識層,基本上一筆交易的流程就可以確定下來了:
新交易創建之后,通過P2P網絡廣播到全網所有的礦工,礦工把這個交易驗證通過之后,打包進一個區塊中,接著開始計算PoW,當得到某個nonce值使得這個區塊的哈希值符合條件之后,再通過P2P網絡把這個區塊廣播給所有的礦工,其他礦工驗證這個區塊合法之后,就會將這個區塊添加到自己的賬本中,這樣一個交易就在全網范圍內完成了寫入。
激勵層
這樣一個分布式賬本系統,需要所有礦工消耗CPU、存儲、帶寬等資源誠實地記賬,如果完全沒有激勵的話,這些礦工可能就沒有動力去維護這個系統了。
比特幣的激勵機制是如果一個礦工計算出了一個新的區塊,這個區塊會產生一些新的比特幣,連同區塊里所有交易的手續費都可以歸這個礦工所有,這些比特幣是對一個誠實礦工的獎勵。
如果一個礦工試圖修改歷史記錄或者將不合法的交易打包到新的區塊,那么這個礦工將白白浪費算力,而不能使其他礦工同步自己的賬本,這部分浪費的算力可以理解為是對不誠實礦工的懲罰。
激勵機制在公有鏈中是必需的。在聯盟鏈中,所有節點都是已經經過組織認證的節點,不需要額外的激勵,這些節點也會自發地維護整個系統的安全和穩定。
但在公有鏈中,節點不需要進行認證,可以隨時加入、隨時退出這個網絡,記賬需要消耗CPU、存儲、帶寬等資源,所以需要有一定的激勵機制來確保礦工在記賬的過程中能有收益,以此來保證整個區塊鏈系統朝著良性循環的方向發展。
合約層
合約層是區塊鏈可編程特性的基礎,區塊鏈可以理解為是去中心化不可篡改的賬本,程序代碼也是數據,也可以存到賬本里。智能合約是存儲在區塊鏈中的一段不可篡改的程序,可以自動化的執行一些預先定義好的規則和條款,響應接收到的信息。合約發布之后,其運行和維護就交給全網的礦工去達成共識,合約的開發者定義了合約運行的規則,這個規則發布之后就是公開透明且不可篡改的。
應用層
運行在合約層之上,通過使用合約層的腳本和代碼構建去中心化的應用。現在比較火的應用有眾籌類的WeiFund,游戲類的加密貓,博彩類的Fomo3D等。
總結
加密層,區塊鏈技術的基石,提供了整個區塊鏈系統的安全性、匿名性保證。
數據層,采用偏序的數據結構,又采用了消息摘要的形式,使得歷史數據難以篡改,數據的完整性得以保證。
網絡層規定了整個網絡節點里的通信機制,可以實現沒有中心服務器的數據共享。
共識層,通過POW、POS等共識算法來保證全網數據的一致性,是區塊鏈技術里的關鍵。
激勵層,是通過經濟激勵機制,使得整個區塊鏈系統可以朝著良性循環方向發展。
合約層,提供區塊鏈系統的可編程性。應用層,可以開發分布式應用,來豐富整個區塊鏈的生態。
區塊鏈整個發展歷程可以分為區塊鏈1.0,即比特幣,是可信的分布式賬本,更多是在數字加密貨幣領域的應用;
區塊鏈2.0,即以太坊為代表,在可信的分布式賬本基礎上,加上了圖靈完備的智能合約,基本所有程序邏輯都可以用智能合約的形式寫出來,區塊鏈2.0擴大了區塊鏈應用場景;
區塊鏈3.0,目前還沒有公認的區塊鏈3.0項目,未來可能在可擴展性或者區塊鏈應用上有更大的突破。
區塊鏈的技術特點是它沒有特定主體,它是由P2P網絡連接起來的一個去中心化的全球系統,這確實會給監管帶來很多挑戰。目前的區塊鏈行業亂象叢生,需要有監管介入,方能促使區塊鏈行業健康發展,但同時也應避免過嚴的監管阻礙區塊鏈行業的發展。