Ganache/Web3: "Schlüssel nicht in Datenbank gefunden"

Ich verwende Ganache CLI v6.1.0 (ganache-core: 2.1.0))(begonnen mit den Standardeinstellungen durch einfaches Ausführen von ganache-cli), web3 (^1.0.0-beta.33)und mein Smart Contract ist für geschrieben solidity ^0.4.0.

Ich habe einige Funktionen, bei denen ich zum Beispiel auf eine Schaltfläche auf meiner Web-Benutzeroberfläche klicken und eine Transaktion an meinen eingesetzten Smart Contract senden und die Daten in der Kette aktualisieren kann. Das funktioniert ohne Probleme.

Seltsamerweise habe ich Probleme, wenn ich calleine Funktion inge (die einfach die Länge eines Arrays zurückgibt). constantAus irgendeinem Grund bekomme ich jedes Mal eine Fehlermeldung: Key not found in database. Dieser Fehler tritt in dem vom callAufruf zurückgegebenen Promise auf.

Hier ist mein Code:

Soliditätsfunktion:

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

JS-Code:

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;
  })
});

Ich hatte dies vor ein paar Tagen mit testrpc anstelle von Ganache zum Laufen gebracht, bin dann aber für die Websocket-Unterstützung (für Ereignis-Listener) zu Ganache gewechselt. Irgendwo auf dem Weg ist dies kaputt gegangen, und es scheint vielleicht ein Fehler in Ganache zu sein.

Ist noch jemand darauf gestoßen? Ich habe bei meiner Suche einige Probleme gesehen, die ähnlich zu sein schienen, aber meistens sporadisch schienen und sich speziell auf das Testen bezogen. Jede Einsicht oder Anleitung wäre willkommen, ich habe zu lange daran festgehalten.

warum übergibst du Accounts in der Anruffunktion? Es wurde auch nicht definiert. Welchen Wert enthält es?
Ups, das ist ein Tippfehler! Fest
es ist immer noch falsch. Sie müssen das Konto auf diese Weise bereitstellen: { from: account }

Antworten (2)

Der Aufruf ist falsch. Versuche es einfach so zu schreiben:

contract.methods.getItemsLength().call({ from: account })
.then(Funktion(Ergebnis) {
    numItems = Ergebnis;
})

Ich hatte dieses Problem, als ich Variablen in Funktionsblöcken wie block.number oder block verwendete. Schwierigkeiten, von denen einige nicht im Remix verfügbar sind, nehme ich an, als ich sie entfernte, funktionierte der Code.