Web3js

您如何規範化客戶端 web3 庫?

  • June 4, 2020

在我的 Web 前端,我需要能夠與乙太坊區塊鏈互動。

  1. 使用者可能安裝了 MetaMask。
  2. 使用者可能在未安裝 MetaMask的情況下使用 Web 。
  3. 使用者可能正在使用舊的 dApp 瀏覽器。
  4. 使用者可能正在使用現代 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 實現包裝器。


關於強類型語言和弱類型語言之間區別的一些細節:

  • 強類型語言在編譯時具有更嚴格的類型規則,這意味著在編譯期間更有可能發生錯誤和異常。
  • 弱類型語言的類型規則更寬鬆,可能會產生不可預知的結果,或者可能在執行時執行隱式類型轉換。

引用自:https://ethereum.stackexchange.com/questions/83972