歡迎光臨
每天分享高質量文章

新一代開源分散式賬本專案R3 Corda 技術揭秘:基於JVM開發

語言

Corda使用Kotlin作為開發語言,合約可以使用Java、Kotlin或者其他基於JVM的語言來編寫。選擇Kotlin的原因是:

  • 相比其他目前區塊鏈流行的語言,比如C++或Golang,Java繫有最強大的生態支援,和成熟的基礎設施積累。

  • 因為是面向金融行業,應用技術棧也以Java為主(因為主導企業IBM、Oracle等為主),進而使得adoption cost盡可能小,開發更容易。

  • 對於金融行業這樣有著厚重歷史積累(技術包袱),以及各種異構系統,Java(JVM)平臺有更成熟和強大的整合能力(比如資料倉庫、離線計算等)。

除此之外,相比Java以及JVM平臺的其他語言(Clojure、Scala、Ceylon等),Kotlin又平衡了語言靈活性和健壯性(相比Java提供了更多語言層面的改進,比Clojure、Scala又具備更平滑的學習曲線,同時IntelliJ官方對Kotlin的支援更強大)。

共識


  • 共識粒度小

  • 共識範圍小

相比BTC或Ethereum這樣的Permissionless網路,Corda提供一個更可信任的Permissioned P2P網路,所有transaction參與這都是authenticated和authorized。

所以Corda的共識機制捨棄了BTC或Ethereum這樣的賬本範圍的全域性共識,只要求transaction的所有參與者對於transaction達成共識。

因為捨棄了對賬本的全網廣播,捨棄了所有節點都需要驗證所有的transaction,進而極大得提高了transaction的吞吐。

不像Ethereum的基於account的狀態機模型,Corda採用了和BTC類似的基於transaction的UTXO模型,邏輯上完全對應金融系統的複式記賬。

  • Notary

Corda中引入了Notary的概念,Notary負責確保UTXO模型中的“輸入”的有效性,比如防止“double-spent”攻擊。它是所有transaction驗證和確認(verify和validate)的基礎,本質上可以認為是Corda這個“半信任網路”中的“可信任中介”。邏輯上看是“中心化的角色”,但實際上Notary可以是一個網路,甚至可以是另一個基於某種共識的公鏈。

Command,合約和Flow


  • Command

因為面向金融行業,Corda最重要的設計標的是支撐現實世界的各種金融活動(交易行為),所以Corda從transaction的設計,到智慧合約以及Flow的能力,都是為了描述自然世界的交易行為/動作,比如轉賬、存入/提現、開票/兌付等。

所以Corda在transaction中設計了command這個概念,command由transaction參與方來約定(含義),同時透過強制包含所有參與方的公鑰來做驗證(驗證簽名)。

為了對映自然世界中各種複雜的多方交易,Corda中引入了“複合公鑰”(composite-keys)。其中的公鑰以樹結構組織:所有的葉子節點就是各個參與方的key,上層節點則約定閾值。

比如下麵這個例子中,三人的公鑰權重預設都是1,那麼整個command有效的條件是:“alice和bob都要簽名”或“只要charlie簽名”。

  • 金融合約

Corda中另一核心特點就是它的合約系統,相比跑在EVM上的Ethereum的智慧合約,Corda的合約本質上就是一個實現了Contract interface的Java class。這個介面只有一個用於驗證transaction的方法verify和一個annotation。

@CordaSerializable
@LegalProseReference(uri: String)
interface Contract {

@Throws(IllegalArgumentException::class)
fun verify(tx: LedgerTransaction)
}

其中@LegalProseReference這個annotation是最有價值的特性,它關聯了現實世界中真實的具有法律意義的合約!這樣Contract介面的設計就滿足了:

  1. 描述現實世界的合約。

  2. 對所有根據合約執行的transaction進行特定驗證。

  • Flow

Flow是Corda中另一個重要的特性,本質上來說Flow就是一系列複雜的Command指令的編排,用來描述自然世界裡涉及多方、多環節、有條件的複雜交易流程。因為Corda的共識是transaction級別參與方範圍的,同時transaction的通訊都是點對點的,所以flow的設計和實現非常直觀和簡單。

