去桂林玩了一週,耽誤了一點進度,非常焦慮。回顧一下,前面三篇教程(可以在本公衆號查看歷史)主要是站在一個比較高的視角上闡述區塊鏈以及 corda ledger 的一些技術選型和核心概念,可以說是後續教程的理論基礎,希望大家多多複習。從這一節開始,我們有條理的進入 corda ledger 的代碼世界,目標是從入門到舉一反三 :)
前面提到過,corda ledger 是 R3 開源的一套分佈式賬本技術,目前是以完全開源的形式進行運作,毋庸置疑,核心代碼託管在 github 上:
https://github.com/corda/corda
大家可以先 star 和 fork 起來,關於如何參與貢獻,後面我會專門出一篇教程給大家講解(大概會放在講解 git flow 的那一篇)。
接下來的步驟適合工程新手一步一步跟着操作,熟練工自覺略過:
1. 使用 git clone https://github.com/corda/corda.git 命令將工程克隆到本地:
2. 將工程導入 idea:
由於 corda ledger 工程是用 gradle 構建而成,所以我們可以直接選中 build.gradle 點擊 open 即可:
解釋一下,這裏的 build.gradle 可以粗暴的看成構建工具 gradle 理解整個工程的一個描述文件,很多工程實踐都會有類似的概念:比如 maven 的 pom 文件,stack 的 stack.yaml 文件(用於構建 haskell 項目),由於 corda ledger 使用編程語言 kotlin 編寫,並且最終會打包成 jar 包在 java 虛擬機上運行,所以官方使用了 gradle 作爲構建工具,相信熟悉 java 編程和微服務的同學不會陌生。
我們推薦使用 JVM1.8;注意我們選擇了 use default gradle wrapper,意思是 ide 在初始化工程的時會首先根據配置下載指定版本的 gradle,再使用其去構建項目。接着我們點擊 OK 即可看到 IDE 會匆忙的幫助我們初始化工程:(這一塊新手可能會遇到這樣或者那樣的問題,不要慌,仔細看報錯,也歡迎在後臺或者 corda ledger 交流羣提問)
第一次初始化工程,由於 gradle 和相關依賴的下載可能用時會比較長,請大家耐心等待 :)
如果前面的導入步驟還算順利,你會看到一個多模塊的,看上去比較龐大的工程項目,新手往往在這裏會手足無措,即便有一顆想讀源代碼的心也無從下手,沒關係,我們可以先不急着讀源代碼,而是想辦法理解清楚整個項目是怎麼組織的,每個子項目又是做什麼的。記住一句話,工程上的東西一定是有規律可循的,不要被外在的龐大嚇倒。
那麼突破點就是我們所使用的 gradle 工具,首先來看一下項目根目錄下的 settings.gradle 文件:
要明確的是,這個文件是 gradle 從整體上描述了代碼的佈局,每一行的 include 對應一個子工程(子工程可以看成一個獨立的 gradle 項目,可以獨立打包成構建物部署或者被依賴),同時也對應着一個獨立的目錄結構,感興趣的同學可以一一比對一下。
這裏着重介紹幾個比較重要的子項目,也是我們後面會大篇幅分析的:
-
core:主要包含 corda 的核心庫,加密算法;corda ledger 核心概念所對應的數據結構;節點以及通信協議的一些接口等
-
node:節點服務端,包含了 corda 節點的核心實現,如 node driver、node services、messaging、 persistence 等
-
client:節點客戶端,主要包含了一些連接節點服務端和遠程調用的庫
-
node-api:主要包含節點服務端和客戶端的一些公共的數據結構,比如 rpc 相關
-
config:包含日誌相關的配置和節點啓動時的配置模版
-
lib:包含一些項目所依賴的 jar 包,目前只有纖程庫 quasar
-
experimental:包含一些仍處於實驗階段的平臺改進相關的代碼
-
finance:這是 corda ledger 專門針對金融場景維護的子工程,定義了一系列基本的合約以及相關的 schemas、協議,如抽象的可替代資產,現金,合同和商業票據
-
testing:提供一些便捷的工具用於對 contracts 和 flows 進行測試(主要是對節點進行 mock 實現)
-
tools:一個 GUI 版本的區塊鏈瀏覽器
-
samples:例舉了一些 dapp 的 demo 供參考
-
webserver:corda ledger 維護的一個 web 服務器實現,不過不推薦使用,我們可以用 springboot 或者 ktor 替換它。實際上在 corda 網絡中,一個 webserver 基本上等價於節點的 rpc 客戶端
針對上面的 6 強調一下:
-
由於 java 中沒有原生支持協程(如 go 語言中的 goroutine),而 kotlin 的協程目前還處於實驗性階段,因此 corda ledger 選擇了著名的 Java 纖程庫 quasar,纖程的概念和用處我們在後面的教程會講到
-
在構建項目時,一般會將所需要的依賴寫在描述文件 build.gradle 裏面,項目構建時,gradle 會按照指定的順序從相應的 maven 倉庫拉取依賴;但是某些特殊情況下我們也可以直接指定本地文件夾的某些依賴,如此處的 quasar.jar
這裏貼一下 corda 官方文檔中的 corda repo layout:
由於微信公衆號不支持外部超鏈接,所以可能要辛苦大家自己輸入地址查看原網頁:https://docs.corda.net/corda-repo-layout.html
考慮到大家第一次接觸到 corda ledger 的代碼,或許還有很多區塊鏈和 kotlin 新手,這一節的信息量不是很大,但是涉及到的工具比較多,希望大家能從頭到尾把整個源碼閱讀環境初始化好,有問題可以隨時後臺或者在 corda ledger 技術羣大膽提問 :)
感謝大家!