Verhaltensunterschied zwischen Metamask und direkter Verbindung zu testrpc

Ich vermute, es gibt eine offensichtliche Antwort auf diese Frage, aber ich verfehle einfach den Punkt. Ich habe einen sehr einfachen Vertrag mit 2 Funktionen: einen Setter, der eine Reihe von Feldern ändert, und einen konstanten Getter, der diese Felder zurückgibt. Und ich habe eine Javascript-Anwendung, die mit diesem Vertrag über Truffle-Contract interagiert. Hinter den Kulissen wird mein Vertrag für testrpc bereitgestellt. Wenn ich ein Formular absende, rufe ich meinen Setter an und im Then-Block rufe ich meinen Getter an, um die Seite zu aktualisieren. Ich gehe davon aus, dass, wie im Dokument erwähnt, der Then-Block erst ausgeführt wird, wenn die Transaktion abgebaut wurde. Wenn ich jetzt meine App in einem Browser mit deaktiviertem Metamask ausführe und eine direkte Verbindung zu meinem Knoten mit web3 herstelle, funktioniert alles reibungslos, ohne dass die Seite aktualisiert werden muss, um das Ergebnis zu sehen, sobald die Transaktion gesendet wurde. Aber mit Metamask, sobald ich auf „Senden“ klicke, Der Aufruf des Getters ruft nichts ab, und ich muss die Seite neu laden und den Getter erneut auslösen, um Daten zu erhalten. Liegt das an einem Problem im Verhalten von testrpc? Kommt das jemandem bekannt vor?

Hier ist der Vertrag:

pragma solidity ^0.4.11;

contract ChainList {
    // State variables
    address seller;
    string name;
    string description;
    uint256 price;

    // sell an article
    function sellArticle(string _name, string _description, uint256 _price) public {
        seller = msg.sender;
        name = _name;
        description = _description;
        price = _price;
    }

    // get the article
    function getArticle() public constant returns (
        address _seller,
        string _name,
        string _description,
        uint256 _price) {
        return(seller, name, description, price);
    }
}

Und hier ist der JS-Code, der es aufruft:

App.contracts.ChainList.deployed().then(function(instance) {
      return instance.sellArticle(_article_name, _description, _price, {
        from: App.account,
        gas: 500000
      });
    }).then(function(result) {
      console.log("reloading articles");
      console.log("result:", result);
      App.reloadArticles();
    }).catch(function(err) {
      console.error(err);
    });

Antworten (2)

wenn Sie so etwas in Javascript versuchen? (pro Zustandsvariable)

contract.statevariable(function(err, result) {
    $("#htmlelement").html(result);
});

Es könnte sein, dass Ihre MetaMask nicht mit Ihrer TestRPC-Instanz verbunden ist. Wenn Sie MetaMask öffnen, müssten Sie oben links auf das „Provider-Menü“ mit der Aufschrift „Main Ethereum Network“ klicken und „Localhost 8545“ auswählen, oder, wenn Sie TestRPC anders konfiguriert haben, „Custom RPC“.

Nein, nein, ich garantiere Ihnen, dass MetaMask sich mit meinem TestrPC verbindet. Was bestätigt wird, wenn ich die Seite neu lade und die richtigen Informationen sehe.