Blueprints
在 Cipherem 中构建代币
在本指南中,我们将在以太坊代币规范中概述的原则指导下,使用 Cipherem 协议中的 Solidity 来铸造代币。
创建代币的两种方法:
1- 使用代币模板:
- 转到 Remix IDE。
- 在 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 指令选择正确的编译器版本,然后编译:
部署合同
切换到“部署和运行事务”选项卡,选择 “Injected Web3” 作为环境,使 Remix 使用您的 Metamask 帐户作为签名人。