Contract-Deployment
如何為要部署的智能合約生成虛榮地址?
我知道為普通帳戶生成虛地址的可能性。但是,如何為外部擁有的賬戶(託管智能合約)生成虛名地址?
我問是因為乙太坊名稱服務(ENS) 部署在0x112234455c3a32fd11230c42e7bccd4a84e02010 (Ropsten) 上。
生成虛地址是一個簡單的試錯過程,同樣的過程可以用於搜尋具有其他屬性的帳戶。
合約地址由創建賬戶的賬戶及其 nonce 決定——具體來說,它們是這兩個值的 RLP 編碼的雜湊值。因此,您可以搜尋一個生成虛榮合約地址的帳戶,如下所示:
- 生成隨機私鑰
- 導出其公鑰和地址
- 從其地址和零隨機數推導出它將創建的第一個合約的地址
- 從 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 系統資料庫的地址,我使用了一個函式,該函式根據地址開始時嚴格遞增的數字的數量對地址進行評級。