Contract-Development

查看合約創建參數

  • July 19, 2022

我正在嘗試在此找到契約創建參數:https ://rinkeby.etherscan.io/address/0xdbc4949a84cd92c482af74d8813c13588e466841#code

但是我在etherscan上找不到它,我在哪裡可以找到它?

例如,在 Ethernaut Level 8 中,傳入了一個密碼,https ://ethernaut.openzeppelin.com/level/0xf94b476063B6379A3c8b6C836efB8B3e10eDe188 。如果我能夠查看傳遞給建構子的參數,我會找到密碼。

固態變數儲存在儲存槽中,因此如果您知道它的槽,您甚至可以讀取私有變數。在您的上下文中,契約已經過驗證,因此很容易知道password第二個插槽。之後,您可以使用任何庫如:web3js、ethersjs 來讀取區塊鏈並解碼密碼。這是我閱讀password您提供的契約的程式碼:

const ethers = require("ethers");
const AlchemyApiKey = "Your Alchemy's API key"
const provider = new ethers.providers.AlchemyProvider("rinkeby", 
AlchemyApiKey)

//Contract address of you to read
const contractAddress = "0xdbC4949a84cd92c482AF74D8813c13588E466841"

const hexToAscii = (_hex) => {
   const hex = _hex.toString();
   let str = ''
   for (let i = 0; i < hex.length; i += 2) {
       str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
   }
   return str;
}

async function main() {
   //The storage slot you want to read
   const storageSlot = 1;
   const storage = await provider.getStorageAt(contractAddress, storageSlot)
   res = hexToAscii(storage)
   console.log(res);
}

main().catch((error) => {
   console.error(error);
   process.exitCode = 1;
});

執行上面的程式碼後,我得到了passwordis A very strong secret password :)。您可以自己嘗試並用您的Alchemy api 密鑰替換 API 密鑰。我參考了Medium上的這篇文章,你可以閱讀更多關於它的資訊。還可以在此處閱讀有關儲存槽的 Solidity 文件。

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