使用Infura提供程序时,web3.eth.getAccounts()返回空数组。为什么?

时间:2018-08-18 15:47:52

标签: blockchain ethereum web3 web3js

我试图使用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.

但是理想情况下,它应该返回与我的助记符关联的帐户列表。问题是什么?

2 个答案:

答案 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()