因為面向金融行業,Corda內建了大量開箱即用的Flow template(在net.corda.flows包),基本涵蓋了金融領域主要交易流程。同時Flow支援組合和繼承,方便自定義和編排。

Flow的底層實現是基於Quasar的,是JVM平臺上實現了actor模型的纖程/輕執行緒庫(Akka也是,但主要面向Scala)。透過Quasar的bytecode註入,可以實現flow的掛起、恢復等排程,這能進一步提高Corda系統的伸縮能力和併發能力。

資料儲存


  • JPA

  • RDB

Corda的資料儲存支援標準JPA規範,可以透過多種ORM庫將資料持久化到關係型資料庫。目前Corda實現裡是內建了一個H2資料庫。由於標準的JPA規範,這使得Corda節點可以非常容易得整合/復用金融行業使用廣泛(幾乎是唯一)的企業級RDB系統,比如DB2或OracleDB。

資料層面這種開放架構,使得企業客戶完全能夠將Corda的資料和自身業務資料無縫整合。比如透過SQL Join來統一查詢,或輸入到Hadoop進行離線計算等。

網路通訊


  • AMQP over TLS

Corda藉助ActiveMQ這個流行的訊息中介軟體中的Artemis專案,以AMQP作為其網路通訊協議,包括訊息結構、序列化格式、加密方式等。

Artemis本身是個高效能、非阻塞的(基於Netty)支援多種協議的(AMQP、MQTT等)輕量級訊息中介軟體。

  • NetworkMapCache

P2P網路部分,Corda透過NetworkMapCache使得每個節點都快取一份網路拓撲,網路的變化會通知到所有節點。節點本身具備動態發現、註冊和認證的能力。

目前的實現中,是簡單得透過seed nodes的方式來初始化整個網路,程式碼註釋裡提到未來會整合Paxos或Raft來選舉初始網路。

CorDapp


  • Plugin機制

  • REST

  • Fatjar

類似Hyperledger Fabric,Corda也採用了plugin機制來支援CorDapp。每個CorDapp需要擴充套件CordaPluginRegistry這個介面來註冊自己,並透過REST API來向外提供服務。

CorDapp中的邏輯是透過宣告或使用flow來實現的,客觀上提高了安全性。CorDapp會打包成Fatjar的形式,上傳並部署到Corda節點的JVM中。

系統整合及其他


利用Corda支援的JPA/JDBC,AMQP,REST等等這些資料層面、通訊協議以及CorDapp介面,提供了非常開放易於整合的能力。

Corda節點內建一個web app,用來管理節點狀態、網路狀況和Dapp,比如交易記錄等。

架構設計

下圖是Corda的邏輯架構

2017年低,Corda和微軟Azure達成合作,將Corda平臺搬到Azure雲上,推廣更易使用的“分散式賬本技術即服務”。

總結


本質上,Corda並不是去建立新的區塊鏈(公鏈),而是致力於提供專門服務於泛金融行業“去中心化的ledger(資料庫)”。相比其他區塊鏈系統,由於針對金融行業的定位,做了一些方面的取捨和改進:

  • (在Permissioned網路環境下)降低了共識的範圍和級別

  • 縮小了資料可見性

  • (所以間接)具備較高的吞吐

  • (強化了特定合約描述能力)提供了與自然世界法律/金融的對映

加上JVM強大生態、完善成熟的基礎設施、大量開箱即用的工具,以及內建對金融行業領域的支援。

相關閱讀:


只用200行Go程式碼寫一個自己的區塊鏈!

200行Go程式碼實現自己的區塊鏈——區塊生成與網路通訊

200行Go程式碼實現區塊鏈 —— 挖礦演演算法

區塊鏈及比特幣入門指南


特別推薦:


比特幣、以太坊、ERC20、PoW、PoS、智慧合約、閃電網路……

想深入瞭解及討論這些話題?高可用架構在知識星球(小密圈)建立了區塊鏈學習小組,共同學習區塊鏈包括數字貨幣前沿技術,歡迎點選連結加入。


區塊鏈學習小組


轉載本文請註明出處,技術原創及架構實踐文章,歡迎透過公眾號選單「聯絡我們」進行投稿。


高可用架構

改變網際網路的構建方式

長按二維碼 關註「高可用架構」公眾號

贊(0)

分享創造快樂