去桂林玩了一週,耽誤了一點進度,非常焦慮。回顧一下,前面三篇教程(可以在本公衆號查看歷史)主要是站在一個比較高的視角上闡述區塊鏈以及 corda ledger 的一些技術選型和核心概念,可以說是後續教程的理論基礎,希望大家多多複習。從這一節開始,我們有條理的進入 corda ledger 的代碼世界,目標是從入門到舉一反三 :)

前面提到過,corda ledger 是 R3 開源的一套分佈式賬本技術,目前是以完全開源的形式進行運作,毋庸置疑,核心代碼託管在 github 上:

https://github.com/corda/corda

corda ledger 系列教程 3 開發環境初始化和工程佈局

大家可以先 star 和 fork 起來,關於如何參與貢獻,後面我會專門出一篇教程給大家講解(大概會放在講解 git flow 的那一篇)。

接下來的步驟適合工程新手一步一步跟着操作,熟練工自覺略過:

1. 使用 git clone https://github.com/corda/corda.git 命令將工程克隆到本地:

corda ledger 系列教程 3 開發環境初始化和工程佈局

2. 將工程導入 idea:

由於 corda ledger 工程是用 gradle 構建而成,所以我們可以直接選中 build.gradle 點擊 open 即可:

corda ledger 系列教程 3 開發環境初始化和工程佈局

解釋一下,這裏的 build.gradle 可以粗暴的看成構建工具 gradle 理解整個工程的一個描述文件,很多工程實踐都會有類似的概念:比如 maven 的 pom 文件,stack 的 stack.yaml 文件(用於構建 haskell 項目),由於 corda ledger 使用編程語言 kotlin 編寫,並且最終會打包成 jar 包在 java 虛擬機上運行,所以官方使用了 gradle 作爲構建工具,相信熟悉 java 編程和微服務的同學不會陌生。

corda ledger 系列教程 3 開發環境初始化和工程佈局

我們推薦使用 JVM1.8;注意我們選擇了 use default gradle wrapper,意思是 ide 在初始化工程的時會首先根據配置下載指定版本的 gradle,再使用其去構建項目。接着我們點擊 OK 即可看到 IDE 會匆忙的幫助我們初始化工程:(這一塊新手可能會遇到這樣或者那樣的問題,不要慌,仔細看報錯,也歡迎在後臺或者 corda ledger 交流羣提問)

corda ledger 系列教程 3 開發環境初始化和工程佈局

第一次初始化工程,由於 gradle 和相關依賴的下載可能用時會比較長,請大家耐心等待 :)

如果前面的導入步驟還算順利,你會看到一個多模塊的,看上去比較龐大的工程項目,新手往往在這裏會手足無措,即便有一顆想讀源代碼的心也無從下手,沒關係,我們可以先不急着讀源代碼,而是想辦法理解清楚整個項目是怎麼組織的,每個子項目又是做什麼的。記住一句話,工程上的東西一定是有規律可循的,不要被外在的龐大嚇倒。

那麼突破點就是我們所使用的 gradle 工具,首先來看一下項目根目錄下的 settings.gradle 文件:

corda ledger 系列教程 3 開發環境初始化和工程佈局

要明確的是,這個文件是 gradle 從整體上描述了代碼的佈局,每一行的 include 對應一個子工程(子工程可以看成一個獨立的 gradle 項目,可以獨立打包成構建物部署或者被依賴),同時也對應着一個獨立的目錄結構,感興趣的同學可以一一比對一下。

這裏着重介紹幾個比較重要的子項目,也是我們後面會大篇幅分析的:

  1. core:主要包含 corda 的核心庫,加密算法;corda ledger 核心概念所對應的數據結構;節點以及通信協議的一些接口等

  2. node:節點服務端,包含了 corda 節點的核心實現,如 node driver、node services、messaging、 persistence 等

  3. client:節點客戶端,主要包含了一些連接節點服務端和遠程調用的庫

  4. node-api:主要包含節點服務端和客戶端的一些公共的數據結構,比如 rpc 相關

  5. config:包含日誌相關的配置和節點啓動時的配置模版

  6. lib:包含一些項目所依賴的 jar 包,目前只有纖程庫 quasar

  7. experimental:包含一些仍處於實驗階段的平臺改進相關的代碼

  8. finance:這是 corda ledger 專門針對金融場景維護的子工程,定義了一系列基本的合約以及相關的 schemas、協議,如抽象的可替代資產,現金,合同和商業票據

  9. testing:提供一些便捷的工具用於對 contracts 和 flows 進行測試(主要是對節點進行 mock 實現)

  10. tools:一個 GUI 版本的區塊鏈瀏覽器

  11. samples:例舉了一些 dapp 的 demo 供參考

  12. webserver:corda ledger 維護的一個 web 服務器實現,不過不推薦使用,我們可以用 springboot 或者 ktor 替換它。實際上在 corda 網絡中,一個 webserver 基本上等價於節點的 rpc 客戶端

針對上面的 6 強調一下:

  1. 由於 java 中沒有原生支持協程(如 go 語言中的 goroutine),而 kotlin 的協程目前還處於實驗性階段,因此 corda ledger 選擇了著名的 Java 纖程庫 quasar,纖程的概念和用處我們在後面的教程會講到

  2. 在構建項目時,一般會將所需要的依賴寫在描述文件 build.gradle 裏面,項目構建時,gradle 會按照指定的順序從相應的 maven 倉庫拉取依賴;但是某些特殊情況下我們也可以直接指定本地文件夾的某些依賴,如此處的 quasar.jar

這裏貼一下 corda 官方文檔中的 corda repo layout:

corda ledger 系列教程 3 開發環境初始化和工程佈局

由於微信公衆號不支持外部超鏈接,所以可能要辛苦大家自己輸入地址查看原網頁:https://docs.corda.net/corda-repo-layout.html

考慮到大家第一次接觸到 corda ledger 的代碼,或許還有很多區塊鏈和 kotlin 新手,這一節的信息量不是很大,但是涉及到的工具比較多,希望大家能從頭到尾把整個源碼閱讀環境初始化好,有問題可以隨時後臺或者在 corda ledger 技術羣大膽提問 :)

感謝大家!