Могу ли я развернуть контракт на произвольный адрес, который я выберу?

Если я хочу создать смарт-контракт, выполнив необработанный tx, обязательно ли вычислять новый адрес контракта так, как он был определен , или я могу выбрать свой собственный адрес произвольно? Почему?

Ответы (1)

Контракты не могут быть развернуты на произвольный указанный пользователем адрес.

Новые контракты создаются опкодом CREATE в EVM, который реализует правила и не имеет параметра для адреса нового контракта.

Вероятно, основная причина такого поведения заключается в том, чтобы избежать конфликтов между адресами. Кто-то не должен иметь возможность перезаписать контракт, который уже развернут по адресу: довольно много проблем с пользовательским интерфейсом и безопасностью по этому поводу. (В действительности, как и в случае коллизии хэшей, крайне мала вероятность того, что две учетные записи в конечном итоге создадут контракт по одному и тому же адресу.)

Есть другие причины. Например, если бы люди могли размещать контракты на определенные «неиспользуемые» адреса, все могли бы использовать легко читаемые адреса, злоумышленники могли бы использовать адреса, похожие на такие адреса. И пользователи, распределяющие контракты по адресам, могут как случайно, так и злонамеренно разбалансировать базовые структуры данных в Ethereum (аналогично этой «атаке на хранилище» , которая смягчается ).

Разве адрес контракта не генерируется из фактического шестнадцатеричного кода самого контракта (среди прочего)? Это правда, что вы не можете указать адрес, но я не думаю, что это из-за приведенных причин.
@ThomasJayRush Адрес нового контракта не зависит от кода контракта: он просто зависит от адреса учетной записи «создателя» и одноразового номера.