2017年9月3日 星期日

R3 Corda 基本教學:前言與準備工作

I always treat blockchain as a distributed database.
For database learning, start from "CRUD" is a good approach.
(But for blockchain, please ignore delete.)

This is a note for R3 Corda learning, based on M14.

*******

不知道大家怎麼看待區塊鏈這個東西?特別是私有鏈的架構。
我個人對於私有鏈的作法一直不以為然,因為這跟封閉式有權限的資料庫幾乎無異。
如果在乎資料被部分用戶更動,難道不能用Log當作稽核的工具?
區塊鏈的原意,是要在公開的環境下使用,作為公開的賬本。
但是現在有不少的區塊鏈方案,主打私有鏈適合企業的特點。
不過我還是抱著問號,如果封閉的使用模式,何必要特地導入區塊鏈?

以上是我對私有鏈的懷疑跟疑問,但是基於工作的原因還是得碰。
從IBM Hyperledger Fabric玩到R3的Corda,Corda是我覺得最莫名其妙的東西。
連他們自己都講了,Corda不是區塊鏈,但是從區塊鏈得到啟發。
區塊鏈最基本的定義,就是區塊鏈上每一個用戶都是平等的。
可以有一樣的操作權限還有使用同樣的資料。
但是Corda完全違背這個原則,它認為所有的交易不應該發布給所有節點。
只有相關的參與方會得到資料,其他用戶不會有任何相關資料儲存。

舉例來說,一個轉帳交易只有A跟B兩方,A轉帳給B的事實。
所以在R3的Corda裡面,只有A跟B的賬本有交易紀錄,其他C或D是完全不知道的。
萬一A或B有一方的系統故障,可能有資料被另一方竄改的風險。
或者非常剛好A跟B的儲存系統同時故障,於是所有相關交易紀錄消失。
不知道這樣的模式是否有資格跟人家叫區塊鏈?
反正R3跟你說他就是要這樣玩,主打的對象是銀行等金融機構。
他們的假設是金融機構有強大且安全的基礎建設。
不管是安全性或者資料儲存備援,理論上沒有太大故障的問題。

另一主張是對金融機構,共享所有交易資料的區塊鏈賬本模式也未必適合。
所以他們開發適合金融應用的區塊鏈,這就是R3 Corda。

這家公司的理念,也讓不少原先的銀行參與者退出。
不過還是從銀行間拿了很多錢,募資至少超過一億美金。

*******

以上是個人的看法,不管你是否認同,我的重點是要介紹Corda的基本開發。
區塊鏈的學習就當作玩資料庫,從CRUD的角度切入。
(不過區塊鏈沒有Delete的概念)
知道怎麼把資料寫入跟讀出來,其他的使用就是應用程式的問題了。
反正資料庫的功能就只是紀錄資料而已,不是嗎?

Corda相較一般資料庫比較複雜,有環環相扣的模組來操作資料寫入。
透過UTXO的模式,以公證方(Notary)節點來驗證交易的真實性,避免Double Spend的問題。

舉例來說,A把100元轉給B之後,他不能再次把同樣的交易單改收款人C再次轉帳。
因為公證方會發現這個問題,一個提交的交易只能進行一次,被標示為已發生。
從這個角度,大家應該也可以意識到:如果公證方節點死了怎麼辦?
那就真的死了!整個網路無法進行交易。
站在HA的考量,Corda確實有點奇怪。只能藉由增加公證方節點的數目來避免。
(透過集中權利的公證節點又再次違背區塊鏈去中心化的理念)

在送往公證方節點之前,還有其他步驟,主要是簽署該份合約。
合約定義了交易的規則,例如轉帳這個合約就是A跟B兩方要簽署。
同意之後會把協議的資金移轉,即從A轉到B。(或者B轉到A)
簽署合約的方式就是提出轉帳的那一邊先簽名,簽完之後給另一邊簽。
(簽名的方式是使用私鑰簽名,規格是常見的X.509憑證)
兩邊都簽完之後,送到公證方確定沒問題之後,寫入到狀態資料庫內。
以上的流程透過資料流Flow來定義。

*******

目前Corda是採開放原始碼的方式,任何有興趣的人都可以自己開發相關應用。
主要的開發語言是Kotlin,一個我之前也沒聽過的東西。
簡單用一句話介紹Kotlin:他就是屬於Android的Swift!
以Java概念為基礎,用相對簡單的Scripting Language實作應用程式。
如果你有很堅強的Java底子,Kotlin應該不會造成你很大的問題。
不然就跟筆者一樣,拿別人的樣板來改吧!

除此之外,也請下載IntelliJ 2017.02 (請確定版本號一樣)
這個IDE是開發Kotlin必備的工具(開發Corda區塊鏈應用的官方工具)。

你應該跟我以前有一樣的疑問,能不能用Eclipse?
答案是不可以!
在Corda官方教育訓練時,講師的回答是這樣。
而開發Kotlin語言的公司,就是創造IntelliJ的公司。

最後是Java JDK,請安裝Java 8。
Build號碼在133之後的版本。

我後面使用的R3 Corda版本,會是根基於M13以後的版本。
從M1到M14(我寫這篇文章時最新的版本)架構變化不小。
M13之後相對之前的版本,有不少的Class都被Refactor了。
(就是Class的名稱改變或者換到其他Name Space下)
一些函式名稱也更動,算是不小的更動。
如果您現在要進入Corda的開發,不要懷疑選M13以後版本就對了。

(M15應該也快了,從官方的Jira可以看到M16應該是內定1.0版)

*******

粗淺的寫了一堆東西,大家應該很難對Corda有完整的框架。
還是等下一個部分實作時配合程式碼一併說明。