第9講 | 深入區塊鏈技術(一):技術基礎


  在“淺說區塊鏈基礎”的部分中,我概括介紹了區塊鏈的入門知識以及區塊鏈的應用領域,在“深入區塊鏈技術”部分的第一篇中,我將帶你一起總覽下區塊鏈的技術概要,本篇提到的所有技術內容,我們都會在后續文章中進行詳細的講解。

區塊鏈的技術定義

  簡單來說,區塊鏈是一個提供了拜占庭容錯、並保證了最終一致性的分布式數據庫;從數據結構上看,它是基於時間序列的鏈式數據塊結構;從節點拓撲上看,它所有的節點互為冗余備份;從操作上看,它提供了基於密碼學的公私鑰管理體系來管理賬戶。

  或許以上概念過於抽象,我來舉個例子,你就好理解了。

  你可以想象有100台計算機分布在世界各地,這100台機器之間的網絡是廣域網,並且,這100台機器的擁有者相不信任,那么,我們采用什么樣的算法(共識機制)才能夠為它提供一個可信任的環境,並且使得:

  • 節點之間的數據交換過程不可篡改,並且已生成的歷史記錄不可被篡改;
  • 每個節點的數據會同步到最新數據,並且會驗證最新數據的有效性;
  • 基於少數服從多數的原則,整體節點維護的數據本身可以客觀反映交換歷史。

  通常我們在分布式系統領域也見到過上述的要求,比如第2條就闡述了分布式系統基本要求:一致性要求;基於少數服從多數原則是為了容忍網絡分區;區塊鏈就是解決上述問題的技術方案。

  我們結合以往講過的內容,和將要講的內容,先提煉一下區塊鏈在技術上的7個特征,你先記住,我們后續會慢慢道來:

  • 區塊鏈的存儲基於分布式數據庫;
  • 數據庫是區塊鏈的數據載體,區塊鏈是交易的業務邏輯載體;
  • 區塊鏈按時間序列化區塊數據,整個網絡有一個最終確定狀態;
  • 區塊鏈只對添加有效,對其他操作無效;
  • 交易基於非對稱加密的公私鑰驗證;
  • 區塊鏈網絡要求拜占庭將軍容錯;
  • 共識算法能夠“解決”雙花問題。

區塊鏈的類型

  我們在討論區塊鏈時,通常指的是公有區塊鏈。除此之外,還存在另外一種區塊鏈:聯盟鏈。

  我們在前面的文章介紹過它。所謂聯盟鏈,就是這個區塊鏈具有准入許可,不像公鏈,任何人都可以隨時進入。准入許可也就意味着候選節點進入區塊鏈時需要得到已經在網絡中的節點許可,所以聯盟鏈也叫做許可鏈。

  早期文章里可能還會涉及私有區塊鏈的定義,其實我認為私有區塊鏈更像是一個捏造的概念,如果是完全私有的分布式數據庫,技術人員往往會有更好的選擇。

  如今雲計算日趨成熟,大規模的分布式存儲已經不是難題,不必在區塊鏈這種低並發、低吞吐量的系統中折磨自己。

  所以我們所說的區塊鏈通常指的是公鏈。除了公鏈和聯盟鏈的概念,還有一種區塊鏈概念,叫作側鏈。

  側鏈是一種雙向掛鈎技術,將主鏈中的代幣鎖定到側鏈中使用。所以可以將主鏈看作主干道,側鏈看作與主鏈相對獨立的一條分支道,作為主鏈功能的低耦合拓展。

區塊鏈的核心技術組成

  無論是公鏈還是聯盟鏈,至少需要四個模塊組成:P2P網絡協議、分布式一致性算法(共識機制)、加密簽名算法、賬戶與存儲模型。

1. P2P網絡協議

  P2P網絡協議是所有區塊鏈的最底層模塊,負責交易數據的網絡傳輸和廣播、節點發現和維護。

  通常我們所用的都是比特幣P2P網絡協議模塊,它遵循一定的交互原則。比如:初次連接到其他節點會被要求按照握手協議來確認狀態,在握手之后開始請求Peer節點的地址數據以及區塊數據。

  這套P2P交互協議也具有自己的指令集合,指令體現在在消息頭(Message Header)的命令(command)域中,這些命令為上層提供了節點發現、節點獲取、區塊頭獲取、區塊獲取等功能。

  這些功能都是非常底層、非常基礎的功能。如果你想要深入了解,可以參考比特幣開發者指南中的Peer Discovery的章節。

2. 分布式一致性算法

  在經典分布式計算領域,我們有Raft和Paxos算法家族代表的非拜占庭容錯算法,以及具有拜占庭容錯特性的PBFT共識算法。

  如果從技術演化的角度來看,我們可以得出一個圖,其中,區塊鏈技術把原來的分布式算法進行了經濟學上的拓展。


