Разница в поведении между Metamask и прямым подключением к testrpc

Я предполагаю, что есть очевидный ответ на этот вопрос, но я просто полностью упускаю суть. У меня есть очень простой контракт с двумя функциями: сеттер, который изменяет кучу полей, и постоянный геттер, который возвращает эти поля. И у меня есть приложение javascript, которое взаимодействует с этим контрактом, используя трюфельный контракт. За кулисами мой контракт развертывается на testrpc. Когда я отправляю форму, я вызываю свой сеттер, а в блоке then я вызываю свой геттер, чтобы обновить страницу. Я предполагаю, что, как сказано в документе, блок then выполняется только после завершения транзакции. Теперь, когда я запускаю свое приложение в браузере с отключенным Metamask, подключаясь напрямую к моему узлу с помощью web3, все работает гладко, не нужно обновлять страницу, чтобы увидеть результат после отправки транзакции. Но с Metamask, как только я нажимаю «Отправить», вызов геттера ничего не возвращает, и мне нужно перезагрузить страницу и снова запустить геттер, чтобы получить данные. Это из-за проблемы в поведении testrpc? Это кому-нибудь звонит в колокол?

Вот контракт:

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

А вот JS-код, который его вызывает:

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

Ответы (2)

если вы попробуете что-то подобное в javascript? (на переменную состояния)

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

Возможно, ваш MetaMask не подключен к вашему экземпляру TestRPC. Когда вы открываете MetaMask, вам нужно будет щелкнуть «меню провайдера» в верхнем левом углу с надписью «Основная сеть Ethereum» и выбрать «Localhost 8545» или, если вы настроили TestRPC по-другому, «Пользовательский RPC».

Нет-нет, я гарантирую, что MetaMask подключается к моему testrpc. Что подтверждается, когда я перезагружаю страницу и вижу правильную информацию.