Web 3.0 應(yīng)用程序(或“DApps”)的架構(gòu)與 Web 2.0 應(yīng)用程序完全不同。
以 Medium 為例,這是一個簡單的博客網(wǎng)站,用戶可以發(fā)布自己的內(nèi)容并與其他人的內(nèi)容進行交互。
作為一個 web 2.0 應(yīng)用程序,它可能聽起來很簡單,但 Medium 的架構(gòu)中有很多東西使這一切成為可能:
首先,必須有一個地方來存儲基本數(shù)據(jù),例如用戶、帖子、標(biāo)簽、評論、喜歡,等等。這需要一個不斷更新的數(shù)據(jù)庫。
其次,后端代碼(用 Node.js、JAVA 或 Python/ target=_blank class=infotextkey>Python 等語言編寫)必須定義 Medium 的業(yè)務(wù)邏輯。例如,當(dāng)新用戶注冊、發(fā)布新博客或在其他人的博客上發(fā)表評論時會發(fā)生什么?
第三,前端代碼(通常用 JavaScript、html 和 css 編寫)必須定義 Medium 的 UI 邏輯。例如,網(wǎng)站是什么樣的,當(dāng)用戶與頁面上的每個元素交互時會發(fā)生什么?
綜上所述,當(dāng)你在 Medium 上寫一篇博客文章時,你會與它的前端交互,它與它的后端對話,它與它的數(shù)據(jù)庫對話。所有這些代碼都托管在集中式服務(wù)器上,并通過互聯(lián)網(wǎng)瀏覽器發(fā)送給用戶。這是對當(dāng)今大多數(shù) Web 2.0 應(yīng)用程序如何工作的一個很好的高級總結(jié)。

但所有這一切都在改變。
區(qū)塊鏈技術(shù)為 Web 3.0 應(yīng)用開啟了一個激動人心的新方向。在本文中,我們將重點關(guān)注以太坊區(qū)塊鏈帶來的好處。
是什么讓 Web 3.0 與眾不同?
與 Medium 等 Web 2.0 應(yīng)用程序不同,Web 3.0 消除了中間人。沒有存儲應(yīng)用程序狀態(tài)的集中式數(shù)據(jù)庫,也沒有后端邏輯所在的集中式 Web 服務(wù)器。
相反,您可以利用區(qū)塊鏈在由互聯(lián)網(wǎng)上的匿名節(jié)點維護的分散狀態(tài)機上構(gòu)建應(yīng)用程序。
“狀態(tài)機”是指一臺機器,它維護一些給定的程序狀態(tài)和該機器上允許的未來狀態(tài)。區(qū)塊鏈?zhǔn)怯靡恍﹦?chuàng)世狀態(tài)實例化的狀態(tài)機,并且具有非常嚴格的規(guī)則(即共識)來定義該狀態(tài)如何轉(zhuǎn)換。
更好的是,沒有一個實體可以控制這個分散的狀態(tài)機——它由網(wǎng)絡(luò)中的每個人共同維護。
那么后端服務(wù)器呢?在 Web 3.0 中,您可以編寫定義應(yīng)用程序邏輯并將它們部署到去中心化狀態(tài)機上的智能合約,而不是如何控制 Medium 的后端。這意味著每個想要構(gòu)建區(qū)塊鏈應(yīng)用程序的人都將他們的代碼部署在這個共享狀態(tài)機上。
前端呢?它幾乎保持不變,除了一些例外,我們將在后面介紹。
這是架構(gòu)的樣子:

