Contract-Deployment
如何部署以 0x000000000000(或其他前綴)開頭的合約
如何部署以 0x000000000000 開頭的合約,例如https://etherscan.io/address/0x0000000000007f150bd6f54c40a34d7c3d5e9f56
假設您想使用 truffle 部署合約,您將使用正常 CREATE。然後根據合約所有者的地址和該地址的交易計數確定合約地址。
因此,假設您想使用 truffle 部署 OpenZeppelin 可升級合約。公開可見的合約將在第四次交易中部署,因此您需要尋找第四次交易產生的合約地址。
同樣,如果您的合約不是可升級的而是一個簡單的合約,那麼您可能正在尋找第二筆交易,因為第一筆交易將是 Truffle Migrations 合約。
節點中的範常式式碼:
const rlp = require('rlp'); const keccak = require('keccak'); const web3 = require('web3'); var Accounts = require('web3-eth-accounts'); var accounts = new Accounts('ws://localhost:8546'); // Determine the contract address for a certain owner address and nonce value function calcContractAddress(addressObject) { let nonce = 0x00; address = addressObject.address; privateKey = addressObject.privateKey; // Add four to the nonce since we need to look for the fourth transaction nonce = nonce + 4; var nonceHex = "0x"+nonce.toString(16).padStart(16,'0'); var input_arr = [ address, nonce ]; var rlp_encoded = rlp.encode(input_arr); var contract_address_long = keccak('keccak256').update(rlp_encoded).digest('hex'); var contract_address = contract_address_long.substring(24); // Trim the first 24 characters. if ((contract_address.startsWith("000000000000"))) { console.log("contract_address with nonce "+nonce+": 0x" + contract_address+"\t address = "+address+", privateKey = "+privateKey); } } while (true) { addressObject = accounts.create("someRandomStuff"); calcContractAddress(addressObject); }
啟動它然後進行世界旅行,直到它找到一個地址……
使用這個乾淨的新地址開始 truffle 很重要,因為事務計數必須為零!否則你最終會得到一個完全不同的合約地址。