Я работаю над интерфейсом, где использую 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
Основываясь на моем наблюдении и понимании. Возможно, это не лучшее объяснение.
Возвращаемая ошибка: Ошибка: Ошибка: [ethjs-rpc] ошибка rpc с полезной нагрузкой
-Для этой ошибки это могло быть из-за самой метамаски, возможно, игра с gasPrice и/или gasLimit. Вы можете обратиться сюда или сюда для лучшего понимания.
Транзакция была отменена EVM
Может ли кто-нибудь объяснить мне, почему, если я увеличу количество газа, ошибка изменится?
-Для этой ошибки я запустил код и обнаружил, что возможной причиной является транзакция, которая происходит и продолжается. Параметры удовлетворяют этой части кода. Однако в середине процесса газ закончился, пока работает цикл for, который поглощает большую часть газа, который вы предоставили. Возможно, попробуйте увеличить лимит газа, и это будет добыто без ошибок.
if (msg.value == .05 ether){
for (int i; i<50;i++)
theArray.push(bigNumber);
}
Транзакция была отменена EVM
В последнем сценарии параметр просто не удовлетворял ни одному условию, поэтому он идет прямо к последнему другому, который возвращает () его.
Юлиан
вие
Юлиан