仔細觀察
現(xiàn)在,讓我們更深入地了解是什么使這成為可能。
1) 區(qū)塊鏈
以太坊區(qū)塊鏈經(jīng)常被吹捧為“世界計算機”。這是因為它是一個全局可訪問的確定性狀態(tài)機,由對等節(jié)點網(wǎng)絡(luò)維護。此狀態(tài)機上的狀態(tài)更改受網(wǎng)絡(luò)中對等方遵循的共識規(guī)則的約束。
因此,換句話說,它實際上被設(shè)計為世界上任何人都可以訪問和寫入的狀態(tài)機。因此,這臺機器不屬于任何單一實體,而是由網(wǎng)絡(luò)中的每個人共同擁有。
還有一件事要知道:數(shù)據(jù)只能寫入以太坊區(qū)塊鏈——你永遠無法更新現(xiàn)有數(shù)據(jù)。
2) 智能合約
智能合約是在以太坊區(qū)塊鏈上運行的程序,它定義了區(qū)塊鏈上發(fā)生的狀態(tài)變化背后的邏輯。智能合約是用高級語言編寫的,例如 Solidity 或 Vyper。

由于智能合約代碼存儲在以太坊區(qū)塊鏈上,任何人都可以檢查網(wǎng)絡(luò)上所有智能合約的應(yīng)用邏輯。
3)以太坊虛擬機(EVM)
接下來,你有以太坊虛擬機,它執(zhí)行智能合約中定義的邏輯并處理在這個全局可訪問的狀態(tài)機上發(fā)生的狀態(tài)變化。
EVM 不理解用于編寫智能合約的高級語言,如 Solidity 和 Vyper。相反,您必須將高級語言編譯成字節(jié)碼,然后 EVM 可以執(zhí)行該字節(jié)碼。
4) 前端
最后,我們有前端。正如我們之前提到的,它定義了 UI 邏輯,但前端也與智能合約中定義的應(yīng)用程序邏輯進行通信。
前端和智能合約之間的通信比上圖中顯示的要復(fù)雜一些。接下來讓我們仔細看看這個。
前端代碼如何與以太坊上的智能合約通信?
我們希望我們的前端與我們的智能合約進行通信,以便它們可以調(diào)用函數(shù),但請記住,以太坊是一個去中心化的網(wǎng)絡(luò)。以太坊網(wǎng)絡(luò)中的每個節(jié)點都會在以太坊狀態(tài)機上保存一份所有狀態(tài)的副本,包括與每個智能合約相關(guān)的代碼和數(shù)據(jù)。
當(dāng)我們想要與區(qū)塊鏈上的數(shù)據(jù)和代碼進行交互時,我們需要與這些節(jié)點之一進行交互。這是因為任何節(jié)點都可以廣播在 EVM 上執(zhí)行交易的請求。然后礦工將執(zhí)行交易并將結(jié)果狀態(tài)更改傳播到網(wǎng)絡(luò)的其余部分。
廣播新交易有兩種方式:
- 1.設(shè)置您自己的運行以太坊區(qū)塊鏈軟件的節(jié)點
- 2. 使用Infura[1]、Alchemy[2]和QUIcknode[3]等第三方服務(wù)提供的節(jié)點
如果您使用第三方服務(wù),您不必自己處理運行全節(jié)點的所有麻煩事。畢竟,在你自己的服務(wù)器上設(shè)置一個新的以太坊節(jié)點可能需要幾天時間。(有很多數(shù)據(jù)需要同步——它甚至?xí)加帽鹊湫凸P記本電腦所能處理的更多的帶寬和存儲空間。)
此外,隨著 DApp 的擴展,存儲完整的以太坊區(qū)塊鏈的成本也會上升,你需要添加更多的節(jié)點擴展您的基礎(chǔ)設(shè)施。這就是為什么隨著您的基礎(chǔ)架構(gòu)變得越來越復(fù)雜,您將需要全職的 DevOps 工程師。他們將幫助您維護基礎(chǔ)架構(gòu),以確保可靠的正常運行時間和快速的響應(yīng)時間。
總而言之,避免這些令人頭疼的問題就是為什么許多 DApp 選擇使用 Infura 或 Alchemy 等服務(wù)來為他們管理節(jié)點基礎(chǔ)設(shè)施。當(dāng)然,有一個權(quán)衡,因為這會創(chuàng)建一個集中的阻塞點,但讓我們把那個兔子洞留到另一天。;)
繼續(xù),讓我們談?wù)劰?yīng)商。當(dāng)您需要與區(qū)塊鏈交互時連接的節(jié)點(無論是您自己設(shè)置還是使用來自第三方服務(wù)的現(xiàn)有節(jié)點)通常稱為“提供者”。

