Как узнать, является ли адрес Ethereum контрактом?

адресом в солидности может быть счет или контракт (или другие вещи, такие как транзакция). Когда у меня есть переменная x, содержащая адрес, как я могу проверить, является ли это контрактом или нет?

(Да, я читал глава о видах в doc)

4 ответов


Edit: солидность изменилась с тех пор, как этот ответ был впервые написан, @manuel-aráoz имеет правильный ответ.

в солидности нет способа проверить, является ли адрес контрактом. Одна из целей Ethereum заключается в том, чтобы люди и смарт-контракты рассматривались одинаково. Это ведет в будущее, где смарт-контракты легко взаимодействуют с людьми и другими контрактами. В будущем это может измениться , но пока произвольный адрес неоднозначен.


Да, вы можете, используя некоторый код сборки EVM, чтобы получить адрес ' размер кода:

function isContract(address addr) returns (bool) {
  uint size;
  assembly { size := extcodesize(addr) }
  return size > 0;
}

это не то, что вы можете запросить из контракта, используя солидность, но если вы просто хотите знать, содержит ли адрес код контракта или нет, вы можете проверить с помощью консоли geth или аналогично, например:

  > eth.getCode("0xbfb2e296d9cf3e593e79981235aed29ab9984c0f")

С шестнадцатеричной строкой (здесь 0xbfb2e296d9cf3e593e79981235aed29ab9984c0f) в качестве адреса, который вы хотите запросить. Это вернет байт-код, хранящийся по этому адресу.

вы также можете использовать блокчейн-сканер, чтобы найти исходный код контракта по этому адресу, для пример библиотека ecsol как показано на etherscan.io.


Что вы можете сделать, если у вас есть информация под рукой. Если адрес отправителя транзакций был пустым или незанятым, вы можете определить, является ли адрес контрактным счетом или счетом EOA (внешним счетом). т. е. при отправке транзакции create contract в сети адрес получения в транзакции равен null / не используется.

ссылка из github: https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions

Надежда эта помощь.