Solidity
Solidity MINT ERC20
我會盡量簡短地回答我的疑問,下面我將放置一個智能合約模型,指的是我為我的遊戲創建的貨幣。
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; contract SATOKCoin is ERC20, ERC20Burnable, Pausable, AccessControl, Ownable { using SafeMath for uint256; bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); constructor() ERC20("TOK COIN", "TOK") { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(PAUSER_ROLE, msg.sender); _mint(msg.sender, 100000 * 10 ** decimals()); _setupRole(MINTER_ROLE, msg.sender); } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { _mint(to, amount); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal whenNotPaused override { super._beforeTokenTransfer(from, to, amount); } }
幣將用於網頁遊戲,我的疑惑如下……
玩家的行為會產生獎勵,這些獎勵將“虛擬”保存在我的數據庫中(鏈下)。在某個時候,玩家將能夠兌換他擁有的價值,那一刻我需要將我的代幣的價值 X 轉移給他(上面的程式碼),在懷疑之下。
第一個疑問
- 最簡單的方法是使用“鑄幣”選項,從而直接為呼叫玩家(msg.sender)鑄幣?或者
- 使用“轉移”選項,從而將您在合約中的價值轉移到玩家的錢包(msg.sender)?
第二個疑問關於安全性,我如何確保在傳輸令牌時,函式中傳遞的值與玩家在我的數據庫(鏈下)中的值相同?此時我確定有Oracle,但是我找不到方法,不知道在執行token轉移到玩家錢包之前是否有可能在oracle中進行查詢,這可能嗎? 如果有可能有人可以給我一個實踐程式碼的例子嗎?
感謝幫助。
要完成這些屬性,您可以在鏈下生成金額和收件人地址的簽名。然後合約將在執行鑄幣之前驗證簽名是否有效。
@Crazy,使用@Ismael 帶來的技術,我創建了一個,但是我仍然懷疑任何可能的安全問題: