有過工程經驗的同學會比較清楚,想要很好的掌握一個系統,直接上來擼源碼不是一個很好的選擇,也不太現實,比較巧妙的做法是先從總體上認識好這個系統的核心概念和關鍵模型,知道 A 是 A,B 是 B,那麼當 A 和 B 以某種方式發生某些關係的時候,你也不至於會特別懵逼。因此教程 2 和 3 主要集中在給大家闡述清楚 corda ledger 中的核心概念,必要的時候我會給結合相應的源代碼或者類比比特幣進行講解,以加深大家的感性認知。還是那句話,理解和落筆之處難免會有錯誤和偏差,歡迎大家給我留言,我會拉你進大羣,和各個行業專家和優秀的工程師一起成長!

一、網絡 network




網絡的概念比較簡單,你可以理解成一條鏈中所有運行節點的總和。在 corda ledger 中,它通常由所有運行着的 corda 節點,以及運行在 corda 節點內部的 dapp 組成。這裏要說明的是以下兩點:
  1. 比特幣網絡的進入和離開是自由的,而 corda 網絡的進入需要一定的權限,節點必須聯繫並將一些必要的信息提交給 doorman,從而獲得相應的證書。這是 corda 網絡和比特幣網絡第一個非常不同的地方,在 corda 網絡中,所有節點都被抽象成一個叫做 Party 的概念:

class Party(val name: CordaX500Name, owningKey: PublicKey) 這是 kotlin 的寫法,大家應該能猜的出來括號裏面是它的兩個屬性。言下之意,每一個節點都會有一個遵循 X.500 協議的名稱和一個公鑰,這些信息和一些其他的關鍵信息都來源於 doorman 給它頒發的證書。有中心化的 CA 節點,這是 corda ledger 不能稱之爲真正意義上區塊鏈系統的原因之一。

  1. 與比特幣網絡全網廣播截然不同的是,corda ledger 完全是點對點通訊,並且記賬的永遠只是交易的相關方。這句話怎麼理解,試想同一筆交易,比如 A 轉給了 B 一筆錢,如果發生在比特幣網絡上,每個節點都能理所應當在自己本節點的賬本中追溯到這筆交易,但是如果發生在 corda ledger,那麼只有 A 和 B 記下了這筆交易,其他節點是不會被通知記賬的。這裏給大家解釋一下,corda 之所以這樣設計的原因是因爲,它主要爲了利用區塊鏈技術解決金融行業的一些問題,而金融業的很多場景對數據的隱私性非常敏感,因此分類賬往往更加適合。

corda ledger 系列教程 2 核心概念(上)--與比特幣類比

二、賬本 ledger

賬本實際上就是我們這條鏈產生的數據,基本上可以把它抽象成一個數據庫,在 corda  ledger 中,我們可以狹義的理解爲賬本就是所有當前 state 的集合(state 的概念下文會詳細描述)。前面講到,由於 corda ledger 是交易的相關方記賬,因此它不會存在一個像比特幣賬本那樣的全局總賬數據庫,取而代之的是隱私性更加強健的分類賬。爲了化解大家心中對 ledger 的神祕,我可以提前劇透一下,每個 corda 節點都會維護一張叫做 node_transactions 的表,記錄節點所有的交易行爲:(你沒看錯,就是關係型數據庫,並且我在此處用的是 mysql :))

corda ledger 系列教程 2 核心概念(上)--與比特幣類比

以及一張 vault_states 的表,它記錄了與每一筆交易相關的 state 的一些核心信息:

corda ledger 系列教程 2 核心概念(上)--與比特幣類比

三、State

State 我沒有給它取中文名,因爲我也沒辦法用一個比較確切的中文取將它表達清楚,或許叫“事實”或者“狀態”?在講解 State 之前,大家可以思考一下比特幣這個系統中,幣的含義是什麼。白皮書給它的定義很奇妙:We define an electronic coin as a chain of digital signatures . 也就是說,像現實生活中的一個一個的幣是不存在的,比特幣實際上由一個一個交易串起來的鏈,一個賬戶有多少幣(也就是我們通常理解的賬戶餘額)是這些交易推導出來的。這就是比特幣遵循的 UTXO 模型: Unspent Transaction Output, 表示未花費的輸出。這個模型同樣被引入進 corda ledger 之中,只不過我們這裏的 state 可能是一筆債權,一份期貨合約或者其它可以交易的金融產品(當然我們也可以不拘於此,只要是信息,我們都可以用 corda ledger 記賬)。同樣的,當 A 將一筆債權轉讓給 B 這個交易發生時,必然會有一個 owner 是 A 的債權 state 被消費,生成一個新的 owner 是 B 的債權 state,同時這筆交易會在 A、B 兩個節點同時記賬。

四、交易 Transaction

理解了 ledger 和 state 的設計,交易的概念躍然紙上。它其實參與了 state 的演化:一筆交易可以在消費 0 個或者多個 state 的同時,生成 0 個或者多個 state。更加理論的說法是:交易描述的是更新賬本的一個提案(proposal, 這個詞在分佈式算法中很常見):

corda ledger 系列教程 2 核心概念(上)--與比特幣類比

強調一下,一個交易被提交需要滿足三個條件,第一是不能有“雙花問題”,第二需要被合約驗證,最後需要被相關的機構簽名:

corda ledger 系列教程 2 核心概念(上)--與比特幣類比

那麼什麼是“雙花問題”,corda ledger 是怎麼解決的,和比特幣的方案有何不同;智能合約又是什麼?請關注後續教程。

非常希望大家給我留言 :)