Web3js

Metamask 停止注入 Web3。如何正確注入 Web3.js?

  • January 30, 2021

我一直在執行一個 Django 應用程序,它允許使用者使用 Metamask 註冊/登錄。在最近的重大變化之前,一切都很好:

2021 年初,MetaMask 將不再注入 web3.js API。您仍然可以帶上自己的 web3.js 或類似的庫並將其與 MetaMask 一起使用。我們將停止為您注入特定版本的 web3.js。

這是我以前做的。

我檢測到 METAMASK 如下 –> 這仍然有效

if (typeof web3 !== 'undefined') {
   data['web3_status'] = true;
   if (web3.currentProvider.isMetaMask === true) {
     console.log('success');
   } else {
     console.log('detection failed)';
   }
 } else {
   console.log('detection failed');
};

我要求使用者啟用–> 這仍然有效

var accounts = await ethereum.request({ method: 'eth_requestAccounts' });

我要求使用者簽署消息以進行驗證–> 這不起作用

web3.personal.sign(nonce, account, function(error, signature)

Metamask 不再注入 web3.js。所以我嘗試如下注入我自己的。

在我的 html 標頭中

<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.2.9/web3.min.js"></script>` 

在 metamask.js 腳本中

const provider = new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/<MY-API_KEY>');
const web3 = new Web3(provider);

我在嘗試簽名時收到以下錯誤;

metamask.js:51 Uncaught TypeError: Cannot read property 'personal' of undefined

感謝您的時間。

metamask.js 腳本似乎不正確。

沒有足夠的程式碼來測試,但你必須做這樣的事情

const oldProvider = web3.currentProvider; // keep a reference to metamask provider

myWeb3 = new Web3(oldProvider);  // now you can use myWeb3 instead of web3

如果項目很大,您可能希望將 web3 替換為 myWeb3。

global.web3 = myWeb3

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