web3.eth.accounts [0] возвращает неопределенное значение - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в солидности и изучал его через простое веб-приложение.У меня есть веб-приложение, которое принимает некоторые подробности, и кнопка, нажимая которую, детали должны быть развернуты в блок, созданный умным контрактом.Детали успешно развернуты из IDE ремиксов, но при входе через веб-приложение выдается следующее исключение:

inpage.js:1 Uncaught Error: Invalid number of arguments to Solidity function
at Object.InvalidNumberOfSolidityArgs (inpage.js:1)
at u.validateArgs (inpage.js:1)
at u.toPayload (inpage.js:1)
at u.sendTransaction (inpage.js:1)
at u.execute (inpage.js:1)
at HTMLButtonElement.<anonymous> ((index):231)
at HTMLButtonElement.dispatch (jquery-3.2.1.slim.min.js:3)
at HTMLButtonElement.q.handle (jquery-3.2.1.slim.min.js:3)

При серфинге в Интернете я обнаружил, что это может быть из-за того, что web3.eth.accounts[0] возвращает 'undefined ', что и происходит в моем случае.

Наоборот, хотя при отображении web3.eth на консоли он показывает учетные записи и адрес MetaMask тоже с индексом 0Я читал, что это может быть из-за того, что web3js 1.0 может еще не полностью поддерживаться MetaMask, но я не могу найти решение для него.

Также, как проверить версию web3, которую я использую, и как устаретьпонизить при необходимости.

Вот так я пытаюсь получить доступ к web3.eth.accounts[0]

web3.eth.defaultAccount = web3.eth.accounts[0];
console.log(web3.eth.defaultAccount);  // returns undefined

Я также попробовал следующий метод, но безрезультатно:

var myAccount;
web3.eth.getAccounts(function(err,res){
     if(!err)
     {
        myAccount = res;
        console.log(myAccount);
     }
});

Это возвращает адрес учетной записи, но переменная myAccount снова возвращает « undefined » при использовании вне метода getAccounts.Кроме того, написание дополнительной логики внутри части if не помогает дать вышеупомянутое исключение.

Я попробовал несколько вещей, но не смог найти решение.Пожалуйста, направьте и исправьте, если я что-то неправильно понял.

РЕДАКТИРОВАТЬ

Вы можете найти исходный код здесь.https://github.com/anishsamant/Solidity-Demo

См. Courses.sol для файла солидности. См. index.html для веб-приложения.

1 Ответ

0 голосов
/ 06 июня 2018

Методы в web3, такие как getAccounts, являются асинхронными.

Примечание web3 версия 1.xx возвращает обещания.Таким образом, вы используете обещания и можете реализовать их с помощью синтаксиса async / await.

web3 версии 0.xx не возвращают обещания, вы можете использовать только обратные вызовы.

Код для web3 версии 1.xx (могу только предположить, что вы используете).

const myFunc = async () => {
    try {
        const myAccounts = await web3.eth.getAccounts();
        console.log(myAccounts)
        return myAccounts;

    } catch (err) {
        console.log(err);
    }
}

myFunc()
...