Contract-Development
了解合約的地址(當它們部署兩次時)
我只是有一個關於契約地址的快速問題。
如果我想簽訂合約轉移代幣,我如何獲得我想要的代幣的正確地址?
對於範例:
function transfer() external { address a = address(MyToken_ERC20()); MyToken_ERC20 token = MyToken_ERC20(a); token.transfer(msg.sender, 100); }
如果我兩次部署“MyToken_ERC20”,就會有兩個令牌地址,對嗎?如果是的話……我怎樣才能確保我得到了正確的地址,只有通過將地址硬編碼到我的新契約中?
- 如果我兩次部署“MyToken_ERC20”,就會有兩個令牌地址,對嗎?
是的。每次部署合約時,都會生成一個新地址,並獲得一個新的合約,該合約的儲存空間與之前的不同。例如,如果您部署兩次相同的 erc20 合約,您將獲得兩個不同的代幣。
- 我怎樣才能確保我得到了正確的地址,只有通過將地址硬編碼到我的新契約中?
不可能對合約的地址進行硬編碼,因為它是以確定的方式生成的(參見乙太坊合約的地址是如何計算的?)。
有很多方法可以獲取新部署合約的正確地址。如果您使用 Truffle,該地址會在部署時在日誌中顯示。對於自定義腳本,您可以使用此 web3 事件:(
.on('receipt', function(receipt) { console.log(receipt.contractAddress) // contains the new contract address })
參見https://web3js.readthedocs.io/en/v1.2.7/web3-eth-contract.html#deploy)。另一種方法是簡單地檢查您的交易記錄,尋找負責部署的交易(例如在 Etherscan 上)。