一個優秀的軟件系統通常遵循着 “高內聚、低耦合”的原則進行設計,corda ledger 也不例外,縱觀整個系統,其模塊化設計非常明顯且邊界清晰:相互依賴、配合緊密的功能代碼會被聚合在一起形成節點服務(node services);各個服務之間聯繫鬆散且接口簡單;所有服務相互配合從而形成宏觀上的節點(node)在整個網絡中發揮作用。

在 corda ledger 系統中,節點服務通常分成兩大類:

  1. 一類通過 ServiceHub 暴露給 dapp 使用:ServiceHub,顧名思義,我們可以把它理解成一個服務樞紐,多個服務通過它對外提供能力;dapp 是 decentralized application 的縮寫,意思是去中心化的應用,也就是運行在(類)區塊鏈系統上的應用,理所應當它們是需要依賴節點的服務能力而生存(後面我們講解 corda dapp 的時候會詳細介紹)

  2. 而另一類則完全是 corda ledger 框架內部所持有的服務,也就是一些功能的集合

所有公共服務的接口定義都在子工程 core 的 hide/main/kotlin/net/corda/core/node/services 目錄下:

corda ledger 系列教程 4 節點服務(上)

這裏着重留意 ServiceHub.kt 這個文件,它基本上定義了節點能爲 dapp 提供的服務能力,並且從設計上將各個服務集中了起來,是非常好的閱讀切入點。

另外,core 只是在接口層面上進行了宏觀定義,具體的接口實現則在子工程 node 的 hide/main/kotlin/net/corda/core/node/services 目錄下:

corda ledger 系列教程 4 節點服務(上)

在詳細講解 ServiceHub 這個接口之前,先給大家闡述一下有關 kotlin 接口方面的知識:kotlin 接口和 java8 的接口類似,使用關鍵字 interface 定義,允許方法有默認實現,接口與接口之間可以有繼承關係,當然接口也可以被一個類實現(Kotlin 用冒號取代 java 的關鍵字 extends 與 implements,非常簡潔)。

例如接口 ServiceHub 即繼承了接口 ServicesForResolution:

corda ledger 系列教程 4 節點服務(上)

所以首先我們來看一下 ServicesForResolution:

corda ledger 系列教程 4 節點服務(上)

這個接口一共定義了四個成員變量,分別對應着身份管理、附件存儲、corda app (即 dapp)管理、服務發現相關參數管理,下面一一說明:

  1. IdentityService: 負責 corda ledger 網絡中節點身份的管理。在 corda ledger 系列教程 2 核心概念(上)–與比特幣類比 一文中我們曾經提到過,corda ledger 網絡是有權限控制的,任何一個新的節點想要加入網絡必須向 doorman 表明身份並申請證書,證書規範遵循 X.509 協議(協議文件鏈接 https://tools.ietf.org/html/rfc5280,關於 PKI 體系後面我們會單獨出教程講解)。在這裏需要明確的是,某個節點的證書至少包含兩個關鍵的部分:公鑰和節點名稱(二者相互對應,並且在全網內唯一)。那麼 IdentityService 實際上就維護這樣一個文件目錄,將網絡中所有的節點信息蒐集起來(實際上是通過服務註冊和發現機制進行信息的填充和更新),並且開放相應的查詢功能。

  2. AttachmentStorage:負責 corda ledger 網絡中的附件存儲和查詢功能,一個比較典型的應用場景是:某家會計事務所將相關的審計文件打包上傳到網絡中,並在適當的時候可以通過文件的 hash 值將這個文件下載下來。

  3. CordappProvider:前面我們講到,dapp 是沒有啓動入口的,在 corda ledger 中,corda app 是一個沒有 main 函數的 jar 包,我們可以把它看作一個庫文件或者 corda node 的插件。那麼 CordappProvider 就定義了所有節點可以對 corda app 進行的操作:包括獲取 corda app 執行上下文以及相關的合約附件。

  4. NetworkParameter :最後一個成員變量其實和網絡的服務發現相關,熟悉微服務的同學應該對這個概念不會陌生。那麼具體到 corda ledger 網絡中,會有一個角色爲 network map server 的服務充當服務發現的服務端,類似於微服務領域的 eureka server ,其他知名服務節點或者業務節點在啓動的過程中會將自己的節點信息(例如組織名稱 Party Name,IP 和端口)上報給 network map server,同時以心跳的形式獲取其他節點信息填充上面說到的 IdentityService 服務。那麼這裏的 NetworkParameter 其實代表的是多個節點在一個特定網絡區域達成一致的一組值,比如平臺版本號、交易的最大值等。

我們在回到 ServiceHub,它在繼承 ServicesForResolution 的同時,額外定義了八個成員變量:

corda ledger 系列教程 4 節點服務(上)

分別對應着賬本管理、私鑰和簽名管理、合約升級、交易存儲、節點信息緩存等等,由於篇幅的關係,具體的功能將在下一篇教程中繼續闡述,大家期待!

另外有任何問題可以後臺提問或者在 corda ledger 技術交流羣提問,感謝大家 支持 :)