以太坊 DApp 開發環境尚未成熟,限制了 DApp 的進一步發展。區塊鏈 API 公司 dfuse 分析了當前 DApp 的開發門檻及侷限性,並提出 dfuse 的解決與優化思路。

原文標題:《在以太坊上開發 dapp 的主要問題有哪些》
作者:dfuse

去中心化應用程序(dapp)被廣泛認爲是可以爲像銀行業(DeFi)和遊戲業等領域帶來顛覆性創新的。但是,即使是最有創新性的解決方案,如果不能滿足消費者的期望,也不會被認可。

消費者需要的是流暢和成熟的用戶體驗,而實現這個目標對以太坊的 dapp 開發者來說又是一個重大挑戰。

本文將概述典型的 dapp 架構,並指出當今標準以太坊堆棧的一些固有侷限性,正是這些侷限性導致開發者難以打造出能有說服力用戶體驗。

接着,我們將介紹下以太坊基礎設施領域中的一些能幫助開發者克服這些挑戰的創新,例如 dfuse。dfuse 很自豪能給區塊鏈開發者提供更好的開發體驗,加速以太坊應用程序的主流採用。

DApp 開發的瓶頸與門檻何在?dfuse 給出了自己的思考與改進

經典的以太坊 dapp 架構

一般來說,以太坊上的 dapp 包含三個主要部分(經驗豐富的以太坊開發者可以跳到下一節):

  • 智能合約,通常以 Solidity 編寫,使用 Truffle Suite 等框架構建並部署在以太坊區塊鏈上。
  • 前端代碼,用 Java 編寫的。
  • 後端——一般是用標準的以太坊區塊鏈節點。前端與後端的通信一般是使用節點提供的 JSON-RPC 或 GraphQL API。

還有各種促進前端與 Eth 節點的通信的庫,其中最受歡迎的是 web3.js 和 ethers.js。也還有許多其他語言(Java,Python,Rust…)的 web3 庫。

自建後端節點

在以太坊的早期,開發者必須運營自己的以太坊節點。dapp 發佈了以後,他們還必須運營生產級別的節點(或節點集羣)。運營區塊鏈節點這項工作繁重,也會對開發者的效率造成負擔。

節點服務(NaaS)提供商

上述的這個挑戰促成了一些例如 Infura,以及相對新的 Nodesmith、Quiknode、Blockdaemon、Ethernode、Chainstack、Alchemy、CloudFlare 等公司的 「節點服務」 平臺的興起。

這些平臺爲開發者提供了基於雲端的以太坊節點,從而節省了開發者運營節點的精力。用於開發和生產的解決方案。這些平臺可爲開發者分擔基層操作系統和節點軟件本身的系統管理,例如補丁和更新。

以太坊節點的固有侷限性

即使節點服務能成功地替代開發者擔任系統管理員的職責,它無法幫助開發者實現的用戶體驗去構建更好的 dapp,這是因爲來自節點服務的架構以及以太坊節點支持的 JSON-RPC 和 GraphQL 接口的固有侷限性。

主要的侷限性包括:

觀測到的 state 信息不一致

爲了擴展到單個節點的容量之上同時提供更高的可靠性,作爲服務平臺的節點是通過負載平衡器提供對節點池的訪問的。

由於這些節點中是都作爲以太坊網絡中的對等節點自主運行的,因此當信息在通過網絡傳播的某一個時刻,不同的節點可能處於不同的區塊高度上,甚至處於不同的分叉上。這意味着 dapp 可能收到區塊鏈狀態的信息是不一致的,因爲它的請求獲得的結果是由負載均衡器背後的不同節點提供的。

節點服務平臺通常試圖通過負載平衡器上的會話粘性來解決此問題,總是會去嘗試將指定前端的查詢發送到同一個後端節點,但是這種方法在多種情況下會失敗:

  • 當前端產生的請求多於單個後端節點能負擔的處理量時;
  • 當網絡問題導致前端與後端斷開連接時,而且必須重新連接;
  • 多個節點服務平臺會將不同類型的前端請求(例如,發送交易或搜索鏈歷史記錄)路由到針對該查詢類型優化的不同後端節點組。

那麼由於前端經常訪問多個後端節點,而這些後端節點獲取的區塊鏈狀態與彼此不一致,因此 dapp 很難處理鏈重組。向後追溯鏈歷史的時候,dapp 可能突然發現它想找的父區塊不存在了(原因是它現在正在與在不同分叉上的另一個節點交互)。那麼 dapp 開發者就不得不去專門寫代碼來解決這個問題(方法通常是通過反覆地重連,直到它找到一個節點)。這樣給 dapp 增加了不必要的複雜性,並且可能導致呈現給用戶的信息有出入。

在區塊鏈上搜索信息很慢、有侷限性

dapp 搜索交易或鏈上歷史的能力受限,因爲標準以太坊節點不適合支持精確搜索或執行實時數據的篩選式監聽。想要以高性能的方式進行操作,我們需要對數百萬個區塊和交易做大量的索引,但是:

  • 以太坊節點僅索引交易執行發出的日誌中的某些字段(要索引的字段必須在部署合約時由開發者標記出來)
  • 以太坊節點不索引內部交易(當智能合約調用另一合約的方法時發生)的數據
  • 開發者不願意添加額外的索引字段,因爲每多一個索引字段每個交易的成本都會相對增加,會給合約的用戶帶來額外的費用
  • 以太坊節點使用 Bloom 過濾器執行搜索,因此它始終是模糊搜索,並且會產生僞陽性的匹配。精確匹配需要前端進行額外的處理,前端必須獲取模糊匹配的整個區塊或交易,對其再次檢索而找到精確匹配的結果。這不僅需要開發者的精力,而且浪費了前端和節點之間的帶寬
  • 可用的搜索語法非常有限——僅支持基本的選擇以及簡單的替換
  • 獲取搜索結果的速度很慢——在大範圍的區塊中執行搜索可能需要幾個小時
  • JSON-RPC 非常浪費帶寬——返回的數據遠遠超出你所真正所需。 GraphQL 接口使用的帶寬較少,但不提供串流傳輸功能(前端必須進行輪詢更新)

