Web3:访问 MetaMask 钱包中的私钥

Posted

技术标签:

【中文标题】Web3:访问 MetaMask 钱包中的私钥【英文标题】:Web3: accessing private key in MetaMask wallet 【发布时间】:2021-06-29 00:22:55 【问题描述】:

我有一个简单的 Dapp,我想签署一笔交易,但我没有字符串形式的私钥。

用户正在使用 MetaMask 钱包。在他们授予 web3 对其帐户的访问权限后,我如何访问私钥来签署交易?

const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
// PRIVATE_KEY is what I'm trying to get.

【问题讨论】:

【参考方案1】:

出于安全原因,Metamask 不直接共享私钥。有时它甚至没有密钥——例如当用户使用 Metamask UI 操作硬件钱包帐户时。

您需要构造事务对象并将其传递给ethereum.request() 方法。这将打开 Metamask 窗口,用户可以在其中签署或拒绝交易请求。

代码示例非常简单,在链接文档中。

【讨论】:

你对同一个问题有一些指导,但对于 web3j 而不是 js? @gojic 链接的 MM 文档 sn-p 不使用 web3js 库,它仅在纯 javascript 中构建事务对象并将其传递给暴露在 window.ethereum 对象中的 API。 ..不幸的是我不知道Java小程序如何访问浏览器的window属性,所以我希望其他人能够回答这个问题。 好吧,我正在尝试在 android 应用程序上执行此操作,问题是我将进行交易,得到交易哈希,只是无法在没有私钥的情况下完成此操作。例如,我将转移我的硬币从一个账户到另一个账户,但在 metamask 的交易历史中看不到。我想另一种选择是在我的移动应用程序中构建一些简单的钱包 顺便说一句谢谢你的回答:D【参考方案2】:

以下是您如何签署 Metamask 交易的示例:

export const mintNFT = async(url, name, description) => 
    
    //error handling
    if (url.trim() == "" || (name.trim() == "" || description.trim() == ""))  
        return 
            success: false,
            status: "❗Please make sure all fields are completed before minting.",
        
    
  
    //make metadata
    const metadata = new Object();
    metadata.name = name;
    metadata.image = url;
    metadata.description = description;

    //pinata pin request
    const pinataResponse = await pinJSONToIPFS(metadata);
    if (!pinataResponse.success) 
        return 
            success: false,
            status: "? Something went wrong while uploading your tokenURI.",
        
     
    const tokenURI = pinataResponse.pinataUrl;  

    //load smart contract
    window.contract = await new web3.eth.Contract(contractABI, contractAddress);//loadContract();

    //set up your Ethereum transaction
    const transactionParameters = 
        to: contractAddress, // Required except during contract publications.
        from: window.ethereum.selectedAddress, // must match user's active address.
        'data': window.contract.methods.mintNFT(window.ethereum.selectedAddress, tokenURI).encodeABI() //make call to NFT smart contract 
    ;
  
    //sign transaction via Metamask
    try 
        const txHash = await window.ethereum
            .request(
                method: 'eth_sendTransaction',
                params: [transactionParameters],
            );
        return 
            success: true,
            status: "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" + txHash
        
     catch (error) 
        return 
            success: false,
            status: "? Something went wrong: " + error.message
        
    

在此示例中,我们签署了一项交易以铸造 NFT。您可以在此处查看更多详细信息:https://docs.alchemyapi.io/alchemy/tutorials/nft-minter#step-8-implement-the-mintnft-function

祝你好运! :)

【讨论】:

Mugdil 你有来自 web3j 的东西吗?【参考方案3】:

MetaMask 不会让您访问私钥,而且永远不会。

钱包的重点是保护用户免受恶意 Dapps 的侵害。

【讨论】:

【参考方案4】:

可以从您的 12 字密码短语中获取私钥,将 12 字密码短语插入站点 https://iancoleman.io/bip39/ 的“BIP39 助记符”字段中,您将获得您的密码短语下所有帐户的每个私钥和公钥插入

【讨论】:

不要这样做,不要将您的私钥/种子粘贴到您无法控制的任何地方。

以上是关于Web3:访问 MetaMask 钱包中的私钥的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 web3 或其他人获取 Metamask 钱包中的所有代币?

如何使用我的私钥文件加载我的 Solana 钱包?

在 web3.py 中的 personal.newAccount 之后访问私钥

区块链学习钱包

以太坊搭建私链(小问题1)——如何通过metamask获取账户的私钥

ETH开发DAPP使用Web3+Vue唤醒MetaMask钱包和合约交互