一、嘮叨兩句
最近一直在考慮一個事情,就是怎么給不太了解技術的人講清楚區塊鏈。我先試着寫下來,然后在逐步打磨吧,目標就是讓哪些說看區塊鏈看的雲里霧里的同學能對區塊鏈有一些認知。
二、定義
簡單的給區塊鏈下個定義:基於加密算法的,去中心化的分布式賬本技術。這里有三個關鍵詞:加密算法、去中心化、分布式賬本,下面我就嘗試從三個關鍵詞為線索,介紹一下區塊鏈的概念。
三、分布式賬本
比特幣是一個點對點的電子現金系統,既然是現金系統,那么就得記賬唄,這大概就是這個賬本的由來,就是流水賬嘛,張三給了李四一百塊錢,王五給了張三五十塊錢,blabla。這種東西,就是一條一條的數據,記錄在文件里,數據庫里等等。區塊鏈的賬本存儲,當然就是區塊和鏈了。分布式賬本,就是在說不僅存一份數據,每個全節點都存一份數據,只要不是全部節點掛掉,總有節點可提供數據的。
1. 區塊:塊由區塊頭和區塊體組成,區塊頭包含一些前一個區塊的Hash啊,當前區塊中所有交易的默克爾樹根啊,時間戳啊,隨機數啊,等等。區塊體里就是一筆筆的交易。
簡單說下默克爾樹,比如當前區塊有4比交易A,B,C,D,AB取hash,CD取hash,兩個Hash結果再取hash,就形成了默克爾樹,樹根可以理解為一個checksum,任何一個交易改一點,整棵默克爾樹就都變化了,可以保證沒有篡改,這個樹還可以支持輕錢包SPV驗證。
2. 交易:每一筆交易主要包含了一個或多個Input和Output,Input記錄的是引用到的前一筆未花費交易的索引,Output記錄的是將資產轉移到那個地址。這里講腳本的時候,還要講。
3. 鏈:剛才講了區塊頭包含了前一個區塊的Hash,這東西就是為了把區塊連接起來,成為一個鏈,鏈上的交易順序不能認為嚴格的前后關系,但是基本可以認為是有一個追溯的結構。作為程序猿,你會想需要遍歷鏈,怎么整,拿到創世塊,它沒有前一個區塊Hash,取到它的默克爾樹根作為key去存儲里面找下一個區塊,如此往復。
四、去中心化
我想把這部分通過和一般NoSql數據庫的一些方式做對比,NoSql數據庫為了達到讀的並發性能和數據的安全,通常都會保存多個副本,ReplicaSet的概念。同時對於寫的數據,總要先找個主節點寫,寫完了再同步給副本集,選主的時候,數據一致的時候,都需要幾個節點達成共識,通常會有Paxos,Raft這樣的算法來保證。把這部分放大到公網上,就基本可以映射到區塊鏈上了,區塊鏈的各個全節點都保持一個完整賬本,全網的ReplicaSet;獲得記賬權要記賬寫塊了,誰來寫,區塊鏈上通過PoW,PoS,DPos等等共識算法來達成共識,又和Paxos,Raft對應上了。
說到共識了,我們想一下記賬權這個事,就是挖礦,首先是個經濟問題,我干嘛要挖啊,你得給我獎勵,比特幣系統中獲得了記賬權生成了區塊,就能獲得比特幣的獎勵,比特幣價格高,當然可以激勵記賬這個事了,那么問題來了,這個經濟問題變成了一個博弈問題了,這么賺錢,憑啥你挖啊。這時候就得有個算法來規定好游戲玩法,比特幣怎么個玩法PoW,就是來個數學謎題,誰算出來誰記賬。這個數學謎題可以簡單這么理解,就是你生成的塊,加上一個隨機數位可以調節,然后基於一種Hash算法,你生成出來的結果必須小於某某數,這個某某數就是難度,可以動態調節的,現在比特幣的這個難度很高,所以你也就別跟礦主彪啦。那為什么叫PoW了,就是工作量證明,因為這個Hash之間沒有關聯型,我上次隨機數計算的結果和我這次隨機數計算的結果之間沒有半分錢關聯,這也就是為啥算力規模越來越大了,可以並行計算,算力越大,概率越大。你要非較真說,其實理論上,你可能很少計算就剛好碰到了正確結果,沒錯,這事就可以類比高考了,你說有沒有神蒙,蒙得高分,有,但是大體上這個考分大概其能證明你努力過吧。
五、加密算法
非對稱加密大伙都明白,不多講了,利用非對稱加密的簽名驗簽可以實現區塊鏈最關鍵的特點,確權。只有我用我的私鑰簽名過的數據,你用我的公鑰才能驗證通過,其他誰想仿造都不行,所以這錢就只能是我來花了。說到確權,這事可大了,區塊鏈為啥火,就是因為確權,數字資產能確權了,這意味着什么?意味着互聯網變成了價值互聯網了,價值可以傳遞了。
那這簽名驗簽的用哪兒了,也沒見哪兒使啊,別急,剛才咱介紹交易的時候不是留了一個箭頭么,這交易上記的不僅僅是轉移到對方的地址,而是一個腳本。如果就一地址擱那,都說是自己的,那不亂套了,這錢誰能用,得確權,這就需要腳本系統了。
首先說說比特幣的地址啊,地址咋生成,下圖講的特清楚,我從網上拷的。你說好好一圖,我隨便用,不能賣錢,為啥,不就是因為沒法確權嘛。
然后我們簡單說說這個比特幣的腳本系統,它是基於棧的腳本系統。這里我暫時不展開,僅已最常用的比特幣鎖定腳本P2PKH腳本作為例子講講。
鎖定腳本
DUP HASH160 [Public Key Hash] EqualVerify CheckSig
花錢的時候你得通過鎖定腳本的驗證,這個就是一個確權的過程,你要想驗證通過你得提供解鎖腳本
[Sig] [Public Key]
簡單說下驗證過程吧,下面這堆腳本基於棧執行
[Sig] [Public Key] DUP HASH160 [Public Key Hash] EqualVerify CheckSig
1. [Sig]入棧
2. [Public Key]入棧
3. DUP復制棧頂[Public Key]再入棧
4. 拿出棧頂[Public Key]執行HASH160(這個正是Public Key Hash的算法),入棧
5. 鎖定腳本里的常量[Public Key Hash]入棧
6. 取出棧頂里腳本里的[Public Key Hash]和計算出來的比較,相等就繼續
7. 這下棧里從底到頂分別是[Sig][Public Key],CheckSig拿出棧里這倆驗簽,通過錢就是你的,請用。
比特幣的腳本指令很多,你可以自己寫腳本出來,就是有點麻煩,寫匯編似的,但是這東西也是個好東西,直接就引出了后面的智能合約來了,
六、小結
今天主要從加密算法,去中心化和分布式賬本三個方面簡單介紹了一下區塊鏈,感覺沒達到我的預期讓沒接觸過的突然開竅的感覺,后面打磨打磨吧的再。本文里主要以比特幣作為實例進行介紹的,我覺得比特幣最牛逼的地方就是確權和智能合約,打開了無限遐想。公鏈上開發,很多選擇,我其實不太喜歡比特幣,開發起來太麻煩,而且就現在這個幣值,搞些大宗交易,跨境大額轉賬啥的還成,其他的,呵呵吧,但是幣王還是幣王,這里面的原理還是值得細細琢磨的。