DA-ChainTalk #2 — 區塊鏈應用的分層解析

in #da-chaintalk6 years ago

各位好,上次我與 @antonsteemit探討了區塊鏈中State的內涵:

State - 從宏觀到微觀:以太坊如何將智能合約帶入區塊鏈世界

今天我們希望針對一個完整的區塊鏈應用,來「分層」解析其概念上的運作內容,希望能夠讓讀者們未來在考察一個區塊鏈應用時,能夠更清楚地認識其運作方式。

日後,此一系列將以「DA-ChainTalk」的名稱開頭,您亦可從 #da-chaintalk來追蹤我們的文章。謝謝!

block-chain-3055701_1280.jpgsource-pixabay

區塊鏈應用的分層解析

Blockchain as a whole

現在許多人討論到「區塊鏈」時,其所涵蓋的範疇非常廣泛:從共識機制(PoS、PoW)、區塊鏈系統運作、挖礦、智能合約到應用等,全部都可能是討論的內容。如果你上網搜尋「Blockchain」也可以找到大量介紹這些基本成份的文章,但聚焦於這些成分的討論,卻容易使我們對一個區塊鏈應用少了一些「整體性」的了解,所以例如當我們在考察一個新的ICO項目時,不太容易充分理解其關於架構(Architecture)方面的說明。

所以今天我們希望比較系統性地,把整個區塊鏈應用從底層開始解析,除了讓我們了解各個「層」的作用之外,更重要的是了解「分層的意義」。如果你也覺得自己是個對於區塊鏈概念有基本的了解,卻還是時常感覺有些應用似乎還不是太懂,希望這篇文章能對你有所幫助。

Architecture of Blockchain Applications

你可能會問:為什麼要分層呢?其實真正在一個區塊鏈中,不一定會按照這個分層方法來將他們的程式模組化,但是了解各個分層,可以讓我們更容易理解區塊鏈整體運作的方式。整個節點的程式在運作時,可以想像成這是一家大公司,要處理的事情非常多,而分層就好像是一家公司分「部門」一樣,透過這樣的解析方式,能讓我們更清楚每一個我們所知道的知識,在一個大公司中是被運用在哪一個環節。

區塊鏈應用的分層並不像網路的分層有個標準,因此我在這裡選了一個我覺得最好理解的分層方式來介紹。分層方式如下:


(Image Source: github/pandoraboxchain)

1. P2P Network Layer

這個P2P Network Layer是一個分散式系統的底層,可以想像成負責節點之間通訊的協議,也就是定義了在這個區塊鏈世界中,節點之間是如何互相溝通的。這一層的協議內容是門高深的網路架構學問,如Ethereum使用的是他們稱作DEVP2P的函式庫,有興趣的可以點連結進去看看他們的協議細節,例如ETH的Node Discovery Protocal,了解在所謂「分散式」世界中,他們是如何知道新的節點加入以及退出網路。

基本上這一塊不是一般人會接觸的。我們只要知道,要在分散式環境中讓節點互相溝通不是件容易的事情啊!

2. Consensus Layer 共識層

這一層則是定義了一個區塊鏈中大家要用什麼協議來達成共識,也就是大家最熟悉的Consensus Protocal啦!在一個節點運行時,這部份的程式碼負責處理這些「共識」問題,若拿我們熟悉的PoW來說的話,就是負責「挖礦」還有「驗證」別的節點傳來的區塊資訊。
當然,現在共識方式已經發展出非常多種,這也是區塊鏈議題中討論度最高的問題之一,如果對PoS、PoW這方面還不太熟悉的朋友,一定要找機會好好了解一下這個區塊鏈的「精髓」!

3. Virtual Machine Layer 虛擬機層

這個VM(虛擬機)層,最重要的任務就是改變區塊鏈狀態(這裡說的狀態,可以參考我們前一篇State討論文章多一點了解)。其實再簡單點說,這就是執行智能合約的地方:當每個智能合約被執行完之後,都會對合約地址內的資料或是某人的帳戶地址下的資產有所改變,這就是所謂的「狀態改變」。

