Contract-Deployment

如何部署以 0x000000000000(或其他前綴)開頭的合約

  • November 16, 2021

如何部署以 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 很重要,因為事務計數必須為零!否則你最終會得到一個完全不同的合約地址。

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