Обновление децентрализованного приложения после майнинга контрактной транзакции

Я сделал веб-приложение, которое взаимодействует со смарт-контрактом, используя веб-пакет truffle unbox. В моем контракте есть переменная с именем sum и 2 функции: одна, называемая answer, которая увеличивает переменную sum после ее выполнения, и другая функция, называемая total, которая возвращает значение переменной sum. В моем app.js у меня есть код:

SmartContract.deployed().then(function(contractInstance) {

contractInstance.answer(1, {gas: 140000, from: web3.eth.accounts[0]}).then(function(v) {
    return contractInstance.total.call().then(function(total){
                                    $("#total").html(total.toString());
            });
});

}

Мой вопрос заключается в том, будет ли вызов contractInstance.total выполняться после вызова транзакции contractInstance.answer, так что переменная total в моем index.html будет иметь обновленное значение. Также необходимо слово «возврат» после вызова транзакции function , как answer в этом примере, для того, чтобы следующая функция вызова контракта, например total в этом примере, выполнялась после того, как транзакция будет добыта?

Я использовал testrpc, чтобы проверить, работает ли мое веб-приложение должным образом, но в testrpc блоки добываются мгновенно, поэтому я не уверен, будет ли написанный мной код правильным, если я буду использовать это приложение в сети testnet.

Большое спасибо за ваше время!

Ответы (1)

Мой вопрос заключается в том, будет ли выполняться вызов contractInstance.total после того, как транзакционный вызов contractInstance.answer будет добыт,

Нет, contractInstance.answerвернет хеш транзакции (возможно, она еще не добыта).

Рассмотрите возможность использования версии web3 1.0.x. В нем есть события, которые вы можете прослушать http://web3js.readthedocs.io/en/1.0/web3-eth-contract.html?highlight=contract#id15 .

contractInstance.methods.answer().send({from: '_address'})
.on('transactionHash', function(hash){
    ...
})
.on('receipt', function(receipt){
    ...// your transaction is mined here
})
.on('confirmation', function(confirmationNumber, receipt){
    ...
})
.on('error', console.error);
На веб-странице написано, что web3 1.0 еще не выпущен. В моем проекте трюфелей в package.json указано, что web3 версии 0.20.0. Итак, ваше решение применимо к моей проблеме?
Проверьте последнюю версию web3 npm view web3, обновите свой package.json и установите
К сожалению не смог обновить. Я попытался обновить package.json, а затем запустить sudo npm install (как указано здесь [ссылка] github.com/trufflesuite/truffle/issues/562 для более старой версии), но получил много ошибок. Может быть, это потому, что я использовал трюфельный веб-пакет для проекта. Есть ли в web0.20 какой-либо способ узнать, когда квитанция возвращается, а затем перейти к другой функции вызова обновленного контракта?
Вы можете прослушивать транзакцию по ее хэшу, пока она не будет добыта, например, getTxCallBackздесь: ethereum.stackexchange.com/questions/18884/…
Будет ли хорошей идеей использовать событие внутри смарт-контракта, которое будет запускаться сразу после того, как кто-то установит новые значения, а затем использовать фильтр для проверки этого события? Будет ли выполняться код внутри filter.watch после майнинга транзакции?
@kathi Вы не должны менять код контракта только потому, что это упрощает написание пользовательского интерфейса. Основной код контракта должен содержать только основную бизнес-логику.