1. 程式人生 > >區塊鏈基本知識梳理

區塊鏈基本知識梳理

公鑰、私鑰、與地址

  • 私鑰是一切的根本,由它可以匯出公鑰、地址,而無法通過公鑰推出私鑰
  • 公鑰加密私鑰解密,私鑰簽名公鑰驗證
  • 以太坊使用的橢圓曲線演算法可以從簽名的資料中推算出該資料傳送方的地址
  • 公鑰經過一系列操作之後可以推出地址,以太坊是將公鑰做Keccak-256雜湊,然後取最後的40位16進位制字元
  • 私鑰一定要妥善備份,常用備份方式有:
  • 助記詞,一般由12個單片語成,得到它就等於得到了私鑰
  • keystore檔案,一個json檔案,本質上是把私鑰加密之後的資料檔案,解密需要輸入加密時的密碼

錢包、熱錢包、冷錢包

  • 錢包的本質:生成金鑰、管理金鑰、使用金鑰的工具。
  • 錢寶負責生成一個隨機的私鑰,根據此私鑰生成公鑰,再根據公鑰得到地址
  • 冷熱錢包的本質區別在於儲存私鑰的方式
  • 冷錢包:網路無法訪問到私鑰
  • 熱錢包:網路可以訪問到私鑰
  • 冷錢包安全性好但是不適合頻繁交易,熱錢包反之。

硬分叉、軟分叉

  • 本質區別:區塊鏈網路上舊的節點是否認可新節點產生的區塊。(一般新節點會在共識規則上做出一些改變)
  • 若不認可,則新節點挖出的區塊會被舊節點否決(達不成共識),於是新節點和舊節點會開始在不同的鏈上執行(挖礦、交易、驗證等)
  • 舊礦工的去留將決定舊分叉的生死
  • 硬分叉影響較大,除非得到整個鏈生態的同意,否則貿然硬分叉極易造成該鏈的分裂。同時,硬分叉又具有相當大的”醫療作用“,尤其當發現重大bug、重大缺陷的時候(此時較容易得到整個鏈生態的同意)
  • 軟分叉不會產生兩條鏈,新節點產生的區塊可以被舊節點承認(達成共識),但是舊節點卻無法識別新塊中屬於新規則的那部分資料真實意義。
  • 軟分叉不能增加資料欄位,只能在現有結構上修改,升級空間有限,而且會讓程式碼變複雜。
  • 硬分叉通常是擴充套件共識規則,而軟分叉是收緊共識規則,所以一旦進行了軟分叉,想要回退就非常困難了,很可能造成硬分叉而導致資金損失

UTXO

  • 熟悉比特幣的人應該都知道,為了儘可能少的洩露公鑰,每次交易時比特幣社群建議將餘額轉向一個新的地址。
    (從公鑰反推私鑰雖然是極為困難的,但是不一定抵抗量子計算機,比特幣地址的雙重hash以及交易時將餘額轉向一個新的地址都是為了保護公鑰,儘可能少的暴漏)
    那麼問題來了,每次都將餘額轉到了一個新的地址,那我的賬戶下的餘額豈不是無端沒了?
    當然不會沒了,事實上比特幣世界中並沒有賬戶的概念,也沒有餘額的概念,有的只是UTXO(Unspend Transaction Output)未花費的交易輸出。“賬戶的餘額”便是與該賬戶相關的UTXO的和。
    簡單來說,比特幣只記轉賬過程,不記餘額。一筆轉賬由兩大部分組成:輸入部分、輸出部分。輸入部分便由一個個UTXO組成,例如,A打算轉5個BTC給B,錢包知道A的所有UTXO,於是錢包挑出了A的A1,A2,A3三個UTXO,每個2 BTC,將這三個UTXO作為本次轉賬的輸入,本次的輸出有兩部分:一部分將5 BTC轉給 B,另一部分將剩餘的1BTC轉到一個新的地址(此處假設沒有礦工費),這個新的地址是由錢包管理的。於是,這個擁有一個BTC的UTXO又可以作為下一次交易的輸入。
    最關鍵的問題是:每一次都將未花費的餘額存入新地址,新地址意味著對應一個新的私鑰,這麼多私鑰,我都得一一備份麼?當然不用——HD錢包(Hierarchical Deterministic 分層確定性)只是用一個“根私鑰”也就是種子(seed),生成任意多的子私鑰。我們備份錢包,只需備份“根私鑰”的助記詞即可。比如我們可以用這樣一套演算法生成子私鑰:SHA256(seed + n)。只要seed確定了,後面的所有子私鑰也都確定了。

雙花問題的解決

  • 每發起一個交易,都要檢查該交易的各個輸入是否是“未花費的”。
  • 交易接受者要等待6個確認塊之後再確定本次交易成功了。(以太坊是12)

拜占庭問題的解決

隔離見證

叔塊獎勵

