¿Cómo generar una dirección personalizada para implementar un contrato inteligente?

Soy consciente de la posibilidad de generar direcciones personalizadas para cuentas normales. Sin embargo, ¿cómo es posible generar direcciones personalizadas para cuentas de propiedad externa (que alojan contratos inteligentes)?

Lo pregunto porque Ethereum Name Service (ENS) se implementó en 0x112234455c3a32fd11230c42e7bccd4a84e02010 (Ropsten).

Tal vez sea una pregunta muy obvia, pero ¿qué es una dirección de vanidad?
Este es un buen contrato de dirección de vanidad - etherscan.io/address/0xc0ffee0505d21342cd503bc57ed33fc2cec7f225 - encontrado en una lectura interesante (ficticia) - medium.com/@rtaylor30 /...

Respuestas (1)

Generar una dirección de vanidad es un proceso simple de prueba y error, y el mismo proceso se puede usar para buscar cuentas que tengan alguna otra propiedad.

Las direcciones de contrato están determinadas por la cuenta de la cuenta de creación y su nonce; específicamente, son el hash de la codificación RLP de esos dos valores. Por lo tanto, puede buscar una cuenta que genere una dirección de contrato de vanidad como esta:

  1. Generar una clave privada aleatoria
  2. Derivar su clave pública y dirección
  3. Derivar la dirección del primer contrato que crearía a partir de su dirección y un nonce de cero
  4. Repetir desde 1

Aquí hay un código simple que usa pyethereum para hacer esto:

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')

En este caso, busca direcciones con la mayor cantidad de ceros a la izquierda y las claves que comprimen menos, utilizando zlib como un estimador crudo de la complejidad de Kolmogorov , ya que las direcciones con muchas repeticiones se comprimirán más pequeñas.

Por supuesto, puede reemplazar la función de aptitud con cualquier cosa que desee: para generar la dirección que eventualmente se usará para el registro ENS, utilicé una función que calificó las direcciones según la cantidad de dígitos estrictamente incrementales con los que comenzaron.

I used a function that rated addresses based on how many strictly incrementing digits they started with.Siempre subestimo las longitudes a las que llegarán los codificadores por la novedad. Como, ¿no deberías estar arreglando errores o algo así? 😜 No obstante, esto es increíble y gracias por compartir.