如何真正的理解區(qū)塊鏈技術(shù)
當(dāng)提到區(qū)塊鏈時(shí),我喜歡用代碼的方式解釋區(qū)塊鏈,以及它與你當(dāng)前已掌握的開(kāi)發(fā)知識(shí)之間的聯(lián)系。盡管現(xiàn)在很多人都在談?wù)搮^(qū)塊鏈,但由于某些原因,似乎很少有人真正理解這種技術(shù)在我們現(xiàn)有的開(kāi)發(fā)工具集中的作用。
撇開(kāi)政治觀點(diǎn)不談,區(qū)塊鏈只不過(guò)是我們應(yīng)用程序的一個(gè)數(shù)據(jù)層。將來(lái)它可能是惟一的持久性層,當(dāng)然也不一定非要這樣做,也可以在應(yīng)用程序中使用多個(gè)這種類(lèi)型的數(shù)據(jù)層。這里我向你們推薦一個(gè)講座,它主要介紹的是關(guān)于我們現(xiàn)在開(kāi)發(fā)創(chuàng)建相互連接的區(qū)塊鏈時(shí)應(yīng)該著重關(guān)注哪些方面,并解釋了這樣做的必要性。
在我們現(xiàn)有的應(yīng)用程序中,我們使用api在一個(gè)或多個(gè)數(shù)據(jù)庫(kù)中存儲(chǔ)信息。區(qū)塊鏈項(xiàng)目也是這樣做的,你可以與API(客戶(hù)端或服務(wù)器端)進(jìn)行交互,以在區(qū)塊鏈中存儲(chǔ)數(shù)據(jù)。
同樣,我們的數(shù)據(jù)庫(kù)也有相應(yīng)的模型來(lái)構(gòu)造數(shù)據(jù),比如表格、文檔模型,你可以給它命名,他們都是用來(lái)描述數(shù)據(jù)的形態(tài)的。區(qū)塊鏈通常也不一定要遵守這個(gè)約定,它們更像是noSql數(shù)據(jù)庫(kù),你可以在存儲(chǔ)數(shù)據(jù)時(shí)不去關(guān)心數(shù)據(jù)的格式。但是軟件開(kāi)發(fā)經(jīng)驗(yàn)告訴我們,使用非層次數(shù)據(jù)并不一定是個(gè)好主意。這就是為什么我們最終使用Mongoose作為MongoDB的工具,它能夠延遲對(duì)數(shù)據(jù)建模。因此,在區(qū)塊鏈項(xiàng)目中使用Convector之類(lèi)的工具,能夠使編寫(xiě)模型塑造數(shù)據(jù)變得非常簡(jiǎn)單和直觀。
相對(duì)于數(shù)據(jù)庫(kù)的另一個(gè)優(yōu)勢(shì)(可能是最重要的優(yōu)勢(shì))是存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程是存在于數(shù)據(jù)庫(kù)本身的邏輯(函數(shù)),它接收數(shù)據(jù)的輸入來(lái)執(zhí)行操作。在區(qū)塊鏈開(kāi)發(fā)中,這通常被稱(chēng)為智能契約或鏈碼。知道如何編寫(xiě)這些函數(shù)以及需要考慮的相關(guān)事項(xiàng)是我們所說(shuō)的區(qū)塊鏈開(kāi)發(fā),當(dāng)然也不要與區(qū)塊鏈核心開(kāi)發(fā)混淆,后者指的是開(kāi)發(fā)區(qū)塊鏈技術(shù)本身,或者是數(shù)據(jù)庫(kù)引擎。
對(duì)軟件開(kāi)發(fā)人員來(lái)說(shuō)還有一個(gè)比較好理解的參考是控制版本系統(tǒng),如GIT。你對(duì)數(shù)據(jù)所做的每一個(gè)更改都是版本化的,你可以隨時(shí)返回來(lái)檢查這些更改。注意:你甚至可以更改區(qū)塊鏈的歷史值!就像你在GIT中做了一個(gè)rebase來(lái)合并提交或更新消息一樣。但是在GIT和區(qū)塊鏈這兩個(gè)環(huán)境中,你最終會(huì)得到已更改提交以及所有后續(xù)提交的哈希值。你會(huì)得到完全不同的歷史記錄,沒(méi)有人會(huì)接受來(lái)自你的任何更改,因?yàn)槟闫x了主分支(公開(kāi)的區(qū)塊鏈版本)。在區(qū)塊鏈中沒(méi)有—force強(qiáng)制覆蓋歷史記錄。
區(qū)塊鏈?zhǔn)欠稚⒌?,智能契約的執(zhí)行必須在不同的計(jì)算機(jī)上發(fā)生多次,這是區(qū)塊鏈開(kāi)發(fā)人員在使用區(qū)塊鏈作為數(shù)據(jù)層時(shí)必須考慮的分布式計(jì)算概念的一部分。
在智能契約執(zhí)行中,可以將其看作GIT中的一個(gè)update hook,由包含區(qū)塊鏈副本的節(jié)點(diǎn)執(zhí)行,然后再接收你試圖執(zhí)行的提交。這個(gè)hook包含判斷提交作者是否擁有更新存儲(chǔ)庫(kù)的權(quán)限的邏輯。你也可以依賴(lài)于提交作者的身份驗(yàn)證,這樣驗(yàn)證也就只能依靠提交者本人了。
由于你的hook會(huì)在所有的對(duì)等點(diǎn)執(zhí)行,所以你的操作必須是確定的,因此這里就需要函數(shù)式編程了。你不應(yīng)該依賴(lài)全局狀態(tài)(文件系統(tǒng)是全局狀態(tài))或依賴(lài)于外部信息源(如與API的連接或任何網(wǎng)絡(luò)訪問(wèn))生成隨機(jī)數(shù)。
對(duì)于軟件開(kāi)發(fā)人員來(lái)說(shuō),區(qū)塊鏈并不是一種罕見(jiàn)的技術(shù),它的核心功能是建立在我們幾十年前的技術(shù)之上的,就像密碼學(xué)一樣,GIT本身也遵循著今天大多數(shù)區(qū)塊鏈所遵循的核心理念。