Как перехватить исключение Out of Gas в обратном вызове Oraclize и отобразить ошибку на интерфейсе децентрализованного приложения

У меня есть смарт-контракт, внутри которого я использовал Oraclize для получения отметки текущего времени. В нескольких случаях обратный вызов Oraclize завершается ошибкой из-за исключения «Нет газа». Как можно отловить этот сбой и отобразить сообщение об ошибке в интерфейсе моего децентрализованного приложения?

Я пробовал следующие варианты:

  1. Отслеживайте событие, чтобы поймать, возвращает ли Oraclize какое-либо значение или нет. В моем случае он возвращает текущую отметку времени и переходит к логике внутри функции обратного вызова. Так что здесь я не мог поймать исключение.
  2. Следите за вторым событием, которое запускается, когда вычисления с использованием временной метки, возвращенной Oraclize, завершены. Здесь также я не могу поймать исключение, так как у него кончается газ до достижения логики для запуска события успеха.

Насколько я понимаю, исключение отсутствия газа происходит между двумя вышеуказанными событиями, т.е. после отправки значения и до завершения обработки оно теряет весь газ.

Пожалуйста, помогите предложить предпочтительный способ обработки этой ошибки и связи с пользователем на стороне интерфейса.

В случае сбоя транзакции ни одно из событий не будет запущено.
тогда каков идеальный способ сообщить об этом пользователю во внешнем интерфейсе?
Можете ли вы показать мне неудачную транзакцию oraclize в etherscan?
извините, но я тестирую локально, используя Ganache. Below is error message : } [2018-08-17T11:55:47.960Z] INFO sending __callback tx... { "contract_myid": "0x58a88cebdf576344bff17f2caa61d373f7a3beb619f71538a6e58dbd017405d1", "contract_address": "0x98d9f9e8debd4a632682ba207670d2a5acd3c489" } [2018-08-17T11:55 :48.643Z] ERROR ошибка обратного вызова tx, контракт myid: 0x58a88cebdf576344bff17f2caa61d373f7a3beb619f71538a6e58dbd017405d1 { "message": "Исключение виртуальной машины при обработке транзакции: нет газа",
Я не понимаю, что не так? транзакция oraclize к вашему контракту? если да, то как вы тестируете это локально?
из функции обратного вызова oraclize я вызываю другую функцию, задачей которой является сохранение данных внутри сопоставлений в смарт-контракте. Oraclize отлично возвращает временную метку, но во время выполнения дополнительной логики внутри функции обратного вызова он заканчивает тем, что исчерпывает весь газ до завершения.

Ответы (1)

Решением этой проблемы является установка в вашем приложении в качестве обязательного количества газа минимума, необходимого для запуска функции без исчерпания газа.

Кроме того, если вызов не удался, вы можете просто проверить транзакции по вашему контракту в каждом блоке. Определите, какой из них от oraclize, и проверьте, не сработал он или нет.

Надеюсь это поможет

Я читал о вычислении количества газа перед вызовом функции, но не смог найти ни одного примера кода, который это делает. Не могли бы вы предоставить некоторые ссылки, которые я могу использовать?