Я предполагаю, что есть очевидный ответ на этот вопрос, но я просто полностью упускаю суть. У меня есть очень простой контракт с двумя функциями: сеттер, который изменяет кучу полей, и постоянный геттер, который возвращает эти поля. И у меня есть приложение 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);
});
если вы попробуете что-то подобное в javascript? (на переменную состояния)
contract.statevariable(function(err, result) {
$("#htmlelement").html(result);
});
Возможно, ваш MetaMask не подключен к вашему экземпляру TestRPC. Когда вы открываете MetaMask, вам нужно будет щелкнуть «меню провайдера» в верхнем левом углу с надписью «Основная сеть Ethereum» и выбрать «Localhost 8545» или, если вы настроили TestRPC по-другому, «Пользовательский RPC».
Себастьян