Solidity

Solidity MINT ERC20

  • March 7, 2022

我會盡量簡短地回答我的疑問,下面我將放置一個智能合約模型,指的是我為我的遊戲創建的貨幣。

// 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 帶來的技術,我創建了一個,但是我仍然懷疑任何可能的安全問題:

使用 ECDSA 驗證智能合約內部的簽名

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