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