每個以太坊客戶端(即提供者)都實現(xiàn)了 JSON-RPC 規(guī)范。這確保了當(dāng)前端應(yīng)用程序想要與區(qū)塊鏈交互時有一組統(tǒng)一的方法。如果您需要 JSON-RPC 入門,它是一種無狀態(tài)、輕量級的遠程過程調(diào)用 (RPC) 協(xié)議,它定義了多個數(shù)據(jù)結(jié)構(gòu)及其處理規(guī)則。它與傳輸無關(guān),因此這些概念可以在同一進程中、通過套接字、通過 HTTP 或在許多不同的消息傳遞環(huán)境中使用。它使用 JSON (RFC 4627) 作為數(shù)據(jù)格式。
通過提供者連接到區(qū)塊鏈后,您可以讀取存儲在區(qū)塊鏈上的狀態(tài)。但是,如果您想寫入狀態(tài),在您將交易提交到區(qū)塊鏈之前,您還需要做一件事——使用您的私鑰“簽署”交易。
例如,假設(shè)我們有一個 DApp 可以讓用戶閱讀或發(fā)布博客文章到區(qū)塊鏈。您可能在前端有一個按鈕,允許任何人查詢特定用戶撰寫的博客文章。(回想一下,從區(qū)塊鏈讀取數(shù)據(jù)不需要用戶簽署交易。)
但是,當(dāng)用戶想要在鏈上發(fā)布新帖子時,我們的 DApp 會要求用戶使用他們的私鑰“簽署”交易——只有這樣 DApp 才會將交易中繼到區(qū)塊鏈。否則,節(jié)點不會接受交易。
這種交易的“簽名”是Metamask[4]通常出現(xiàn)的地方。

Metamask 是一種工具,可以讓應(yīng)用程序輕松處理密鑰管理和事務(wù)簽名。這很簡單:Metamask 將用戶的私鑰存儲在瀏覽器中,每當(dāng)前端需要用戶簽署交易時,它就會調(diào)用 Metamask。
Metamask 還提供了與區(qū)塊鏈的連接(作為“提供者”),因為它已經(jīng)與 Infura 提供的節(jié)點建立了連接,因為它需要它來簽署交易。這樣,Metamask 既是提供者又是簽名者。
區(qū)塊鏈上的存儲
當(dāng)然,如果您正在構(gòu)建一個所有智能合約和數(shù)據(jù)都完全位于以太坊區(qū)塊鏈上的應(yīng)用程序,那么這種架構(gòu)是有意義的。但是任何在以太坊上構(gòu)建應(yīng)用程序的人都知道,將所有內(nèi)容存儲在區(qū)塊鏈上會變得非常昂貴、非常快。
請記住,對于以太坊,用戶每次向區(qū)塊鏈添加新數(shù)據(jù)時都需要付費。這是因為向去中心化狀態(tài)機添加狀態(tài)會增加維護該狀態(tài)機的節(jié)點的成本。
每次交易需要添加新狀態(tài)時,要求用戶為使用你的 DApp 支付額外費用并不是最好的用戶體驗。解決這個問題的一種方法是使用去中心化的鏈下存儲解決方案,如IPFS[5]或Swarm[6]。
IPFS 是用于存儲和訪問數(shù)據(jù)的分布式文件系統(tǒng)。因此,IPFS 系統(tǒng)不是將數(shù)據(jù)存儲在集中式數(shù)據(jù)庫中,而是將數(shù)據(jù)分發(fā)和存儲在對等網(wǎng)絡(luò)中。這使您可以在需要時輕松檢索它。
IPFS 還有一個稱為“Filecoin”的激勵層。這一層激勵世界各地的節(jié)點存儲和檢索這些數(shù)據(jù)。您可以使用 Infura(為您提供 IPFS 節(jié)點)或 Pinata(提供易于使用的服務(wù),您可以將文件“固定”到 IPFS 并獲取 IPFS 哈希并將其存儲在區(qū)塊鏈上)之類的提供商.
Swarm 的相似之處在于它是一個去中心化的存儲網(wǎng)絡(luò),但有一個顯著的區(qū)別。雖然 Filecoin 是一個單獨的系統(tǒng),但 Swarm 的激勵系統(tǒng)是內(nèi)置的,并通過以太坊區(qū)塊鏈上的智能合約執(zhí)行,用于存儲和檢索數(shù)據(jù)。
所以現(xiàn)在,使用 IPFS 或 Swarm,我們的應(yīng)用程序架構(gòu)如下所示:

