web3.eth.accounts[0] возвращает значение undefined, а app.vote(1,{ from:web3.eth.accounts[0] }) выдает ошибку

Я новичок в Solidity и изучал его через простое веб-приложение. Я пытаюсь создать веб-приложение для голосования кандидатов, которое принимает некоторые детали и нажатие кнопки, данные которой должны быть развернуты в блоке, созданном смарт-контрактом. Когда я пытаюсь получить информацию об учетных записях, используя web3.eth.accounts[0] в консоли трюфеля, он возвращает undefined . И когда я пытаюсь отправить голос кандидату 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)'
}

person krishna veer    schedule 14.05.2020    source источник


Ответы (2)


Вы получаете эту ошибку, потому что поле from не определено, когда вы передаете его undefined, как вы можете видеть, когда вы запускаете truffle(development)> web3.eth.accounts[0], оно возвращает undefined. Это связано с тем, что это асинхронный метод, то есть при отправке транзакции вам нужно дождаться завершения метода учетных записей.

Поэтому вы должны сделать (учитывая, что web3.eth.accounts устарело, и каждый раз вводить await утомительно):

truffle(development)> let accounts = await web3.eth.getAccounts()
truffle(development)> app.vote(1,{ from: accounts[0] })
person Elliot Solskjaer    schedule 14.05.2020
comment
спасибо за ответ, но let accounts = await web3.eth.getAccounts(); Thrown: evalmachine.<anonymous>:1 await web3.eth.getAccounts(); ^ SyntaxError: Unexpected token ';' - person krishna veer; 14.05.2020
comment
и truffle(development)> let accounts = await web3.eth.getAccounts() undefined - person krishna veer; 14.05.2020
comment
Это нормально, поскольку консоль ожидает немедленного обратного вызова (которого она не получает). Тем не менее, ваша команда должна была выполниться. Попробуйте ввести truffle(development)> accounts, и вы должны увидеть свои учетные записи. - person Elliot Solskjaer; 14.05.2020
comment
Спасибо, Николай, все работает, подскажите, пожалуйста, как проголосовать за кандидата с определенной учетной записи, например: app.vote(1,{ from: accounts[0] }) не работает. - person krishna veer; 14.05.2020
comment
Большой! Я думаю, что обсуждение этого в комментариях будет немного запутанным, поэтому я предлагаю вам открыть новый вопрос, где вы показываете, что должен делать app.vote(), что вы делаете, чтобы вызвать его, и сообщение об ошибке, которое вы повторно получать. - person Elliot Solskjaer; 14.05.2020
comment
Привет, Николас, у меня есть вопрос по этому поводу, не могли бы вы его проверить. - person krishna veer; 14.05.2020
comment
Если это ответ на ваш вопрос, пожалуйста, примите его, чтобы другие могли видеть. - person Elliot Solskjaer; 14.05.2020

Попробуйте выполнить следующие действия.

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

Каждый раз, когда вы хотите проголосовать, повторяйте компиляцию и миграцию.

person Smail Gueddou    schedule 23.11.2020