(圖片來自網絡)

  在圖中我們可以看到,計算機應用在最開始多為單點應用,高可用方便采用的是冷災備,后來發展到異地多活,這些異地多活可能采用的是負載均衡和路由技術,隨着分布式系統技術的發展,我們過渡到了Paxos和Raft為主的分布式系統。

  而在區塊鏈領域,多采用PoW工作量證明算法、PoS權益證明算法,以及DPoS代理權益證明算法,以上三種是業界主流的共識算法,這些算法與經典分布式一致性算法不同的是融入了經濟學博弈的概念,下面我分別簡單介紹這三種共識算法。

  1. PoW:通常是指在給定的約束下,求解一個特定難度的數學問題,誰解的速度快,誰就能獲得記賬權(出塊)權利。這個求解過程往往會轉換成計算問題,所以在比拼速度的情況下,也就變成了誰的計算方法更優,以及誰的設備性能更好。比特幣本身的演化很好地詮釋了這個問題,中本聰設計的思路本來是由CPU計算。隨着市場發展,人們發現GPU也可以參與其中,而且效率可以達到十倍百倍,現在,這項工作基本以ASIC專業挖礦芯片為主。
  2. PoS:這是一種股權證明機制,它的基本概念是產生區塊的難度應該與你在網絡里所占的股權(所有權占比)成比例,目前有三個版本PoS1.0、PoS2.0、PoS3.0。它實現的核心思路是:使用你所鎖定代幣的幣齡(CoinAge)以及一個小的工作量證明,去計算一個目標值,當滿足目標值時,你將可能獲取記賬權。
  3. DPoS:簡單來理解就是將PoS共識算法中的記賬者轉換為指定節點數組成的小圈子,而不是所有人都可以參與記賬,這個圈子可能是21個節點,也有可能是101個節點。這一點取決於設計,只有這個圈子中的節點才能獲得記賬權。這將極大地提高系統的吞吐量,因為更少的節點也就意味着網絡和節點的可控。

3.加密簽名算法

  由於我不是密碼學專業出身,所以這里我將會以介紹為主。

  在區塊鏈領域,哈希算法是應用得最多的算法。哈希算法具有抗碰撞性、原像不可逆、難題友好性等特征。

  其中,難題友好性正是眾多PoW幣種賴以存在的基礎,在比特幣中,SHA256算法被用作工作量證明的計算方法,也就是我們所說的挖礦算法。

  而在萊特幣身上,我們也會看到Scrypt算法,該算法與SHA256不同的是,需要大內存支持。

  而在其他一些幣種身上,我們也能看到基於SHA3算法的挖礦算法。以太坊使用了Dagger-Hashimoto算法的改良版本,並命名為Ethash,這是一個IO難解性的算法。

  當然,除了挖礦算法,我們還會使用到RIPEMD160算法,主要用於生成地址,眾多的比特幣衍生代碼中,絕大部分都采用了比特幣的地址設計。

  除了地址,我們還會使用到最核心的,也是區塊鏈Token系統的基石:公私鑰密碼算法。

  在比特幣大類的代碼中,基本上使用的都是ECDSA。ECDSA是ECC與DSA的結合,整個簽名過程與DSA類似,所不一樣的是簽名中采取的算法為ECC(橢圓曲線函數)。

  從技術上看,我們先從生成私鑰開始,其次從私鑰生成公鑰,最后從公鑰生成地址,以上每一步都是不可逆過程,也就是說無法從地址推導出公鑰,從公鑰推導到私鑰。

(圖來自《精通比特幣》一書)

4. 賬戶與交易模型

  從一開始的定義我們知道,僅從技術角度可以認為區塊鏈是一種分布式數據庫,那么,多數區塊鏈到底使用了什么類型的數據庫呢?

  我在設計元界區塊鏈時,參考了多種數據庫,有NoSQL的BerkelyDB、LevelDB,也有一些幣種采用基於SQL的SQLite。

  這些作為底層的存儲設施,多以輕量級嵌入式數據庫為主,由於並不涉及區塊鏈的賬本特性,這些存儲技術與其他場合下的使用並沒有什么不同。

  區塊鏈的賬本特性,通常分為UTXO結構以及基於Account-Balance結構的賬本結構,我們也稱為賬本模型。UTXO是“unspent transaction input/output”的縮寫,翻譯過來就是指“未花費的交易輸入輸出”。

  這個區塊鏈中Token轉移的一種記賬模式,每次轉移均以輸入輸出的形式出現。而在Balance結構中,是沒有這個模式的。

總結

  今天我介紹了區塊鏈的技術概念、分類以及核心技術組成,相信你對區塊鏈技術有了一個初步的了解。

  區塊鏈雖然是一個新興的概念,但它依賴的技術一點也不新,如非對稱加密技術、P2P網絡協議等。好比樂高積木,積木塊是有限的,但是不同組合卻能產生非常革新的事物。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM