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

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

前端:ReactJS

后端:Web3js、Solidity(以太坊)

【问题讨论】:

    标签: reactjs ethereum solidity web3 metamask


    【解决方案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 创建的变量的内容,并没有真正断开用户的钱包。
      猜你喜欢
      • 2020-03-29
      • 2022-01-19
      • 1970-01-01
      • 2022-06-27
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2018-09-20
      相关资源
      最近更新 更多