Wie generiert man eine Vanity-Adresse für einen Smart Contract, auf dem bereitgestellt werden soll?

Mir ist die Möglichkeit bekannt, Vanity-Adressen für normale Accounts zu generieren. Wie ist es jedoch möglich, Vanity-Adressen für externe Konten zu generieren (die Smart Contracts hosten)?

Ich frage, weil der Ethereum Name Service (ENS) auf 0x112234455c3a32fd11230c42e7bccd4a84e02010 (Ropsten) bereitgestellt wurde.

Vielleicht ist eine sehr offensichtliche Frage, aber was ist eine Vanity-Adresse?
Dies ist ein netter Vanity-Adressvertrag – etherscan.io/address/0xc0ffee0505d21342cd503bc57ed33fc2cec7f225 – gefunden in einer interessanten (fiktiven) Lektüre – medium.com/@rtaylor30/…

Antworten (1)

Das Generieren einer Vanity-Adresse ist ein einfacher Trial-and-Error-Prozess, und der gleiche Prozess kann verwendet werden, um nach Konten mit einem anderen Eigentum zu suchen.

Vertragsadressen werden durch das Konto des erstellenden Kontos und seine Nonce bestimmt – insbesondere sind sie der Hash der RLP-Codierung dieser beiden Werte. So können Sie nach einem Konto suchen, das eine Vanity-Vertragsadresse wie folgt generiert:

  1. Generieren Sie einen zufälligen privaten Schlüssel
  2. Leiten Sie seinen öffentlichen Schlüssel und seine Adresse ab
  3. Leiten Sie die Adresse des ersten Vertrags ab, den es erstellen würde, aus seiner Adresse und einer Nonce von Null
  4. Wiederholung ab 1

Hier ist ein einfacher Code, der Pyethereum verwendet, um dies zu tun:

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

In diesem Fall sucht es nach Adressen mit den meisten führenden Nullen und den Schlüsseln, die am kleinsten komprimiert werden – wobei zlib als grober Schätzer der Kolmogorov-Komplexität verwendet wird, da Adressen mit vielen Wiederholungen kleiner komprimiert werden.

Sie können die Fitnessfunktion natürlich durch alles ersetzen, was Sie möchten - um die Adresse zu generieren, die schließlich für die ENS-Registrierung verwendet wird, habe ich eine Funktion verwendet, die Adressen basierend darauf bewertet, wie viele streng aufsteigende Ziffern sie beginnen.

I used a function that rated addresses based on how many strictly incrementing digits they started with.Ich unterschätze immer die Längen, die Programmierer für Neuheiten aufwenden. Solltest du nicht Fehler beheben oder so etwas? 😜 Nichtsdestotrotz ist das erstaunlich und danke fürs Teilen.