我想使用python验证在 MetaMask 中制作的以太坊(ETH)签名。我正在开发一个使用 Flask 作为后端的网站。Javascript 代码向后端发送 POST 请求,其中包含以下 3 个变量:
{'signature': '0x0293cc0d4eb416ca95349b7e63dc9d1c9a7aab4865b5cd6d6f2c36fb1dce12d34a05039aedf0bc64931a439def451bcf313abbcc72e9172f7fd51ecca30b41dd1b', 'nonce': '6875972781', 'adress': '0x3a806c439805d6e0fdd88a4c98682f86a7111789'}
Run Code Online (Sandbox Code Playgroud)
我的目标是验证签名是否包含随机数(随机整数)并且是由公共地址签名的
我使用 javascript 使用以太库来签署随机数
const ethereum = window.ethereum;
const provider = new ethers.providers.Web3Provider(ethereum)
const signer = provider.getSigner()
var signature = await signer.signMessage(nonce);
Run Code Online (Sandbox Code Playgroud)
我尝试了几个 python libraires,但我无法格式化签名、地址和随机数以使其正常工作。这是使用 ECDSA 库进行的不成功尝试:
vk = ecdsa.VerifyingKey.from_string(bytes.fromhex(address), curve=ecdsa.SECP256k1, hashfunc=sha256)
vk.verify(bytes.fromhex(hex(signature)), bytes(nonce, 'utf-8'))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ValueError: non-hexadecimal number found in fromhex() arg at position 1
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助 !
我有一个简单的 Dapp,我想签署一笔交易,但我没有字符串形式的私钥。
用户正在使用 MetaMask 钱包。在他们授予 web3 访问其帐户的权限后,我如何访问私钥来签署交易?
const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
// PRIVATE_KEY is what I'm trying to get.
Run Code Online (Sandbox Code Playgroud) 我试图在React js app中使用MetaMask中的web3,如下所示:
import Web3 from 'web3';
componentDidMount(){
if (typeof web3 !== 'undefined') {
console.log(web3.currentProvider);
// Use Mist/MetaMask's provider
var web3js = new Web3(web3.currentProvider);
web3.version.getNetwork((err, netId) => {
switch (netId) {
case "1":
console.log('This is mainnet')
break
case "2":
console.log('This is the deprecated Morden test network.')
break
case "3":
console.log('This is the ropsten test network.')
break
case "4":
console.log('This is the Rinkeby test network.')
break
case "42":
console.log('This is the Kovan test network.')
break
default:
console.log('This is an unknown network.') …Run Code Online (Sandbox Code Playgroud) 据我们所知,从2020年1月13日开始,metamask将不再注入web3.js。我们应该采取哪些方法来停止对web3的依赖?
另外,我们如何使用目前正在注入 web3.js 的现有 Metamask 来测试它。
blockchain ethereum web3js metamask decentralized-applications
我在这里使用 etherscan-api:(https://sebs.github.io/etherscan-api/#txlist)来获取用户的交易列表(给定公钥),并且我正在获取已清除的列表仅交易,即使在 etherscan.io 上我也可以看到所有待处理的交易,因此信息“在那里”。深入研究源代码https://github.com/sebs/etherscan-api/blob/master/lib/account.js#L122,我发现没有任何迹象表明我可以在哪里找到待处理的交易。代码如下:
const etherscan = require('etherscan-api').init(ETHERSCAN_TOKEN, 'ropsten', '3000');
etherscan.account
.txlist(public_key, 1, 'latest', 1, 100, 'asc')
.then(res => {
console.log("tx_list: ", res.result)
})
// get num of transactions
etherscan.proxy
.eth_getTransactionCount(public_key, 'latest')
.then(res => {
let count = res.result
console.log("eth_getTransactionCount: ", parseInt(count))
})
Run Code Online (Sandbox Code Playgroud) 我正在使用区块链构建一个 todoList Web 应用程序。当我尝试连接blockchain server到元掩码时,我陷入了困境。当我尝试添加Ganache (HTTP://127.0.0.1:7545) 中提到的新网络时,我错过了 chainID,当我用Genache网络 Id填充 chainID 时,它显示给定的错误。

trufle-config.js
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*" // Match any network id
}
},
solc: {
optimizer: {
enabled: true,
runs: 200
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何将我的区块链网络与本地主机连接?
MetaMask 文档页面上的示例代码似乎仅发送 ETH。我应该如何自定义示例代码来发送一些自定义令牌?
const transactionParameters = {
nonce: '0x00', // ignored by MetaMask
gasPrice: '0x09184e72a000', // customizable by user during MetaMask confirmation.
gas: '0x2710', // customizable by user during MetaMask confirmation.
to: '0x0000000000000000000000000000000000000000', // Required except during contract publications.
from: ethereum.selectedAddress, // must match user's active address.
value: '0x00', // Only required to send ether to the recipient from the initiating external account.
data:
'0x7f7465737432000000000000000000000000000000000000000000000000000000600057', // Optional, but used for defining smart contract creation and interaction.
chainId: '0x3', // Used …Run Code Online (Sandbox Code Playgroud) 我使用Ethers.js允许用户将他们的 Metamask 钱包连接到我的应用程序。这是我的代码:
import { ethers } from "ethers"
async function connect() {
const provider = new ethers.providers.Web3Provider(window.ethereum, "any")
await provider.send("eth_requestAccounts", [])
const signer = provider.getSigner()
const address = await signer.getAddress()
// Always prints the address that I first connected with
console.log(address)
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦我连接了我的一个 Metamask 帐户,即使我切换到另一个 Metamask 帐户并尝试连接它,我也总是会得到它的钱包地址。
这是为什么?我应该如何解决这个问题?
我想知道使用元掩码扩展名的谷歌浏览器文件中的私钥和交易存储在哪里。你能帮助我吗?它在/Users/jackson/Library/Application Support/Google/Chrome/Default/Extensions???
我正在尝试将我的 Metamask 钱包连接到我的 Java Spring-Boot 后端。我试图遵循这里的例子。我能够自动生成随机数并毫无问题地接收钱包 ID。我正在尝试验证服务器上钱包中的签名随机数,以确保发件人确实是他们所说的人。但是,我无法在 Web3J 上找到任何文档来执行此操作。
web3j 不适合用于此目的吗?该示例展示了如何基于 javascript 在 NodeJS 上进行验证,但我没有找到任何关于如何在 Java 上执行此操作的示例。
我的理解是,公钥是钱包 ID 本身,而消息是由钱包私钥签名的随机数,由于明显的原因,该私钥不被共享。据此,我需要使用公钥“解密”消息,并查看解密的消息是否与后端发送到 Metamask 进行签名的随机数相同。它是否正确?
这是我创建随机数并将其发送到 UI 的代码:
public User findUserByPublicAddress(String publicWalletId) {
User u = userRepository.findByPublicWalletId(publicWalletId);
if(u == null) {
u = new User("", "", "", null, publicWalletId, "");
String nonce = StringUtil.generateRandomAlphaNumericString();
u.setNonce(nonce);
userRepository.saveAndFlush(u);
}
return u;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我查看用户是否已经在我的系统中,如果不是,那么我只需创建一个临时用户,并生成一个随机数并将其保存在数据库中。该随机数被发送到 UI 以供 Metamask 进行签名。但是,我不确定如何进行验证部分。