Как найти ошибку вложенного вызова в успешной транзакции Ethereum
Приложение может перехватить ошибку внутреннего вызова и успешно закончить внешнюю транзакцию. Дерево вызовов Geth помогает найти кадр, в котором произошёл откат.
Запросите трассировку с вложенными вызовами
На Geth с разрешённым debug-доступом вызовите debug_traceTransaction с хешем транзакции и параметрами ниже. Вложенные вызовы должны быть включены. Прочитайте корневой кадр и рекурсивно проверьте элементы calls.
{"tracer":"callTracer","tracerConfig":{"onlyTopCall":false}}
Предположим, корень завершился без ошибки, а его второй дочерний кадр содержит error и байты отката в output. Запишите тип вызова, адрес назначения и селектор из входных данных дочернего кадра. Так вы найдёте неудачную попытку, которую обработал родитель.
Восстановите контекст исполнения
В кадре DELEGATECALL код одного адреса может обращаться к хранилищу другого. Учитывайте родительские кадры при разборе изменений состояния. У RPC может отсутствовать старое состояние для воспроизведения, либо сервер ограничивает трассировки по ресурсам. geth.ethereum.org Geth callTracer