如何使用 web3.js 注销 MetaMask 帐户

Posted

技术标签:

【中文标题】如何使用 web3.js 注销 MetaMask 帐户【英文标题】:How to Logout of MetaMask account Using web3.js 【发布时间】:2021-08-23 16:03:28 【问题描述】:

我正在使用 MetaMask 将交易发送到我的 DApp 中的合约。当用户单击注销按钮时,我需要如何从我的 DApp 断开 MetaMask 帐户方面的帮助。

前端:ReactJS

后端:Web3js、Solidity(以太坊)

【问题讨论】:

【参考方案1】:

我不知道你是否还有这个问题,但是在异步函数内部你可以调用 clearCachedProvider。 web3Modal 变量被转换为我对 web3 的实例化,例如const web3Modal = new Web3Modal...:

await web3Modal.clearCachedProvider()

【讨论】:

你好。这是工作,但这并没有真正断开 Metamsk 与该站点的连接。这告诉我一个错误: Uncaught (in promise) TypeError: ethereum.clearCachedProvider is not a function Personnaly,我更喜欢重置以清空帐户数组。但这也不会在元掩码扩展中断开连接...... 经过测试和工作!【参考方案2】:

用户可以使用 MetaMask 本身内的帐户断开按钮断开 MetaMask 帐户。此外,任何页面刷新或重新加载都会自动断开 MetaMask。

【讨论】:

是的,我知道。但我想在我的前端实现一个按钮。当用户单击该按钮时。它应该注销到 MetaMask。如需参考,请参阅PanCakeSwap 注销功能。 他们实际上并没有断开元掩码。您可以看到在元掩码中它仍然显示connected,即使在单击注销后也是如此。他们可能只是他们分配地址的变量 这是正确答案。由于安全和隐私问题,连接/断开功能完全掌握在用户手中。以编程方式重置帐户数组不会断开钱包。【参考方案3】:

一旦连接了钱包,用户就可以断开连接,您无法控制元掩码。您实际上是通过检查您是否可以访问他们的帐户来模拟登录和注销的概念。

const ethereum = window;
const accounts = await ethereum.request(method: 'eth_accounts');
if (accounts && accounts.length > 0) 
    console.log("user is connected");
 else 
    console.log("user not connected");

我要做的一件事是注意任何帐户更改:

window.ethereum.on('accountsChanged', async () => 
    // Do something
);

通常在我的应用程序中,我有一个初始化函数来检查元掩码,它安装了吗?有联系吗?然后我存储状态,以便应用程序可以持续存在,就好像用户在页面刷新时登录一样。如果发生任何事情,例如帐户更改或断开连接,上面的脚本会运行,我会再次运行我的初始化脚本来重置状态。

// Runs on page load
initialise();

// Runs whenever the user changes account state
window.ethereum.on('accountsChanged', async () => 
    initialise();
);

因此,据我所知,现在有办法联系并断开用户的连接。

let connected = false;
let installed = false;

function isMetaMaskInstalled() 
    return Boolean(window.ethereum && window.ethereum.isMetaMask);


async function isMetaMaskConnected() 
    const ethereum = window;
    const accounts = await ethereum.request(method: 'eth_accounts');
    return accounts && accounts.length > 0;


async function initialise() 
    connected = await isMetaMaskConnected();
    installed = isMetaMaskInstalled();


initialise();

window.ethereum.on('accountsChanged', async () => 
    initialise();
);

然后,我的 UI 会响应 installedconnected 变量。

【讨论】:

【参考方案4】:

根据文档,我们可以使用 onboard.walletReset() 并且它返回 undefined 并且它不会断开与 wallet.from 前端的连接,我们需要将状态设为 emp 以下是文档中的清晰理解 // 用户想要退出会话并且需要重置钱包状态... onboard.walletReset() // 这个方法是同步的,返回 undefined

【讨论】:

板载什么以及它与这个问题有什么关系? onboard.js docs.blocknative.com/onboard 用于连接和断开不同的钱包,因为问题与断开元掩码钱包有关 就问题而言,堆栈中没有使用onBoard。【参考方案5】:

如 EIP-1193 所附,web3.js 目前仍仅适用于连接和事件,例如断开事件、网络更改和钱包帐户更改。

【讨论】:

“附在 EIP-1193 上”,附在什么上,你的福特皮卡?请更加明确和清楚地说明您在此处要表达的内容。 eip-1193的内容本质是,你只能通过web3编程方式进行钱包连接,检测钱包用户侧的换网、换钱包等事件的变化,但你可以不要以编程方式断开 web3 上的钱包。在 pancake 使用 metamask 连接钱包的情况下,它只使用保存用户钱包地址的变量,当用户点击断开菜单时,它只是删除了 pancake 创建的变量的内容,并没有真正断开用户的钱包。

以上是关于如何使用 web3.js 注销 MetaMask 帐户的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MetaMask 与 Web3.js 版本 1.2.6 连接?

Metamask 停止注入 web3.js

在 React 中使用 Web3 和 Metamask

Web3 JS 库(& Metamask),获取代币余额

Metamask BSC bep20 令牌的 web3 JS 支付按钮

未捕获的错误:无效地址 web3.currentProvider MetaMask