Ganache/Web3: «Ключ не найден в базе данных»

Я использую Ganache CLI v6.1.0 (ganache-core: 2.1.0))(начал с настроек по умолчанию, запустив просто ganache-cli), web3 (^1.0.0-beta.33)и мой смарт-контракт написан для solidity ^0.4.0.

У меня есть несколько работающих функций, где я могу, например, нажать кнопку в своем веб-интерфейсе, и он отправит транзакцию в мой развернутый смарт-контракт и обновит данные в цепочке. Это работает без каких-либо проблем.

Как ни странно, у меня возникают проблемы при простом callвызове constantфункции (которая просто возвращает длину массива). Почему-то каждый раз, когда я это делаю, я получаю сообщение об ошибке: Key not found in database. Эта ошибка возникает в обещании, возвращенном вызовом call.

Вот мой код:

Функция твердости:

function getItemsLength() public constant returns(uint256) {
    return items.length;
}

JS-код:

var account;
var numItems = 0;
web3.eth.getAccounts().then(function(result) {
account = result[0];
var contract = new web3.eth.Contract(
    simpleStorageABI,
    contractAddress,
    {
      from: account,
      gasPrice: '20000000000',
      gas: '100000'
    }
  )
contract.methods.getItemsLength().call(account) // Error occurs here      
.then(function(result) {
    numItems = result;
  })
});

У меня это работало с использованием testrpc вместо Ganache несколько дней назад, но затем я перешел на Ganache для поддержки веб-сокетов (для прослушивателей событий). Где-то по пути это сломалось, и похоже, что это ошибка в Ganache.

Кто-нибудь еще столкнулся с этим? Я видел некоторые проблемы в своем поиске, которые казались похожими, но в основном они казались прерывистыми и касались конкретно тестирования. Буду признателен за любое понимание или руководство, я слишком долго застрял на этом.

зачем вы передаете аккаунты в функцию вызова? Он также не определен. Какое значение он содержит?
Ой, это опечатка! Зафиксированный
это все еще неправильно. Вам необходимо предоставить учетную запись следующим образом: { from: account }

Ответы (2)

Призыв неправильный. Просто попробуйте написать это так:

Contract.methods.getItemsLength().call({ from: account})
.затем (функция (результат) {
    количество элементов = результат;
})

У меня была эта проблема, когда я использовал переменные функционального блока, такие как block.number или block. сложности, некоторые из которых недоступны в ремиксе, я полагаю, когда я удалил их, код сработал.