精明的讀者可能還注意到,在下圖中,前端代碼并未存儲在區(qū)塊鏈上。我們可以像通常在 Web 2.0 中那樣在 AWS 上托管此代碼,但這會為您的 DApp 創(chuàng)建一個集中化的阻塞點。如果 AWS 出現(xiàn)故障怎么辦?如果它審查你的應(yīng)用程序怎么辦?
這就是為什么如果你想構(gòu)建一個真正去中心化的應(yīng)用程序,你可能會選擇將你的前端托管在一個去中心化的存儲解決方案上,比如 IPFS 或 Swarm。
所以現(xiàn)在你的應(yīng)用程序架構(gòu)看起來更像這樣:

查詢區(qū)塊鏈
到目前為止,我們已經(jīng)討論了如何通過簽署交易然后將它們發(fā)送到區(qū)塊鏈來寫入?yún)^(qū)塊鏈。但是從區(qū)塊鏈上的智能合約中讀取數(shù)據(jù)呢?有兩種主要方法可以做到這一點:
1) 智能合約事件您可以使用 Web3.js 庫來查詢和監(jiān)聽智能合約事件。您可以監(jiān)聽特定事件并在每次觸發(fā)事件時指定回調(diào)。例如,如果您有一個智能合約在每個區(qū)塊中從 A 人向 B 人發(fā)送連續(xù)付款流,那么您可以在每次向 B 人進行新付款時發(fā)出一個事件。您的前端代碼可以監(jiān)聽被觸發(fā)的事件通過智能合約并基于它執(zhí)行特定的操作。
2) 圖表上述方法有效,但有一些局限性。例如,如果您部署了一個智能合約,后來意識到您需要一個您最初沒有包含的事件,該怎么辦?不幸的是,您必須使用該事件和數(shù)據(jù)重新部署新的智能合約。此外,使用回調(diào)來處理各種 UI 邏輯會很快變得非常復(fù)雜。
這就是“ The Graph[7] ”的用武之地。
The Graph 是一種鏈下索引解決方案,可以更輕松地查詢以太坊區(qū)塊鏈上的數(shù)據(jù)。圖表允許您定義要索引的智能合約、要偵聽的事件和函數(shù)調(diào)用,以及如何將傳入事件轉(zhuǎn)換為前端邏輯(或任何使用 API)可以使用的實體。它使用 GraphQL 作為一種查詢語言,許多前端工程師都喜歡這種語言,因為它與傳統(tǒng)的 REST API 相比更具表現(xiàn)力。
通過索引區(qū)塊鏈數(shù)據(jù),The Graph 讓我們能夠以低延遲查詢應(yīng)用程序邏輯中的鏈上數(shù)據(jù)。
現(xiàn)在,您的 DApp 架構(gòu)如下所示:

