庫對比:Web3.js 與 Ethers.js
每一個可編程的區(qū)塊鏈都有一套SDK或庫,幫助連接并與特定的區(qū)塊鏈通信。今天的大多數(shù)區(qū)塊鏈都依賴于以太坊網(wǎng)絡(luò),使其與EVM兼容。如果創(chuàng)建了ETH庫,就有可能在任何與EVM兼容的區(qū)塊鏈上使用它。然而,通信是可以使用JSON-RPC協(xié)議的。
在這篇文章中,我們將對兩個流行的ETH庫進行比較。你可以了解到他們之間的差異,他們的優(yōu)點和缺點。這篇文章也可以幫助你決定在未來的項目中使用什么庫。
用于區(qū)塊鏈的 JavaScript
自 1995 年 Brendan Eich 發(fā)明 JavaScript 以來,它已發(fā)展成為互聯(lián)網(wǎng)上最常用的編程語言,用于構(gòu)建當今使用的許多工具。據(jù)Statista[1]稱,軟件開發(fā)人員中最常用的語言是 JavaScript。
想象一下你需要解決一個特定的問題;你知道的唯一語言是 JavaScript。應(yīng)該可以使用 JavaScript 來解決這個問題,而不是學習一門新的高級語言來解決問題。許多開發(fā)人員都面臨著這個障礙,并找到了通過構(gòu)建可以通過節(jié)點提供商連接到區(qū)塊鏈的 SDK/庫來使用 JavaScript 構(gòu)建 dApp 的方法。
然而,這種變通降低了在區(qū)塊鏈空間中構(gòu)建的入門級別。您無需學習 Rust 和 Solidity 等高級語言即可為Solana[2]或以太坊鏈構(gòu)建dApp[3]。
此外,降低區(qū)塊鏈開發(fā)的入門水平是JavaScript的眾多好處之一。
什么是庫
在編寫 dApp 時,您可能會發(fā)現(xiàn)需要為區(qū)塊鏈上的特定交易重復(fù)的特定代碼。此代碼/程序可能很長,您必須為新項目繼續(xù)編寫此代碼。無需重復(fù)此程序,您可以使用代碼片段自動執(zhí)行該過程。您可以在需要時隨時將此庫插入到您的項目中。這種方法可以加快開發(fā)速度并消除重復(fù)。
JavaScript 模塊
Javascript 模塊是包含 JavaScript 函數(shù)或代碼簇的典型文件。您可以將它們提取到不同的文件中,而不是讓函數(shù)遍布您的代碼。創(chuàng)建模塊使更改變得非常容易,因為您不必開始查看大型代碼庫來查找特定函數(shù)來更新變量或模式。
由于Javascript本身不支持類,所以JavaScript模塊模仿了類。類幫助開發(fā)人員在單個對象中將方法和字段設(shè)為公共和私有。通過這種模式,我們可以使用 export 和 import 關(guān)鍵字在我們的 JavaScript 項目中創(chuàng)建和使用函數(shù)。請參見下面的示例:
從上面的代碼中,我們已經(jīng)將這個函數(shù)公開。為了使用這個函數(shù),我們可以使用如下所示的 import 關(guān)鍵字:
現(xiàn)在我們了解了 JavaScript 模塊。讓我們在下一節(jié)中討論 ethers.js 庫。
Ethers.js
自 Ethers.js 誕生以來,它經(jīng)歷了穩(wěn)定的增長,甚至成為以太坊開發(fā)人員中最常用的基于 JavaScript 的 web3 庫之一。
該工具可幫助 Javascript 開發(fā)人員與以太坊鏈和任何以太坊虛擬機 (EVM) 兼容的區(qū)塊鏈進行交互。
一位名叫 Richard Moore 的加拿大軟件工程師在 2015 年創(chuàng)建了 ethers.js 作為 web3.js 的替代品。
Ethers.js 以輕量級著稱。它的不同之處在于它管理密鑰和與區(qū)塊鏈交互的方式。在 ethers.js 中,有兩個實體處理上述問題:
- 1. 使用私鑰簽署交易的錢包。
- 2. 使用 JSON-RPC URL 連接到區(qū)塊鏈的提供程序。Ethers.js 檢查狀態(tài)并發(fā)送交易。
Ethers.js 的優(yōu)勢
- 庫大小 - Ethers.js 壓縮后為 88KB,未壓縮時為 284KB。
- ENS - ENS 就像區(qū)塊鏈中的 DNS。無論在哪里使用以太坊地址,也可以在那里使用 .eth 地址。您無需樣板代碼即可輕松設(shè)置域名。
- 測試 - ethers.js經(jīng)過廣泛測試。其中許多測試用例都是由 Richard Moore 親自編寫的。有超過 10,000 個測試用例。
- 許可 - 由于 ethers.js 是在 MIT 許可下發(fā)布的,任何人都可以免費使用和修改它。盡管如此,只要修改的源代碼在 LGPL-3.0 許可下可用,就可以更改庫。
Ethers.js 模塊
在最近的部分中,在我們討論 Ethers.js 之前,我們查看了 JavaScript 模塊,ethers.js 有四 (4) 個模塊,它們是 ethers.js API 的核心。
Ethers.Provider
要了解Ethers.Provider模塊的作用,必須了解什么是節(jié)點。
要訪問區(qū)塊鏈網(wǎng)絡(luò),您需要在您的機器上運行一個節(jié)點來訪問它。該節(jié)點連接到其他節(jié)點以檢查人與人之間的交易是否有效,同時它存儲有關(guān)區(qū)塊鏈狀態(tài)的信息。
區(qū)塊鏈完全由節(jié)點構(gòu)建或組成。這些節(jié)點由世界各地的個人運行。這意味著沒有中央服務(wù)器或單一的事實來源。這就是它去中心化的原因。將節(jié)點想象成汽車的汽油,如果它是空的,它就不會啟動。
節(jié)點的建立可能是一個痛苦的過程,它可能需要一個星期或更長時間。幸運的是,存在 Alchemy、infura 和 Quicknode 等提供商。他們?yōu)槟O(shè)置了節(jié)點。他們所需要的只是讓您建立連接,并且您可以訪問區(qū)塊鏈。
Ethers.Contract
該模塊用于部署智能合約并與之交互。它提供了監(jiān)聽智能合約事件的能力(打包函數(shù))。但是,您可以使用該模塊來調(diào)用有關(guān)智能合約的信息以及智能合約提供的功能。
Ethers.utils
該模塊可以幫助您格式化錢包余額等數(shù)據(jù)并處理其他用戶輸入。
從上面的代碼中,在從錢包中獲取地址后,我們檢索錢包的余額,但由于返回值以 Wei 格式輸出,我們使用 .formatEther 使其更易于閱讀。
Ethers.Wallet
該模塊允許您連接到現(xiàn)有地址。但是,您可以無縫地簽署和創(chuàng)建新錢包。
Web3.js
Web3.js 也是一種流行的基于 JavaScript 的庫,可將客戶端連接到區(qū)塊鏈。該庫使用 HTTP、IPC 或 Websockets 運行本地或遠程以太坊節(jié)點并與之交互。
Web3.js 于 2015 年發(fā)布,它是一個由以太坊基金會自行創(chuàng)建的開源庫。這意味著 web3.js 擁有最大的社區(qū),這與一年后發(fā)布的 Ethers.js 不同。web3.js 庫是比任何其他庫都多的項目和包的一部分。
然而,Web3.js 不像 Ethers.js 那樣管理密鑰。錢包和提供商沒有分開,而是假設(shè)本地節(jié)點連接到處理密鑰存儲、交易簽名和檢查區(qū)塊鏈狀態(tài)的應(yīng)用程序。
web3.js 的優(yōu)勢
支持Ethereum基金會
Web3.js 由以太坊基金會開發(fā)。這意味著它有許多開發(fā)人員為它做出貢獻,而且當問題出現(xiàn)時你肯定比它的對應(yīng)物 Ethers.js 更快地找到解決方案是最理想的
受歡迎
我們可以用 GitHub star 的數(shù)量來衡量它在區(qū)塊鏈開發(fā)者中的受歡迎程度。根據(jù) Github,web3.js 擁有超過一萬七千 (17,000) 顆星,而 ethers.js 擁有七千 (7000) 顆星。它的流行很大程度上是因為先行者的影響,這使它擁有更大的社區(qū)。
Web3.js 的缺點
大小
Web3.js 比 Ethers.js 相對更大,這使得在前端使用它是不可取的,因為它會降低 dApps 的性能。
靈活性
由于 ethers.js 通過關(guān)注點分離處理密鑰的方式,允許開發(fā)人員以不同方式處理密鑰的存儲和管理,因此 web3.js 在這方面存在不足。
許可證
Web3.js 在更嚴格的許可下工作,如果不公開發(fā)布則不允許修改。
Web3.js 模塊
Web3.eth:-該模塊用于連接以太坊區(qū)塊鏈和智能合約。它還允許您訂閱區(qū)塊鏈上的事件。
Web3.net:-此模塊允許您與網(wǎng)絡(luò)節(jié)點屬性進行交互。
Web3.shh:-該模塊允許與 Whisper(一種 dApp 用于相互通信的通信技術(shù))協(xié)議進行通信。
Web3.utils:-該模塊為以太坊 dApp 和其他 web3 包提供實用功能。
Web3.bzz:-此模塊允許您與Swarm 網(wǎng)絡(luò)進行交互[4]
Web3.js 和 Ethers.js 的比較
在本次會議中,我們將使用以下標準比較這兩個庫:
- 開發(fā)者體驗
- 人氣
- 文檔
- 易用性
- 性能
- 維護
開發(fā)者體驗
這兩個庫都可以用幾行代碼創(chuàng)建真正強大的區(qū)塊鏈應(yīng)用程序,但 ethers.js 被認為更干凈,因為提供者和錢包之間的關(guān)注點分離。
然而,許多基金會項目使用 web3.js。這種情況使得大多數(shù)可用的教程都是用 web3.js 編寫的,這為新開發(fā)人員提供了一個非常容易學習的曲線。與 Ethers.js 相比,有更多的資源和解決各種問題的方法。
人氣
GitHub
GitHub 上的一個熱門項目,如你所想是真實的。
Web3.js 作為最流行的以太坊 JavaScript 庫位居榜首,在 GitHub 上有超過 16000 個啟動,但在我看來,GitHub stars 只能證明先發(fā)優(yōu)勢。
另一方面,ethers.js 在 GitHub 上擁有超過 6k 星。
NPM 下載量
NPM 下載顯示開發(fā)人員為他們的項目每周下載庫的次數(shù)。
Web3.js 每周下載量超過 265000 次,而 ethers.js 每周下載量超過 610 次。
此下載顯示從 web3.js 到 ethers.js 發(fā)生了變化或轉(zhuǎn)變。
文檔
這兩個庫都有相當詳盡的文檔。無論哪種方式,ethers.js 都比 web3.js 有優(yōu)勢,這要歸功于它的入門和游戲區(qū)域。
使用的便利性
Web3 將錢包和供應(yīng)商的處理變成一個單一的對象,但它的以太坊使讀取區(qū)塊鏈、修改其狀態(tài)和管理密鑰成為所有單獨的操作。
性能表現(xiàn)
在性能方面,Ethers.js 是一個更好的庫。由于其緊湊的尺寸,它適合在前端應(yīng)用程序上使用。以太是 248 kB 未壓縮和 77 kB 壓縮。
維護
Web3.js 由以太坊基金會維護,但在 2020 年秋季獲得了 ChainSafe 的資助[5],用于使用現(xiàn)代 Typescript 重寫 web3.js。
隨著這一發(fā)展,Chainsafe 致力于帶來改變,以緩解使用 Web3.js 的痛點。
根據(jù) Chainsafe 的說法,他們計劃修復(fù)的領(lǐng)域是:
- 高效地過渡到 Typescript。
- 完全擁有 Typescript 中的整個庫。
- 創(chuàng)建靈活統(tǒng)一的庫版本。
- 支持 eth2 的各種功能。
總之,Chainsafe 似乎致力于做好維護 web3.js 的工作。
然而,ethers.js 由一位加拿大軟件工程師 Richard Moore 維護。在 GitHub 上,只列出了 15 名貢獻者。
下一步是什么
使用這些庫時要自己判斷哪一個最適合您的要求。互聯(lián)網(wǎng)上有很多教程可以幫助您盡快入門。
結(jié)論
Web3.js 和 Ethers.js 都有強大的生態(tài)系統(tǒng),可用于創(chuàng)建極快的 dApp。
令人驚奇的是,在我對這篇文章的研究過程中,這些庫已經(jīng)擴展了多少并且仍在使用。我希望這能讓您有所了解,并讓您更清楚地選擇適合工作的工具。
資源
ethers.js[6]
Web3.js[7]
原文:[Godwin Alexander Ekainu] https://flutterpage.hashnode.dev/comparison-of-libraries-web3js-vs-ethersjs