Как узнать, является ли адрес Ethereum контрактом?
Адрес в Solidity может быть учетной записью или договором (или другими вещами, такими как транзакция). Когда у меня есть переменная x, содержащая адрес, как я могу проверить, является ли это контрактом или нет?
(Да, я прочитал главу о типах в документе)
Ответы
Ответ 1
Изменение: твердость изменилась, так как этот ответ был впервые написан, @manuel-aráoz имеет правильный ответ.
Невозможно прочно проверить, является ли адрес контрактом. Одна из целей Ethereum заключается в том, чтобы люди и умные контракты были одинаковыми. Это ведет к будущему, когда интеллектуальные контракты легко взаимодействуют с людьми и другими контрактами. Это может измениться в будущем, но на данный момент произвольный адрес неоднозначен.
Ответ 2
Да, вы можете, используя некоторый код сборки EVM, получить адрес "размер кода:
function isContract(address addr) returns (bool) {
uint size;
assembly { size := extcodesize(addr) }
return size > 0;
}
Ответ 3
Это не то, что вы можете запросить из договора, используя Solidity, но если вы просто хотите узнать, имеет ли адрес код контракта или нет, вы можете проверить его с помощью консоли geth или аналогичного типа, например:
> eth.getCode("0xbfb2e296d9cf3e593e79981235aed29ab9984c0f")
с шестнадцатеричной строкой (здесь 0xbfb2e296d9cf3e593e79981235aed29ab9984c0f
) в качестве адреса, который вы хотите запросить. Это вернет байт-код, сохраненный по этому адресу.
Вы также можете использовать блок-сканер для поиска исходного кода контракта по этому адресу, например, библиотеки ecsol, как показано на etherscan.io.
Ответ 4
Что вы можете сделать, если у вас есть информация. Если адрес отправителя транзакций был нулевым или незанятым, вы можете указать, является ли адрес учетной записью контракта или EOA (внешняя учетная запись). т.е. при отправке транзакции создания контракта в сети, адрес приема в транзакции является нулевым/не используется.
Ссылка на github: https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions
Надеюсь это поможет.