我试图使用Infura api制作一个以太坊网络应用程序。首先,我编写了一份固本合同,然后在rinkeby网络上使用infura api部署了它。这是我的部署脚本,它似乎已成功运行。
const HDWalletProvider = require("truffle-hdwallet-provider");
const Web3 = require('Web3');
const compileFactory = require('./build/CampaignFactory.json');
const provider = new HDWalletProvider(
"MY_SECRET_MNEMONIC",
"https://rinkeby.infura.io/v3/363ea9633bcb40bc8a857d908ee27094"
);
const web3 = new Web3(provider);
console.log("provider info: " + provider);
const deploy = async () => {
const accounts = await web3.eth.getAccounts();
console.log("account used: " + accounts[0]);
result = await new web3.eth.Contract(JSON.parse(compileFactory.interface))
.deploy({data: "0x"+compileFactory.bytecode})
.send({from: accounts[0]});
console.log("deployed to address: " + result.options.address);
};
deploy();
然后我创建了另一个脚本web3.js,该脚本使用Infura api创建了web3提供程序:
import Web3 from 'web3';
let web3;
if (typeof window !== 'undefined' && typeof window.web3!=='undefined') {
// we are in the browser and metamask is running.
web3 = new Web3(window.web3.currentProvider);
console.log("using metamask");
}
else {
// we are in server OR user without metamask.
const provider = new Web3.providers.HttpProvider(
"https://rinkeby.infura.io/v3/363ea9633bcb40bc8a857d908ee27094"
);
web3 = new Web3(provider);
console.log("using infura");
}
export default web3;
但是当我将此web3.js文件导入某个地方然后尝试使用“ web3”对象时,它将返回空的帐户数组。例如:
import web3 from '../../ethereum/web3';
...
const accounts = await web3.eth.getAccounts();
console.log("Account list: "+accounts); // returns empty array.
但是理想情况下,它应该返回与我的助记符关联的帐户列表。问题是什么?
答案 0 :(得分:2)
幼稚的解决方案是在第二个脚本中使用HDWalletProvider
,而不是HttpProvider
。
第二个脚本到底要做什么?我怀疑第二个脚本是您要与DApp一起部署的内容,因此包括助记符在内,有一种很好的方法将所有以太币分配给知道如何“查看源代码”的第一个用户。 “。
如果是这样,请在第一个脚本中使用provider.getAddresses()
显示与助记符关联的地址,然后将这些地址硬编码到第二个脚本中,以备后用。自然,您将无法在第二个脚本中签署任何交易,但至少您可以读取与这些地址关联的数据。
答案 1 :(得分:0)
将sdk.dir=C\:\\Users\\User\\AppData\\Local\\Android\\Sdk
放在await window.ethereum.enable()
之前,
或者使用 web3.eth.getAccounts()
而不是 requestAccounts()
:
getAccounts()