Отлов ошибок с газовыми проблемами

Я работаю над интерфейсом, где использую try/catch для поиска ошибок и предоставления пользователям соответствующих сообщений. Мой смарт-контракт имеет платную функцию, и я был на грани обнаружения ошибок, связанных с использованием газа.

uint[] public theArray;




function myFunction(uint bigNumber) payable public {
         if(msg.value == 0.01 ether){
         theArray.push(bigNumber);}
else {if (msg.value == .05 ether){
            for (int i; i<50;i++)
            theArray.push(bigNumber);

        }
else { 
    revert();
}
}}

Теперь, когда я пытаюсь поймать ошибки, одна и та же ошибка может иметь два разных «вывода» (err.message). Примеры:

Использование MetaMask в тестовой сети Rinkeby

Если я отправлю 0,05 ETH с 21 000 газа или даже 21 001 (минимальная сумма), я получаю сообщение об ошибке:

Возвращаемая ошибка: Ошибка: Ошибка: [ethjs-rpc] ошибка rpc с полезной нагрузкой

Однако, если я отправлю 0,05 ETH с 25 000 газа (недостаточно газа, поэтому он все равно не работает), я получаю сообщение об ошибке:

Транзакция была отменена EVM

Может ли кто-нибудь объяснить мне, почему, если я увеличу количество газа, ошибка изменится?

Еще одна вещь, которую я заметил, это то, что если я отправлю недопустимую сумму, например 0,04, я также получаю

Транзакция была отменена EVM

Ответы (1)

Основываясь на моем наблюдении и понимании. Возможно, это не лучшее объяснение.

  1. Если я отправлю 0,05 ETH с 21 000 газа или даже 21 001 (минимальная сумма), я получаю сообщение об ошибке:

    Возвращаемая ошибка: Ошибка: Ошибка: [ethjs-rpc] ошибка rpc с полезной нагрузкой

-Для этой ошибки это могло быть из-за самой метамаски, возможно, игра с gasPrice и/или gasLimit. Вы можете обратиться сюда или сюда для лучшего понимания.


  1. Однако, если я отправлю 0,05 ETH с 25 000 газа (недостаточно газа, поэтому он все равно не работает), я получаю сообщение об ошибке:

Транзакция была отменена EVM

Может ли кто-нибудь объяснить мне, почему, если я увеличу количество газа, ошибка изменится?

-Для этой ошибки я запустил код и обнаружил, что возможной причиной является транзакция, которая происходит и продолжается. Параметры удовлетворяют этой части кода. Однако в середине процесса газ закончился, пока работает цикл for, который поглощает большую часть газа, который вы предоставили. Возможно, попробуйте увеличить лимит газа, и это будет добыто без ошибок.

if (msg.value == .05 ether){
        for (int i; i<50;i++)
        theArray.push(bigNumber);

    }

  1. Еще одна вещь, которую я заметил, это то, что если я отправлю недопустимую сумму, например 0,04, я также получаю

Транзакция была отменена EVM

В последнем сценарии параметр просто не удовлетворял ни одному условию, поэтому он идет прямо к последнему другому, который возвращает () его.

Большое спасибо. Я смотрю сейчас, чтобы понять больше о первой ошибке! По поводу второй ошибки знаю, что если увеличить газ, то сработает. Только что увидел, что он выдает другую ошибку, чем при отправке 21000, поэтому мне было любопытно, почему
То же самое. Я также хотел бы получить какой-то ответ с первой ошибкой, но на основе предоставленных мной ссылок это весьма вероятно из-за метамаски, я просто не уверен, почему именно.
Я отправил им электронное письмо. Я вернусь с обновлением, как только получу ответ