Можно ли по адресу учетной записи определить, является ли учетная запись контрактной учетной записью или внешним контрактом?

Я пытаюсь визуализировать транзакции для Ethereum, в настоящее время я знаю, что есть обозреватели блокчейнов, такие как Etherscan.io и Etherchain.org , однако я не хочу продолжать вызывать их API для получения данных, а использовать свой собственный полный узел для получения все данные, которые мне нужны, поскольку они дают мне больший контроль.

Поэтому я настроил полный узел и использую библиотеку Web3JS для получения блоков и транзакций. Однако у Web3JS нет возможности получить учетную запись по указанному адресу (если я не ошибаюсь). Итак, когда у меня есть объект транзакции, я могу выяснить, кто является отправителем и получателем, но я также хочу знать, является ли отправитель или получатель договором или учетной записью. Я знаю, что через API etherchain мы можем получить учетные записи, используя адрес, возможно ли сделать то же самое, используя geth и Web3Js?

В желтой книге Ethereum упоминается, что у каждой учетной записи есть nonce, balance, storageHash и codeHash, поэтому я подумал, что можно будет получить учетную запись, используя адреса из блокчейна. Пожалуйста, помогите нам разобраться, как определить, является ли данный адрес контрактом или учетной записью, не используя упомянутые выше обозреватели блокчейнов?

Ответы (1)

Нет , по одному только адресу невозможно определить, является ли это контрактной учетной записью или внешней учетной записью.

См. этот предыдущий пост о том, как генерируются адреса контрактов:

Более того, ожидается, что в конечном итоге все учетные записи будут контрактами (это называется абстракцией учетных записей ):

Вы можете использовать функцию web3.js, web3.eth.getCodeчтобы получить байт-код EVM, связанный с адресом. Предполагается, что для сторонних аккаунтов он вернет 0x0.

Спасибо, это была нотация, которую я заметил в etherchain и планировал сделать.
Хотя существует концепция внешней учетной записи, она всегда будет возвращать 0x0 для web3.eth.getCode. (Но 0x0 может также означать учетную запись, для которой еще не был развернут контракт, поэтому этот комментарий согласуется с этим ответом. Таким образом, в зависимости от того, насколько строгим вы хотите быть, проверка возвращаемого значения getCode может быть достаточным приближением .)
Меня смущает предыдущий комментарий. Если контракт еще не развернут по адресу, то это не контракт. В этом смысле мне кажется, что если getCodeвозвращает 0x0, то этот адрес явно не контрактный. Предположительно, ОП задает вопрос, потому что он/она хочет знать, является ли адрес, который взаимодействовал с его/ее децентрализованным приложением, контрактом (и, возможно, ведет себя по-другому). Если с ним уже взаимодействовали, а getCode возвращает 0x0, не правда ли, что это не контракт (и никогда не будет)? Я не говорю, что это так, я просто смущен предыдущим комментарием.