Web3:访问 MetaMask 钱包中的私钥
Web3: accessing private key in MetaMask wallet
我有一个简单的 Dapp,我想签署一笔交易,但我没有字符串形式的私钥。
用户正在使用 MetaMask 钱包。在他们授予 web3 对其帐户的访问权限后,我如何才能访问私钥来签署交易?
const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
// PRIVATE_KEY is what I'm trying to get.
MetaMask 不会让您访问私钥,以后也不会。
钱包的全部意义在于保护用户免受恶意 Dapps 的侵害。
出于安全原因,Metamask 不会直接共享私钥。有时它甚至没有密钥 - 例如当用户使用 Metamask UI 来操作硬件钱包帐户时。
您需要构建交易对象并将其传递给 ethereum.request() 方法。这将打开 Metamask window,用户可以在其中签署或拒绝交易请求。
代码示例非常简单,在链接文档中。
可以从您的12字密码中获取私钥,将12字密码插入站点https://iancoleman.io/bip39/的“BIP39助记符”字段中,您将获得所有私钥和public密钥在您输入的密码下的所有帐户
以下是您将如何签署 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
祝你好运! :)
我有一个简单的 Dapp,我想签署一笔交易,但我没有字符串形式的私钥。
用户正在使用 MetaMask 钱包。在他们授予 web3 对其帐户的访问权限后,我如何才能访问私钥来签署交易?
const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
// PRIVATE_KEY is what I'm trying to get.
MetaMask 不会让您访问私钥,以后也不会。
钱包的全部意义在于保护用户免受恶意 Dapps 的侵害。
出于安全原因,Metamask 不会直接共享私钥。有时它甚至没有密钥 - 例如当用户使用 Metamask UI 来操作硬件钱包帐户时。
您需要构建交易对象并将其传递给 ethereum.request() 方法。这将打开 Metamask window,用户可以在其中签署或拒绝交易请求。
代码示例非常简单,在链接文档中。
可以从您的12字密码中获取私钥,将12字密码插入站点https://iancoleman.io/bip39/的“BIP39助记符”字段中,您将获得所有私钥和public密钥在您输入的密码下的所有帐户
以下是您将如何签署 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
祝你好运! :)