叔塊獎勵是以太坊中的機制。比特幣中的叔塊並沒有任何獎勵,以太坊為何要給挖出叔塊的礦工獎勵呢?
源於GOHST協議。

  • 叔塊是什麼。在比特幣中,最長鏈就是權威。假若兩個礦工幾乎同時挖出了同一個高度的兩個塊A1、A2,那麼哪個塊才是最終的塊呢?這取決於誰的後面有更長的鏈。所以兩個礦工會拼命的廣播自己的塊,以求讓別的礦工在自己的塊之上挖出更多的區塊,使自己的塊所在的鏈成為最長鏈、進而獲得獎勵。假設A1最終勝出,那A2就會成為孤塊,沒有任何獎勵。在以太坊中,使用的是“最重鏈”這一概念。由於以太坊14秒出一塊,塊間隔遠遠小於BTC的10min,這就大大增加了礦工們挖出同一高度的塊的概率。以太坊的GHOST協議認為,孤塊,以太坊中稱之為叔塊,作為一個合法的區塊,不是沒有意義的,它可以為主鏈的安全做出貢獻,因而也會獎勵挖出孤塊的曠工。
  • 為何要給挖出叔塊的人獎勵。與這個問題等效的問題是:叔塊如何為主鏈的安全做出貢獻? 叔塊成為主鏈的一部分,那麼叔塊裡的coinbase自然就是合法的交易,自然就會收到獎勵。
  • 叔塊如何為主鏈的安全做出貢獻? 以太坊的區塊可以包含 0~2 個叔塊,並將這(些)叔塊放到頭部的UncleHash欄位中。引用叔塊需要遵守以下規則:
  • 區塊最多引用2個叔塊,可以不引用
  • 所引用的叔塊必須是當前塊的前2~前7個節點的直接子塊
  • 被別的塊引用過的叔塊不能再次被引用
  • 獎勵計算公式。
  • 區塊(非叔塊)的獎勵公式(執筆時基本獎勵為2eth)= 2eth + 2eth*(引用的叔塊數/32)+ 礦工費
  • 叔塊獎勵公式:叔塊得到的獎勵取決於引用這個叔塊的區塊與該叔塊間隔的層數,層數範圍為1~6,我們姑且將間隔的層數稱為:層差,則計算叔塊獎勵公式可表示為:(8 - 層差)/ 8 * 2eth。
  • 由上述公式可見:引用叔塊能夠增加本區塊的獎勵;層差越小叔塊得到的獎勵越多。
  • 最重的鏈:與比特幣使用最長鏈做主鏈不同,以太坊使用最重鏈這一概念,所謂的最重鏈,就是在該鏈上所完成的計算量是最大的。包含叔塊能夠增加本鏈條的重量。這便是GHOST協議的主要內容:定義確定主鏈的演算法。換句話說,以太坊的GHOST協議就是一個“主鏈選擇協議”。因而,在以太坊中,最長的鏈不一定是主鏈!

重放攻擊

該現象出現在硬分叉當中。假設一個幣種N,有1000個幣,在2018.11.11分叉了,新鏈幣種叫NA,舊鏈幣種仍然是N。分叉後,你的NA錢包中餘額會顯示是1000,N錢包顯示的餘額也是1000。
當你在NA錢包發出一筆交易,想要發給B,10 NA幣。你簽署完該交易後廣播到NA網路,此時B動了歪腦筋,把你簽署的交易原封不動的轉發到了N網路,如果沒有重放吧保護,這次交易可能同時被兩個鏈承認——B同時收到了10 NA幣 + 10 N幣。

共識演算法

  • POW(Proof of Work,工作量證明) 比特幣、當下的以太坊都是用此類共識演算法,耗電量巨大。
  • 比特幣的POW是計算一個hash值,它的前N位為0,N反映了當前的難度。我們可以通過比特幣區塊瀏覽器直接“看出”這個明顯的挖礦成功的特徵。“挖礦”過程是這樣的:礦工不斷將新的nonce填到塊頭中,計算塊頭的hash值,直到計算出的hash值的前N個值為0,挖礦成功。在此過程中,礦工需要自己組裝塊頭,或者從礦池接受塊頭。
  • 以太坊的POW比比特幣要稍微多繞了一個彎,RAND(hashNoNonce, nonce) <= M/d; RAND是一個抽象函式代表一系列操作;hashNoNonce是組裝好的塊頭除去nonce欄位的hash值,nonce是每次迭代嘗試的隨機數;M是一個極大值;d是難度;簡單來說就是:使用hashNoNonce + nonce做輸入引數,通過RAND函式尋找一個hash值,該值的大小不大於 M/d; (當難度增加時,d變大,M/d變小,挖礦難度增加)。
  • 以太坊的挖礦過程只需要hashNoNonce而不需要整個塊頭,這在礦池-礦工模式中非常省心,礦池只需下發hashNoNonce以及對應的nonce範圍給礦工即可,無需像比特幣礦池一樣發整個塊頭給各個礦工。
  • 比特幣的POW演算法在最初設計時沒有預料到後來礦機的崛起,以太坊的Ethash演算法在設計之初就考慮了抵抗礦機這一特性。
  • POS (Proof of Stock,股權證明)類似於財產儲存在銀行,這種模式會根據你持有數字貨幣的量和時間,二者相乘便得到幣齡,幣齡越大,分配給你的利息就越多、記賬概率越大。當獲得激勵之後,幣齡清零,重新積累,如此周而復始。Peer Coin(點點幣,PPC)、新星幣(Nova Coin,NVC)、黑幣(Black Coin,BLK)、NextCoin(未來幣,NXT)等等,都是用的POS。
  • POA(Proofof Authority,授權證明) 由一組授權節點來負責新區塊的產生和區塊驗證。以太坊測試網(Kovan)便是採用POA共識。一般用來搭建聯盟鏈。
  • DPOS (Delegated Proof of Stake,委任權益證明) BTS/EOS正在使用的共識規則。它的原理是讓每一個持有BTS/EOS的人進行投票,由此產生101(BTS)/21(EOS)位代表 , 也就是101/21個超級節點,這些超級節點負責打包交易、出塊。超級節點要將出塊所獲得的獎勵的一部分,分給支援自己的股民。
  • PBFT(Practical Byzantine Fault Tolerance,實用拜占庭容錯演算法)
  • Paxos
  • Raft

關於共識演算法的詳細討論,詳見另一篇拙作。