web3.eth.accounts[0] 返回 undefined 并且 app.vote(1, from:web3.eth.accounts[0] ) 给出错误

Posted

技术标签:

【中文标题】web3.eth.accounts[0] 返回 undefined 并且 app.vote(1, from:web3.eth.accounts[0] ) 给出错误【英文标题】:web3.eth.accounts[0] returns undefined and app.vote(1, from:web3.eth.accounts[0] ) is giving errorweb3.eth.accounts[0] 返回 undefined 并且 app.vote(1, from:web3.eth.accounts[0] ) 给出错误 【发布时间】:2020-08-30 13:48:35 【问题描述】:

我是 Solidity 的新手,我正在通过一个简单的 web 应用程序来探索它。我正在尝试制作一个候选人投票网络应用程序,它接受一些详细信息和一个按钮,详细信息应部署到智能合约创建的块中。 当我尝试在 truffle 控制台中使用 web3.eth.accounts[0] 获取帐户详细信息时,它返回 undefined 。 当我尝试使用 truffle 控制台从帐户 1 向候选人 1 发送投票时:app.vote(1, from:web3.eth.accounts[0] ),我收到如下错误:

truffle(development)> web3.eth.accounts[0]
undefined
truffle(development)> app.vote(1, 
from:web3.eth.accounts[0] )
Thrown:
Error: The send transactions "from" field 
must be defined!
at evalmachine.<anonymous>:0:5
at sigintHandlersWrap (vm.js:272:15)
at Script.runInContext (vm.js:127:14)
at runScript
at bound (domain.js:426:14)
    at REPLServer.runBound [as eval] (domain.js:439:12)
    at REPLServer.onLine (repl.js:726:10)
    at REPLServer.emit (events.js:219:5)
    at REPLServer.EventEmitter.emit (domain.js:482:12)
    at REPLServer.Interface._onLine (readline.js:324:10)
    at REPLServer.Interface._line (readline.js:701:8)
    at REPLServer.Interface._ttyWrite (readline.js:1026:14)
    at REPLServer.self._ttyWrite (repl.js:803:7)
    at ReadStream.onkeypress (readline.js:200:10)
    at ReadStream.emit (events.js:219:5)
    at ReadStream.EventEmitter.emit (domain.js:482:12)
    at emitKeys (internal/readline/utils.js:438:14)
    at emitKeys.next (<anonymous>) 
  hijackedStack: 'Error: The send transactions "from" field must be defined!\n' +
    '    at Method.inputTransactionFormatter (C:\\npm\\node_modules\\truffle\\build\\webpack:\\node_modules\\web3-core-helpers\\src\\formatters.js:142:1)\n' +
    '    at C:\\npm\\node_modules\\truffle\\build\\webpack:\\node_modules\\web3-core-method\\src\\index.js:144:1\n' +
    '    at Array.map (<anonymous>)\n' +
    '    at Method.formatInput (C:\\npm\\node_modules\\truffle\\build\\webpack:\\node_modules\\web3-core-method\\src\\index.js:142:1)\n' +
    '    at Method.toPayload (C:\\npm\\node_modules\\truffle\\build\\webpack:\\node_modules\\web3-core-method\\src\\index.js:177:1)\n' +
    '    at Eth.send [as sendTransaction] (C:\\npm\\node_modules\\truffle\\build\\webpack:\\node_modules\\web3-core-method\\src\\index.js:467:1)\n' +
    '    at Object.sendTransaction (C:\\npm\\node_modules\\truffle\\build\\webpack:\\packages\\contract\\lib\\execute.js:486:1)\n' +
    '    at C:\\npm\\node_modules\\truffle\\build\\webpack:\\packages\\contract\\lib\\execute.js:203:1\n' +
    '    at processTicksAndRejections (internal/process/task_queues.js:97:5)'

【问题讨论】:

【参考方案1】:

您收到此错误是因为未定义 from 字段,当您传递它undefined 时,您可以看到当您运行 truffle(development)&gt; web3.eth.accounts[0] 时它返回 undefined。这是因为这是一个异步方法,这意味着当您发送交易时,您需要等待accounts 方法完成。

因此,您应该这样做(考虑到 web3.eth.accounts 已被弃用并且每次都输入 await 很乏味):

truffle(development)> let accounts = await web3.eth.getAccounts()
truffle(development)> app.vote(1, from: accounts[0] )

【讨论】:

感谢回复let accounts = await web3.eth.getAccounts(); Thrown: evalmachine.&lt;anonymous&gt;:1 await web3.eth.getAccounts(); ^ SyntaxError: Unexpected token ';' truffle(development)&gt; let accounts = await web3.eth.getAccounts() undefined 这很正常,因为控制台等待立即回调(它没有得到)。尽管如此,您的命令应该已经执行 - 尝试输入 truffle(development)&gt; accounts,您应该会看到您的帐户。 感谢 Nicolas,它工作正常,你能告诉我如何从特定帐户为候选人投票,例如:app.vote(1, from: accounts[0] ) 不起作用。 太棒了!我认为在 cmets 中讨论这个问题会有点混乱,所以我建议你打开一个新问题,在其中显示 app.vote() 应该做什么,你正在做什么来调用它,以及你的错误消息'得到。【参考方案2】:

尝试按照以下步骤操作。

$ truffle compile --reset
$ truffle migrate --reset
$ let accounts = await web3.eth.getAccounts()
$ app.vote(1,from : accounts [2]) 

每次要投票时,重做编译和迁移。

【讨论】:

以上是关于web3.eth.accounts[0] 返回 undefined 并且 app.vote(1, from:web3.eth.accounts[0] ) 给出错误的主要内容,如果未能解决你的问题,请参考以下文章

获取 web3.eth.accounts (MetaMask) 的问题

如何使用 1.2.x 版本从 web3 获取特定帐户?

web3.eth.accounts.decrypt 在 cryp.createDecipheriv 抛出错误

[Contract] web3.eth.getAccounts, web3.eth.getCoinbase 使用场景区别

web3js eth vs 帐户 vs 个人

使用 web3.js v0.2.6 创建帐户