Вы случайно наткнулись на одну из менее известных "особенностей" эфириума. На самом деле цепочка имеет несколько предварительно скомпилированных контрактов (Приложение E в желтой книге), один из которых имеет значение 0x0000000000000000000000000000000000000001
(ecrecover
контракт).
Ваша функция fail()
завершается с ошибкой из-за того, что для выполнения отката контракта ecrecover
потребуется больше, чем 2300 gas
, перенаправленное методом transfer
.
Адрес 0x0
не является специальным контрактом, поэтому обычный вызов на переадресацию работает нормально, как и с любым другим адресом.