Blueprints

在 Cipherem 中构建代币

在本指南中,我们将在以太坊代币规范中概述的原则指导下,使用 Cipherem 协议中的 Solidity 来铸造代币。

编译代币

创建代币的两种方法:

1- 使用代币模板:

  1. 转到 Remix IDE
  2. OpenZeppelin Wizard 中使用或构建一个代币模板,以创建一个已定义所有处理程序和状态的代币。这是创建代币的最简单方法。加载模板后,您将能够自定义这些处理程序和状态。

2- 从零开始构建:

以下指南将指导您完成从零开始创建代币的过程。这是一种更高级的创建代币的方法,但它将使您更好地了解代币的工作方式。

准备工作

步骤1:初始化代币

  • 打开 Remix IDE 并创建一个名为 MyToken.sol 的新文件。
  • 在 MyToken.sol 中,初始化代币的状态,定义其余额、名称、交易代码等:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MyToken {
    string public name = "My Token";
    string public symbol = "MTK";
    uint8 public decimals = 18;
    uint256 public totalSupply = 1000000 * 10 ** uint256(decimals);
    mapping(address => uint256) public balanceOf;

    constructor() {
        balanceOf[msg.sender] = totalSupply;
    }
}

让我们来分析一下我们在这里所做的工作:


  • pragma solidity ^0.8.0;: 指定Solidity编译器版本。
  • string public name = "My Token";: 设置代币的名称。
  • string public symbol = "MTK";: 设置代币的交易代码。
  • uint8 public decimals = 18;: 定义小数位数。
  • uint256 public totalSupply = 1000000 * 10 ** uint256(decimals);: 设置代币的总供应量。
  • mapping(address => uint256) public balanceOf;: 创建用于跟踪平衡的映射。
  • constructor() { balanceOf[msg.sender] = totalSupply; }: 将整个代币供应分配给合约创建者。

步骤2:传输功能

现在,让我们添加一个功能来处理代币传输。

function transfer(address _to, uint256 _value) public returns (bool success) {
    require(_to != address(0), "Invalid address");
    require(balanceOf[msg.sender] >= _value, "Insufficient balance");
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
    emit Transfer(msg.sender, _to, _value);
    return true;
}

event Transfer(address indexed _from, address indexed _to, uint256 _value);

此功能检查发送人的余额,如果有足够的余额,则将代币传输给收件人。

步骤3:铸造功能

接下来,我们将添加一个功能来铸造新的代币。

function mint(uint256 _amount) public {
    totalSupply += _amount;
    balanceOf[msg.sender] += _amount;
    emit Transfer(address(0), msg.sender, _amount);
}

此功能允许合约所有者铸造新代币,从而增加总供应量。

步骤4:批准和转移功能

对于更高级的代币管理,我们将添加允许批准转账的功能。

mapping(address => mapping(address => uint256)) public allowance;

function approve(address _spender, uint256 _value) public returns (bool success) {
    allowance[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
}

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
    require(_to != address(0), "Invalid address");
    require(balanceOf[_from] >= _value, "Insufficient balance");
    require(allowance[_from][msg.sender] >= _value, "Allowance exceeded");
    balanceOf[_from] -= _value;
    balanceOf[_to] += _value;
    allowance[_from][msg.sender] -= _value;
    emit Transfer(_from, _to, _value);
    return true;
}

event Approval(address indexed _owner, address indexed _spender, uint256 _value);

这些功能允许用户批准他人代表他们花费代币。

编译合同

移动到左侧导航栏中的 “Solidity Compiler” 选项卡,根据合同中的 pragma 指令选择正确的编译器版本,然后编译:

Compile Token

部署合同

切换到“部署和运行事务”选项卡,选择 “Injected Web3” 作为环境,使 Remix 使用您的 Metamask 帐户作为签名人。


Copyright © 2024