Лучшая практика: как обработать 120-секундный таймаут контрактных обратных вызовов?
С трюфелем мы получаем хорошую упаковку для контрактов. Но у него есть одна особенность, заставляющая меня болеть:
Пример из документации:
MetaCoin.at(contract_address).then(function(instance) {
coin = instance;
return coin.sendCoin(account_two, 3, {from: account_one});
}).then(function(result) {
// This code block will not be executed until truffle-contract has verified
// the transaction has been processed and it is included in a mined block.
// truffle-contract will error if the transaction hasn't been processed in 120 seconds.
})
Это поднимает четыре вопроса:
- Как предотвратить получение пользователем тайм-аута в 120 секунд, так как его транзакция все еще может быть добыта пару минут спустя (в зависимости от цены на газ и условий сети)? Это особенно важно, если мы говорим о транзакциях отправки эфира. Я не хочу грабить своих пользователей, утверждая, что транзакция не удалась (и предлагая им повторить).
- Где будет ошибка? В обратном вызове со вторым параметром (
function(result, error)
) или все это (.then( function(result) {...} ).catch(e)
)? Я не могу проверить это локально с Ganache. - Как вы информируете своих пользователей о статусе транзакции? Отображаете ли вы "Транзакция успешна" в любом случае, или вы используете какой-то пульсатор (это то, что я сейчас рассматриваю) в течение этого 120-секундного периода?
- Как получить TX-хэш как можно быстрее? Отправляя с помощью MEW, я немедленно получаю ссылку на транзакцию на etherscan.io - даже если транзакция еще не распространена.
Особенно проблема № 1 вызывает у меня головную боль.
С уважением
1 ответ
Тайм-аут - вещь исключительно трюфельная. В сети не истекает время ожидания, и при разработке приложения с web3 или подобными обертками вы просто продолжаете слушать, пока tx не станет майнером, или страница не закроется.
Когда вы совершаете транзакцию в web3, вы получите txhash как часть ответа, даже до того, как он будет добыт. Вы можете отобразить это пользователю вместе с ожидающим статусом и использовать фильтры Web3, чтобы установить прослушиватель для обратного вызова при его добыче, не сталкиваясь с проблемами тайм-аута.