Web3js
您如何規範化客戶端 web3 庫?
在我的 Web 前端,我需要能夠與乙太坊區塊鏈互動。
- 使用者可能安裝了 MetaMask。
- 使用者可能在未安裝 MetaMask的情況下使用 Web 。
- 使用者可能正在使用舊的 dApp 瀏覽器。
- 使用者可能正在使用現代 dApp 瀏覽器。
以下程式碼考慮了所有可能性,並註入 ethers.js 作為最後的手段:
if (window.ethereum) { // Modern dapp browsers... window.web3 = new Web3(ethereum); } else if (window.web3) { // Legacy dapp browsers... window.web3 = new Web3(web3.currentProvider); } else { // Non-dapp browsers... window.web3 = ethers; // ethersjs provided library }
有用!偉大的!我可以
web3.eth.getBalance()
打電話之類的。這是它變得毛茸茸的地方:
似乎在建構子和參數順序方面,用於處理契約的公開介面在庫之間並不統一。
我是否完全錯誤地處理了這個問題?
在您的程式碼中:
window.web3 = new Web3(ethereum); window.web3 = new Web3(web3.currentProvider); window.web3 = ethers; // ethersjs provided library
由於 web3.js 和 ethers.js 顯然是兩個不同的模組(很可能由兩個不同的組實現),它們沒有理由共享完全相同的 API。
您可以將
window.web3
兩者都設置為僅是因為 Javascript 是一種弱類型語言,它允許您自行承擔風險(獲得執行時異常)。如果您想以透明的方式使用兩者,則需要使用統一的 API 實現包裝器。
關於強類型語言和弱類型語言之間區別的一些細節:
- 強類型語言在編譯時具有更嚴格的類型規則,這意味著在編譯期間更有可能發生錯誤和異常。
- 弱類型語言的類型規則更寬鬆,可能會產生不可預知的結果,或者可能在執行時執行隱式類型轉換。