如何连接web3.js 1.0.x到Metamask
How to connect web3.js 1.0.x to Metamsk
我正在使用 web3.js 1.0.0-beta.36 连接到区块链。
但不幸的是,如果 Metamask 已启用,此代码无法连接到它。
var metamask = false;
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
metamask = true;
web3.eth.defaultAccount = web3.eth.accounts[0];
} else {
web3 = new Web3(new
Web3.providers.HttpProvider(infuraUrl));
var address = web3.eth.accounts.create().address;
}
myContract = new web3.eth.Contract(abi,contractAddress);
myContract.methods.Register((Name,Id).send({},function(error,result){
if (! error)
console.log(result);
else
console.log(error);
});
当我们使用 Metamsk 运行 这个程序时,它显示这个错误:
Error: Returned error: Error: MetaMask Tx Signature: User denied transaction signature.
但是当我提到一个固定地址时它起作用了:
myContract.methods.Register((Name,Id).send({from: '0x...'},function(error,result){
if (! error)
console.log(result);
else
console.log(error);
});
出于某些原因,我无法将地址本身带入源代码中,我希望它从 Metamask 获取地址。我该怎么办?
尤里卡!!! (没有特殊的阿基米德风格!)
终于找到了
window.addEventListener('load', async () => {
// Modern dapp browsers...
if (window.ethereum) {
window.web3 = new Web3(ethereum);
try {
await ethereum.enable();
var accounts= await web3.eth.getAccounts();
var option={from: accounts[0] };
var myContract = new web3.eth.Contract(abi,contractAddress);
myContract.methods.RegisterInstructor('11','Ali')
.send(option,function(error,result){
if (! error)
console.log(result);
else
console.log(error);
});
} catch (error) {
// User denied account access...
}
}
// Legacy dapp browsers...
else if (window.web3) {
window.web3 = new Web3(web3.currentProvider);
// Acccounts always exposed
web3.eth.sendTransaction({/* ... */});
}
// Non-dapp browsers...
else {
console.log('Non-Ethereum browser detected. You should consider trying MetaMask!');
}
});
这可以正确连接到 Metamask。主要问题是我们的浏览器超现代!!!
我正在使用 web3.js 1.0.0-beta.36 连接到区块链。
但不幸的是,如果 Metamask 已启用,此代码无法连接到它。
var metamask = false;
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
metamask = true;
web3.eth.defaultAccount = web3.eth.accounts[0];
} else {
web3 = new Web3(new
Web3.providers.HttpProvider(infuraUrl));
var address = web3.eth.accounts.create().address;
}
myContract = new web3.eth.Contract(abi,contractAddress);
myContract.methods.Register((Name,Id).send({},function(error,result){
if (! error)
console.log(result);
else
console.log(error);
});
当我们使用 Metamsk 运行 这个程序时,它显示这个错误:
Error: Returned error: Error: MetaMask Tx Signature: User denied transaction signature.
但是当我提到一个固定地址时它起作用了:
myContract.methods.Register((Name,Id).send({from: '0x...'},function(error,result){
if (! error)
console.log(result);
else
console.log(error);
});
出于某些原因,我无法将地址本身带入源代码中,我希望它从 Metamask 获取地址。我该怎么办?
尤里卡!!! (没有特殊的阿基米德风格!)
终于找到了
window.addEventListener('load', async () => {
// Modern dapp browsers...
if (window.ethereum) {
window.web3 = new Web3(ethereum);
try {
await ethereum.enable();
var accounts= await web3.eth.getAccounts();
var option={from: accounts[0] };
var myContract = new web3.eth.Contract(abi,contractAddress);
myContract.methods.RegisterInstructor('11','Ali')
.send(option,function(error,result){
if (! error)
console.log(result);
else
console.log(error);
});
} catch (error) {
// User denied account access...
}
}
// Legacy dapp browsers...
else if (window.web3) {
window.web3 = new Web3(web3.currentProvider);
// Acccounts always exposed
web3.eth.sendTransaction({/* ... */});
}
// Non-dapp browsers...
else {
console.log('Non-Ethereum browser detected. You should consider trying MetaMask!');
}
});
这可以正确连接到 Metamask。主要问题是我们的浏览器超现代!!!