我們幾乎完成了,但我們還有一個主要話題:縮放。
擴展你的 DApp
您可能聽說過,以太坊無法擴展——至少目前還沒有。

以太坊平均gas價格

平均交易費用

平均塊大小
顯然,我們這里有問題。在以太坊上以高昂的汽油費和完整的區(qū)塊構(gòu)建 DApp 會導(dǎo)致非常糟糕的用戶體驗。值得慶幸的是,有一些解決方案正在開發(fā)中。
一種流行的縮放解決方案是Polygon[8],一種 L2 縮放解決方案。Polygon 沒有在主區(qū)塊鏈上執(zhí)行交易,而是擁有處理和執(zhí)行交易的“側(cè)鏈”。側(cè)鏈?zhǔn)桥c主鏈交互的二級區(qū)塊鏈。每隔一段時間,側(cè)鏈就會將其最近區(qū)塊的聚合提交回主鏈。

L2 解決方案的其他示例是Optimistic Rollups 和 zkRollups[9]。這里的想法是相似的:我們使用“匯總”智能合約在鏈下批量交易,然后定期將這些交易提交到主鏈。
帶回家的想法是這樣的:L2 解決方案在鏈下進行交易執(zhí)行(即慢速部分),僅將交易數(shù)據(jù)存儲在鏈上。這讓我們可以擴展區(qū)塊鏈,因為我們不必在鏈上執(zhí)行每一筆交易。這也使交易更快、更便宜——并且在必要時它們?nèi)匀豢梢耘c主要的以太坊區(qū)塊鏈進行通信。

拼湊起來
如果所有這些都讓您頭暈?zāi)垦#敲茨⒉还聠巍⑺羞@些工具拼湊在一起很復(fù)雜,并且可能會導(dǎo)致痛苦的開發(fā)人員體驗。但別擔(dān)心——我們開始看到新的開發(fā)者框架真正改善了開發(fā)者的體驗。
例如,Hardhat[10]是一個開發(fā)者框架,它使以太坊開發(fā)者更容易構(gòu)建、部署和測試他們的智能合約。Hardhat 提供了“Hardhat.NETwork”,開發(fā)人員可以使用它來將他們的智能合約部署到本地網(wǎng)絡(luò)上——而無需處理實時環(huán)境。更好的是,它提供了一個很棒的插件生態(tài)系統(tǒng)[11],讓開發(fā)人員的生活變得更加輕松。Hardhat 還提供了類似于 javascript 的 console.log() 功能,用于調(diào)試目的。
當(dāng)然,這僅僅是開始。我希望我們在未來繼續(xù)看到更好的開發(fā)者工具。
結(jié)論
大多數(shù)人會花費幾個月的時間來弄清楚工具鏈?zhǔn)侨绾喂ぷ鞯模匀绻闶且粋€新的 DApp 開發(fā)人員,我希望這篇文章能為你節(jié)省一些時間。是時候開始建設(shè)了!
如果您對構(gòu)建 Web 3.0 應(yīng)用程序感興趣,請注冊我們的下一個DappCamp[12]隊列,在那里您將學(xué)習(xí)如何在以太坊上構(gòu)建和部署您的第一個 Dapp。
引用鏈接
[1] 使用Infura: https://infura.io/
[2] Alchemy: https://www.alchemy.com/
[3] Quicknode: https://www.quicknode.com/
[4] Metamask: https://metamask.io/
[5] IPFS: https://ipfs.io/
[6] Swarm: https://www.ethswarm.org/
[7] The Graph: https://thegraph.com/
[8] Polygon: https://polygon.technology/
[9] Optimistic Rollups 和 zkRollups: https://ethereum.org/en/developers/docs/scaling/layer-2-rollups
[10] Hardhat: https://hardhat.org/
[11] 插件生態(tài)系統(tǒng): https://hardhat.org/plugins/
[12] DappCamp: https://www.dappcamp.xyz/