現在不同的鏈常常運行自己的開發的VM,例如 以太坊所用的Ethereum VM、Neo的Neo VM或是Cardano 的 IELE。這些新VM的開發都是為了增進智能合約的執行效率等等,而不同的VM架構理論上也可以移植到不同的Consensus Layer上,因此現在大家傾向把VM當作獨立一層,特別分開來討論。我個人認為VM層是未來幾年內也會不斷翻新的一個關鍵點,如何讓一個區塊鏈能夠承載全球規模的交易,VM的設計可是非常關鍵的角色啊!

4. API Layer | VM Programming Language

從第四層開始,可以分成兩端探討。第三層的VM是負責執行合約,因此第四層可以想像成我們一般人跟Blockchain VM之間溝通的橋樑。我們跟區塊鏈上VM溝通的方式大概就可分為

  1. 撰寫新的智能合約並部屬到區塊鏈上
  2. 透過API存取區塊鏈上的智能合約

這也是為什麼會分成VM Programming Language,以及API Layer來討論。

VM Programming Language

如果你有寫過智能合約就會知道,我們可以用不同的程式語言進行智能合約的開發,但最後都需要編譯成為VM可以理解的二元編碼。而我們所說的Programming Language層,簡單說就是提供「不同語言到二元碼的編譯器」或是「新的程式語言」。

這些程式碼不一定是官方開發團隊所提供的(也就是說已經不算是區塊鏈本體的一部分了),例如Neo智能合約開發中python語言的編譯器neo-python就是由另一個開發團隊City of Zion所開發(如果你想學NEO智能合約開發也可以看Anton的這篇文章教學xD)。透過這個編譯器,一般python開發者可以輕鬆的利用python撰寫智能合約並且編譯後直接部署到鏈上,不用學習新的語言。但是以目前來看,這些編譯器沒辦法支援絕大多數的套件,所以並不一定比較方便。

現在最多人使用的智能合約開發語言還是非Solidity莫屬,它被歸類為EVM languages,因為它就是一種為了智能合約開發而被設計出來的新語言,因此有許多內建的函式等等都是為了跟區塊鏈溝通而設計,十分方便。因此如果想要走上智能合約開發這條路,Solidity應該是目前社群最廣大、功能最完整的開發語言。

API Layer

API就好像是一個規定好的溝通格式,讓我們能夠向特定的伺服器要求特定資料。
而區塊鏈上的API,就是一個讓鏈下程式跟區塊鏈溝通的接口。其中最有名也最廣被使用的就是以太坊的Ethereum JSON RPC protocol。如果你會寫javascript的話,可以用Web3.js函式庫很輕鬆的透過這個協議跟區塊鏈上的節點溝通,存取智能合約等等。如果沒有這種類似的接口的話,我們就不知道要怎麼叫區塊鏈上的智能合約跑起來啦!

5. Application Business Logic Layer

第五層之後就完全不再是核心開發團隊的事了,而是大家利用區塊鏈來「實現商業價值」的地方,也就是大部份ICO的位置。現在市面上99%的ICO都是在現有的區塊鏈上面運行智能合約並發行自己的token,只有少部份ICO是在做其他層的突破並運行新的鏈。這也是我們常聽到的一個討論議題: Token與Cryptocurrency的差別,不過這不是今天的重點,所以就先不討論了。總之這整個第五層(和第六層)就是我們所稱的Dapp。

一個Dapp的後台內容可以分為鏈上合約以及鏈下程式部份,上圖的App Business Logic也因此被分為on-chain以及off-chain,其實簡單說on-chain部份就是一個新的ICO公司所寫的「智能合約」。這部份的程式被編譯後被放到區塊鏈上並且被公正公開的運作,所以稱為on-chain,通常也是現在大部分ICO的核心內容。至於off-chain的部份,以一家Dapp新創公司來說,就是像傳統系統服務一樣的的業務邏輯,設計在什麼情況下要trigger哪一個合約的函式。在合約部屬到區塊鏈上之後,這些呼叫合約函式的動作都要透過剛剛介紹的第四層中的API來完成,也因此在這中圖中,off-chain 被畫在 API Layer 之上。

6. Application UI Layer

在這張圖中的五六層就是一個完整的Dapp,而如果第五層是一個新的應用程式背後的合約與邏輯的話,第六層就是它的「包裝」囉!現在大多數都是利用網頁當作互動界面,當然也有做成桌面應用或是App的,例如我們常用的錢包們。

報告完畢,謝謝收看!

以上就是如何分層理解一個「區塊鏈應用」的方式,一個不知不覺就寫多了!不過,其實概念上並不難,希望大家看完之後會覺得有點幫助~如果有什麼問題或指教也歡迎留言告訴我們囉!下次再見!^^

Sort:  

好久没有看@deanliu的文章了,最近忙的一塌糊涂,抽空上来看看,文章质量还是很高,很有启发,就是想问问@deanliu为什么这张图不加上数据层?个人认为数据也是dapp中要重点考虑的一个因素。

我自己画了张图:

嗨~ @yingpingzhang,感謝你用心看完還有謝謝你提起一個重要問題!
確實,加上數據層會比較完整xD我也看過許多文章有提到數據層。
我選用這張圖(不是自己畫的Orz)有個重要的原因是:我很喜歡他在VM之上的兩個分支(API、Languange level)這樣的分類,是一個從「應用程式」角度來看比較細緻的分類。

對於應用層到底是如何運作,我在網路上找到絕大多數的文章介紹圖都只有用「應用層」帶過,所以才特別珍愛這張圖。因為像是閃電網路或是Raiden在我引用這張圖中應該屬於Off-chain,我覺得這樣可以解釋比較多東西!

我想我引用的圖的作者原意應該是把數據層(區塊設計)包含在共識層當中了,但實際上如你說的,像網路架構多加一個數據層是比較合適的,你列出的區塊、鏈狀數據結構等等確實不適合放在共識層裡面

結論:
(1)對不起其實最完整的方式應該要自己畫一張圖QQ
(2)我因為偏愛第五層分支的解釋,加上我覺得數據層不好介紹,所以捨棄了Data Layer..
(3)如果想要有比較完整的對於「區塊鏈」本身的理解,像你的圖一樣加入數據層是比較合適的。
(4)大神受我一跪

谢谢这么详细的回复,在steemit上又找到了一个可以一块学习的战友,你的这篇文章对我也很有启发!!!

Hi 大神來了~~~ ^_^ (EOS大漲改口稱您大神~~~)

事業忙是好事,不像我們整天寫文章鬼混.... ^^ 感謝讚美,不過這篇主要是跟 @antonsteemit合作,他比較懂,我只是找題目跟編輯一下.... 我喊他來回答你....

@deanliu过奖了,每次在steemit上看到你的文章都有一种亲切的感觉。

我又来学习啦

大自然好声音向你点歌--无情的雨 无情的你
哈哈哈

最近太忙了,有空录!!!

试了一下,调太高了,感觉老是岔气

那换一首,大地的孩子

看了幾遍才稍微有點概念

哎呀還是寫的太複雜了嘛..?
有什麼地方看不懂可以盡量問呀 ^ ^

多謝分享....但我聽到都頭暈XD

吃點暈車藥再來繼續看啊~~~~ XD

thanks, happy today

thank you, your post^_^

要做 Blockchain Engineer 也不容易啊,各个 Project 之间不断有新协议和构架出现,追个不停。

是啊.... 但搶手啊.... 就得跟上

Coin Marketplace

STEEM 0.28
TRX 0.11
JST 0.034
BTC 66274.97
ETH 3175.04
USDT 1.00
SBD 4.06