前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solidity:ERC20

Solidity:ERC20

作者头像
孟斯特
发布2024-06-11 18:54:54
930
发布2024-06-11 18:54:54
举报
文章被收录于专栏:code人生code人生

简介

ERC20是以太坊区块链上的一个标准,用于创建和发行智能合约,实现代币化的应用。它定义了一组通用的接口,使得开发者可以创建和使用代币,而不需要了解底层区块链技术的细节。以下是ERC20标准中的主要接口及其含义:

1.name(): 返回代币的名称。2.symbol(): 返回代币的符号,通常是代币名称的缩写。3.decimals(): 返回代币的小数位数,用于表示代币的精度。4.totalSupply(): 返回代币的总供应量。5.balanceOf(address _owner): 返回指定地址的代币余额。6.transfer(address _to, uint256 _value): 将指定数量的代币从调用者的地址发送到另一个地址。7.transferFrom(address _from, address _to, uint256 _value): 从一个地址发送指定数量的代币到另一个地址,需要发送者已经授权调用者进行转账。8.approve(address _spender, uint256 _value): 允许指定地址从调用者的地址转移指定数量的代币。9.allowance(address _owner, address _spender): 查询指定地址被允许从另一个地址转移的代币数量。

以下是一个简单的ERC20代币示例合约,使用Solidity编写:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
        _mint(msg.sender, initialSupply);
    }
}

在这个示例中,我们使用了OpenZeppelin库中的ERC20合约,继承了它的功能。我们定义了一个名为MyToken的合约,它接受一个initialSupply参数,表示代币的初始供应量。在构造函数中,我们调用了_mint函数,将初始供应量的代币发送到部署者的地址。这个合约还定义了代币的名称为"MyToken",符号为"MTK"。

要使用这个合约,你需要安装Solidity编译器和相关的开发工具,如Truffle或Hardhat,并且需要部署到以太坊网络上。部署后,你可以使用这个合约创建和发行自己的代币。

自定义ERC20合约

要自己实现ERC20相关的接口,需要遵循ERC20标准,并使用Solidity编写智能合约。以下是一个简单的ERC20代币示例合约,使用Solidity编写,实现了ERC20标准中的主要接口:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract MyToken {
    // 存储每个地址的代币余额
    mapping(address => uint256) private _balances;

    // 存储允许发送者从所有者地址转移的代币数量
    mapping(address => mapping(address => uint256)) private _allowances;

    // 代币的名称
    string private _name;

    // 代币的符号
    string private _symbol;

    // 代币的小数位数
    uint8 private _decimals;

    // 代币的总供应量
    uint256 private _totalSupply;

    // 转账事件
    event Transfer(address indexed from, address indexed to, uint256 value);

    // 授权事件
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // 构造函数,设置代币的名称、符号和小数位数,并将初始供应量的代币发送到部署者的地址
    constructor(string memory name_, string memory symbol_, uint8 decimals_, uint256 initialSupply) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
        _totalSupply = initialSupply;
        _balances[msg.sender] = initialSupply;
        emit Transfer(address(0), msg.sender, initialSupply);
    }

    // 返回代币的名称
    function name() public view returns (string memory) {
        return _name;
    }

    // 返回代币的符号
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    // 返回代币的小数位数
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    // 返回代币的总供应量
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    // 返回指定地址的代币余额
    function balanceOf(address owner) public view returns (uint256) {
        return _balances[owner];
    }

    // 将指定数量的代币从调用者的地址发送到另一个地址
    function transfer(address to, uint256 value) public returns (bool) {
        require(_balances[msg.sender] >= value, "Insufficient balance");
        _balances[msg.sender] -= value;
        _balances[to] += value;
        emit Transfer(msg.sender, to, value);
        return true;
    }

    // 从一个地址发送指定数量的代币到另一个地址,需要发送者已经授权调用者进行转账
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        require(_balances[from] >= value, "Insufficient balance");
        require(_allowances[from][msg.sender] >= value, "Insufficient allowance");
        _balances[from] -= value;
        _balances[to] += value;
        _allowances[from][msg.sender] -= value;
        emit Transfer(from, to, value);
        return true;
    }

    // 允许指定地址从调用者的地址转移指定数量的代币
    function approve(address spender, uint256 value) public returns (bool) {
        _allowances[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    // 查询指定地址被允许从另一个地址转移的代币数量
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
}

在这个示例中,我们定义了一个名为MyToken的合约,实现了ERC20标准中的主要接口。在实际使用中,可以根据自己的需求修改这个合约,例如添加额外的功能或限制。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[1]进行许可,使用时请注明出处。 Author: mengbin[2] blog: mengbin[3] Github: mengbin92[4] cnblogs: 恋水无意[5] 腾讯云开发者社区:孟斯特[6]

References

[1] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [2] mengbin: mengbin1992@outlook.com [3] mengbin: https://mengbin.top [4] mengbin92: https://mengbin92.github.io/ [5] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/ [6] 孟斯特: https://cloud.tencent.com/developer/user/6649301

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孟斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 自定义ERC20合约
    • References
    相关产品与服务
    云开发 CloudBase
    云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档