缺乏原子性

在大多數現代環境中,例如關係數據庫,交易一般是原子操作,但在以太坊(或其他區塊鏈)上不是。每個交易都會經過一系列狀態的轉換,在這個過程中可能遇到多種問題或失敗。 dapp 必須調用多個 API,查詢許多不同的數據源(區塊、mempool、網絡狀態)以便跟蹤交易的生命週期,直至其完成。

同樣,這個負擔就落在了前端代碼上,通過重複輪詢來弄清楚具體發生了什麼,而 dapp 的用戶會因爲 dapp 執行所有這些額外的工作而經歷延遲和需要刷新。

節點是被動的

以太坊節點是被動的,這意味着它們無法生成事件或回調和調用 Webhooks。所有操作必須由前端來啓動,而前端還必須輪詢節點以獲得更新的信息。以太坊節點的事件串流讀取功能太有限,無法滿足大多數 dapp 的需求,並且僅在 JSON-RPC 接口中可用,在 GraphQL 接口上不可用(請 參見此處)。

通過 dfuse 重新思考 dapp 的基礎架構

dfuse 提供的是一個更高級別的區塊鏈 API 的平臺,與區塊鏈節點提供的原生 API 相比,它們可以更輕鬆地完成更多的工作。 dfuse 是爲了賦予 dapp 開發者所需的功能,使其能夠通過快速、流暢的界面構建現代區塊鏈應用程序,從而提供出色的用戶體驗的基礎上而設計的。

dfuse 旨在解決上述所有限制,打破傳統以太坊節點的侷限性。

有一致性的視圖

dfuse 是一個集成的超大規模數據平臺,而不是在負載均衡器上的多個以太坊節點合集。 dfuse 平臺在所有連接上、所有時間點上提供鏈的 state 信息。 dfuse 平臺要麼是看到一個區塊(同時偵測到鏈的分叉和重組),要麼根本不去報告該區塊(在區塊經歷迅速重組並傳播不遠的情況下)。

這樣 dapp 永遠不會面對一個不一致的鏈狀態視圖,並且可以專注在它的主要功能上,不是去忙着驗證區塊鏈的細節。

高速、細粒化的搜索

dfuse 使 dapp 開發者能夠以極細化的顆粒度、非凡的速度和效率來搜索區塊鏈的歷史記錄,還能通過 GraphQL、gRPC 和 Websocket 界面實現實時篩選,串流讀取。

  • dfuse 完全索引所有的 Log 字段——每個交易在 Log 中發出的所有數據都直接適用於高精度搜索。
  • dfuse 完全索引所有內部交易(發送者、接收者、值、方法、輸入參數),從而在整個調用的樹型結構中全面跟蹤合約的操作
  • 索引不會給你的用戶帶來任何額外的 gas 費用——dfuse 的索引是 dfuse 平臺的一項集成功能,不會增加合約執行的資源成本
  • 搜索找到的是完全匹配的結果,而不是模糊搜索的結果。無需編寫額外的前端代碼來重複檢驗搜索結果,也不用浪費帶寬去批量獲取不需要的數據
  • dfuse 提供了一種結構化的查詢語言,類似於 Kibana 或 GitHub 的查詢語言,具有完整的 boolean 操作和直接深入你想找的具體交易或命令的能力
  • dfuse 提供出色的性能——可以在不到一秒鐘的時間,按照指定的搜索條件,搜索全鏈歷史記錄,找到一組完全匹配的項
  • dfuse 通過 GraphQL 能提供簡潔的響應,但又不犧牲串流功能,兩全其美——我們的 GraphQL 界面提供了完整的實時過濾搜索,可爲用戶有效地提供動態更新
  • 無論以太坊網絡上的流量如何,dfuse 的性能都是保持一致的

原子操作

dfuse 提供了一個串流讀取端點,該端點了解交易可能進入的所有複雜狀態,並在其滿足最終性時通知你。無需去費力地通過重複輪詢或檢查多個數據源去跟蹤交易的狀態,你只需要把交易推送上去並保持連接即可接收實時狀態更新,從而也可以向你的用戶提供交易的實時狀態。

有主動性的後端

dfuse 平臺爲您提供了一個可以啓動事件的主動後端。比如,dfuse 可以根據你指定的精確標準(通過上述的搜索以及其他功能)調用你所選擇的 lambda 函數(或雲函數)。這讓 dapp 實現了異步的體系結構,數據更新可以通過多個通信渠道流暢、實時地發佈給用戶。

一個爲尖端 dapp 打造的現代平臺

dfuse 爲您的 dapp 提供了一個現代化的基礎架構層,即:

  • 快速,
  • 可擴展,
  • 提供對區塊鏈事件的高精度,細粒化的實時訪問,
  • 支持主動的 Webhook 形式的回調,
  • 支持原子操作,
  • 具有業內最高的可靠性。

現在就可以試用 dfuse。如有任何疑問和建議,可以通過 Twitter微博微信電子郵件 與我們聯繫,跟我們分享下在以太坊開發 dapp 的經驗——我們很想聽聽你是否對我們的服務滿意。

來源鏈接:www.dfuse.io