Erc-20
我想鑄造 erc20 與儲存在我的數據庫中的值一樣多。像步驟
在我的應用程序中執行特定操作,我將儲存在數據庫中的令牌數量添加到該帳戶。
之後,我想將我的 erc20 鑄幣到該帳戶,其數量與數據庫中累積的數量一樣多。
在這種情況下,我需要兩件事。獲得鑄造所需氣體的使用者將支付費用,並且鑄造的氣體不會超過我數據庫中儲存的值。
此程式碼尚未經過測試,可能無法按我的預期工作。無論是否執行,請僅檢查其編寫的目的。
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import "./ERC20.sol"; import "./SafeMath.sol"; import "./Ownable.sol"; import "./ERC20Burnable.sol"; import "./ERC20Pausable.sol"; contract TEST is ERC20,Ownable,ERC20Burnable,ERC20Pausable { using SafeMath for uint256; mapping(address => uint256) canMintCount; mapping(address => uint256) payedGas; constructor() ERC20("test","test") { } function mint(uint256 count) external payable{ require(canMintCount[msg.sender] <= count); require(payedGas[msg.sender] == msg.value); payable(owner()).transfer(msg.value); _mint(msg.sender, count); } function addMintCount(address user,uint256 count,uint256 gas) external onlyOwner { canMintCount[user] = canMintCount[user] + count; payedGas[user] = payedGas[user] + gas; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC20, ERC20Pausable) { super._beforeTokenTransfer(from, to, tokenId); } }
當使用者請求時,我的伺服器將數據庫值設為 0 並按該值呼叫 addMintCount。之後使用者呼叫 Mint
這種方法解決了鑄造的值比輸入數據庫的值多的問題。然而,出現了另外一個問題。
- 從使用者的角度來看,交易gas費和伺服器呼叫addMintCount時使用的gas費是分開支付的,所以使用者會覺得自己付出了很多。
- 如果使用者只使用向伺服器呼叫 addMintCount 的 API 並且不簽署 Mint 交易,我們將只使用煤氣費。
總的來說,請介紹一下你在我這種情況下使用的開源合約,或者告訴我如何解決以上兩種方法。
如果您已經將使用者有權鑄造的代幣數量儲存在您的應用程序數據庫中,那麼在智能合約中維護它也是一個浪費的步驟。如您所見,它需要單獨的交易和額外的氣體使用。
在這種情況下,我建議刪除 addMintCount 函式,只保留 mint 函式只能由所有者呼叫。當使用者想要獲得 ERC20 代幣時,您的數據庫維護的 mintCount 更新和代幣創建發生在同一個事務中。您甚至可以刪除 mintCount 變數和檢查,並在從您的應用程序呼叫 mint 函式時簡單地將它們作為參數傳遞。