Solidity
即使地址非零,由於地址為零,鑄造 ERC20 代幣也會失敗
我正在使用 OpenZeppelin 的 ERC20 合約建構 ERC20 代幣。我的令牌建構子如下所示:
constructor() ERC20( "Token", "TKN" ) Ownable() { require(msg.sender != address(0), "Cannot deploy from zero address"); _mint(msg.sender, 18000000000000); }
當我嘗試使用 truffle 將此合約部署到本地 Ganache 測試網時,我收到以下錯誤:
ERC20: mint to the zero address
經過進一步調查,我發現這個錯誤是在 OpenZeppelin 提供的 ERC20 合約內部拋出的。這就是我
require
在建構子中添加該語句的原因。奇怪的是,建構子沒有失敗,這意味著不是
msg.sender
零地址。那麼為什麼我不能鑄造代幣呢?(穩固性 ^0.8.0)
這個問題完全是我的錯:在我提供的範例中看不到一些程式碼,這些程式碼向區塊的礦工鑄造了少量的代幣。(不知道為什麼(很久以前))。
在區塊鏈上,這本來可以正常工作,但我在本地使用 truffle 的 Ganache 進行測試。由於 Ganache 只是一個測試區塊鏈,沒有礦工,因此
block.coinbase
通常與礦工地址對應的地址總是0
。
對我來說,如果我在建構子的開頭將 msg.sender 聲明為地址變數,它就可以工作
contract Test is ERC20{ address public OWNER; uint private _totalSupply = 500000; constructor() ERC20("Test Token ERC20", "T20"){ OWNER = msg.sender; _mint(OWNER, _totalSupply); } }