Как сгенерировать тщеславный адрес для развертывания смарт-контракта?

Мне известно о возможности генерировать тщеславные адреса для обычных учетных записей. Однако как можно генерировать тщеславные адреса для внешних учетных записей (которые содержат смарт-контракты)?

Я спрашиваю, потому что служба имен Ethereum (ENS) была развернута на 0x112234455c3a32fd11230c42e7bccd4a84e02010 (Ropsten).

Может быть, это очень очевидный вопрос, но что такое тщеславный адрес?
Это хороший контракт на тщеславный адрес — etherscan.io/address/0xc0ffee0505d21342cd503bc57ed33fc2cec7f225 — найден в интересном (вымышленном) чтении — medium.com/@rtaylor30/…

Ответы (1)

Генерация тщеславия — это простой процесс проб и ошибок, и тот же процесс можно использовать для поиска учетных записей, имеющих какое-либо другое свойство.

Адреса контрактов определяются учетной записью создающей учетной записи и ее одноразовым номером — в частности, они представляют собой хэш кодирования RLP этих двух значений. Таким образом, вы можете искать учетную запись, которая генерирует тщеславный адрес контракта, например:

  1. Сгенерировать случайный закрытый ключ
  2. Получить его открытый ключ и адрес
  3. Получите адрес первого контракта, который он создаст, из его адреса и одноразового номера, равного нулю.
  4. Повторить с 1

Вот простой код, который использует pyethereum для этого:

import os
from ethereum.keys import privtoaddr
from ethereum.utils import mk_contract_address
import zlib

smallest = None
keys = {}
while True:
  privkey = os.urandom(32)
  addr = privtoaddr(privkey)
  contractaddr = mk_contract_address(addr, 0).encode('hex')
  compressedsize = len(zlib.compress(contractaddr, 9))
  if compressedsize <= 42:
    print "0x%s: %d" % (contractaddr, compressedsize)
    keys[contractaddr] = privkey.encode('hex')
  if smallest is None or long(contractaddr, 16) < long(smallest, 16):
    smallest = contractaddr
    print "0x%s" % smallest
    keys[contractaddr] = privkey.encode('hex')

В этом случае он ищет адреса с наибольшим количеством ведущих нулей и ключи, сжимающие наименьшее — используя zlib в качестве грубой оценки Колмогоровской сложности , поскольку адреса с большим количеством повторений будут сжиматься меньше.

Конечно, вы можете заменить фитнес-функцию чем угодно — чтобы сгенерировать адрес, который в конечном итоге будет использоваться для реестра ENS, я использовал функцию, которая оценивает адреса на основе того, с какого числа строго возрастающих цифр они начинаются.

I used a function that rated addresses based on how many strictly incrementing digits they started with.Я всегда недооцениваю то, на что готовы пойти кодеры ради новизны. Например, разве вы не должны исправлять ошибки или что-то в этом роде? 😜 Тем не менее, это потрясающе, и спасибо, что поделились.