3

我正在关注一个使用 testrpc 和 web3.js 的教程。安装软件包后ethereumjs-testrpcweb3testrpc启动 10 个可用帐户及其私钥。

web3位于 1.0.0-beta.18 和ethereumjs-testrpc4.1.1。

运行以下代码时

Web3 = require('web3');
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.accounts

我得到以下输出,而不是教程中显示的 10 个帐户。什么地方出了错?

Accounts {
  currentProvider: [Getter/Setter],
  _requestManager:
   RequestManager {
     provider: HttpProvider { host: 'http://localhost:8545', timeout: 0, connected: false },
     providers:
      { WebsocketProvider: [Function: WebsocketProvider],
        HttpProvider: [Function: HttpProvider],
        IpcProvider: [Function: IpcProvider] },
     subscriptions: {} },
  givenProvider: null,
  providers:
   { WebsocketProvider: [Function: WebsocketProvider],
     HttpProvider: [Function: HttpProvider],
     IpcProvider: [Function: IpcProvider] },
  _provider: HttpProvider { host: 'http://localhost:8545', timeout: 0, connected: false },
  setProvider: [Function],
  _ethereumCall:
   { getId:
      { [Function: send]
        method: [Object],
        request: [Function: bound ],
        call: 'net_version' },
     getGasPrice:
      { [Function: send]
        method: [Object],
        request: [Function: bound ],
        call: 'eth_gasPrice' },
     getTransactionCount:
      { [Function: send]
        method: [Object],
        request: [Function: bound ],
        call: 'eth_getTransactionCount' } },
  wallet:
   Wallet {
     length: 0,
     _accounts: [Circular],
     defaultKeyName: 'web3js_wallet' } }

在教程后面,web3.eth.accounts部署合约时需要

deployedContract = VotingContract.new(['Rama','Nick','Jose'],
    {data: byteCode, from: web3.eth.accounts[0], gas: 4700000})
4

2 回答 2

7

该教程是在 web3.js v1 发布之前编写的。API 在 v1 中发生了显着变化,包括eth.accounts. 您可以固定到旧版本的 web3.js,例如,或者在新的v1 文档0.19.0中找到等效方法。

现在检索帐户是异步完成的,就像新 API 中的许多其他调用一样。因此,您可以使用回调或使用 Promise 来调用它。将帐户列表打印到控制台如下所示:

web3.eth.getAccounts(console.log);
// or
web3.eth.getAccounts().then(console.log);

来自web3.eth.getAccountsv1 文档

所以专门重写你最后引用的部分:

web3.eth.getAccounts()
.then(function (accounts) {
  return VotingContract.new(['Rama','Nick','Jose'],
    {data: byteCode, from: accounts[0], gas: 4700000});
})
.then(function (deployedContract) {
  // whatever you want to do with deployedContract...
})
于 2017-09-11T00:02:25.033 回答
0

如果web3.eth.accounts没有显示预期的结果,请按照这两个简单的步骤(在松露控制台内)

  1. web3.eth.getAccounts().then(function(acc){ accounts = acc })

  2. accounts

那是......如果你想要特定的帐户然后accounts[0/1/2...9]

于 2020-05-14T04:27:11.547 回答