Прислал Лео (наш гость на последнем семинаре про работу). Имеется функция
external, в которой есть буквально вот такая проверка:
require(msg.sender == address(this), "...")
Казалось бы, странно. Как может быть вызывающим сам контракт, если такую функцию можно вызвать извне, но никак не изнутри кода? В простом случае, действительно, никак, но если очень хочется, то можно. В принципе, постоянные зрители канала знают в чём дело.
В частности, можно сделать
call и просто обратится к самому контракту, в духе
address(this).call()
И тогда даже функция external вполне себе вызывается. 😄 Ну, в Ruby мы бы использовали
send, чтобы вызвать закрытый метод - аналогичная история.
Впрочем, таким "хаком" пользоваться постоянно не стоит, так как раз уж вы пометили функцию как external, то, видимо, имели какие-то намерения. Если уж она нужна внутри контракта, то проще написать public