當前位置:
首頁 > 最新 > 新一代開源分散式賬本項目R3 Corda 技術揭秘:基於JVM開發

新一代開源分散式賬本項目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

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

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

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

比如下面這個例子中,三人的公鑰權重默認都是1,那麼整個command有效的條件是:「alice和bob都要簽名」或「只要charlie簽名」。

金融合約

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

@CordaSerializable

@LegalProseReference(uri: String)

interface Contract {

@Throws(IllegalArgumentException::class)

fun verify(tx: LedgerTransaction)

}

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

描述現實世界的合約。

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

Flow

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

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

Flow的底層實現是基於的,是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來選舉初始網路。


Plugin機制

REST

Fatjar

類似Hyperledger Fabric,Corda也採用了plugin機制來支持CorDapp。每個CorDapp需要擴展這個介面來註冊自己,並通過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強大生態、完善成熟的基礎設施、大量開箱即用的工具,以及內置對金融行業領域的支持。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 高可用架構 的精彩文章:

GopherChina 2018 區塊鏈+容器+Go底層實現
美拍直播首屏耗時減少50%以上的優化實踐

TAG:高可用架構 |