Contract-Deployment

如何為要部署的智能合約生成虛榮地址?

  • October 19, 2020

我知道為普通帳戶生成虛地址的可能性。但是,如何為外部擁有的賬戶(託管智能合約)生成虛名地址?

我問是因為乙太坊名稱服務(ENS) 部署在0x112234455c3a32fd11230c42e7bccd4a84e02010 (Ropsten) 上。

生成虛地址是一個簡單的試錯過程,同樣的過程可以用於搜尋具有其他屬性的帳戶。

合約地址由創建賬戶的賬戶及其 nonce 決定——具體來說,它們是這兩個值的 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 作為Kolmogorov Complexity的粗略估計,因為具有許多重複的地址將壓縮得更小。

當然,您可以將適應度函式替換為您想要的任何東西 - 為了生成最終用於 ENS 系統資料庫的地址,我使用了一個函式,該函式根據地址開始時嚴格遞增的數字的數量對地址進行評級。

引用自:https://ethereum.stackexchange.com/questions/10241