Если у меня вызывается функция в твердости, есть ли способ, которым функция может узнать, является ли msg.sender умным контрактом?
msg.sender
Я не думаю, что есть надежный способ определить, является ли msg.sender смартконтрактом, поскольку его можно взломать, выполнив вызовы от конструктора умного контракта.
Сторож 14-го уровня Этеренавта "Привратник"Два "об этом вопросе.См. Объяснение в: Ethernaut Lvl 14 Gatekeeper 2 Пошаговое руководство: как инициализируются контракты (и как выполнять побитовые операции)
extcodesize (отправитель) должен возвращать 0, если extcodesize является подпрограммойвнутри оригинальной функции конструктора контракта отправителя
Да, вы можете:
function isContract(address _address) returns (bool isContract){ uint32 size; assembly { size := extcodesize(_address) } return (size > 0); }