ERC20 解读

2024-01-22 22:28
文章标签 解读 erc20

本文主要是介绍ERC20 解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.ERC20

什么叫做代币?

代币可以在以太坊中表示任何东西:

  • 在线平台中的信誉积分
  • 游戏中一个角色的技能
  • 彩票卷
  • 金融资产类似于公司股份的资产
  • 像美元一样的法定货币
  • 一盎司黄金
  • 及更多...

以太坊的这种强大特点必须以强有力的标准来处理,对吗? 这正是 ERC-20 发挥其作用的地方! 此标准允许开发者构建可与其他产品和服务互相操作的代币应用程序。

什么是 ERC-20?

ERC-20 提出了一个同质化代币的标准,换句话说,它们具有一种属性,使得每个代币都与另一个代币(在类型和价值上)完全相同。 例如,一个 ERC-20 代币就像以太币一样,意味着一个代币会并永远会与其他代币一样。

ERC-20(以太坊意见征求 20)由 Fabian Vogelsteller 提出于 2015 年 11 月。这是一个能实现智能合约中代币的应用程序接口标准。

ERC-20 的功能示例包括:

  • 将代币从一个帐户转到另一个帐户
  • 获取帐户的当前代币余额
  • 获取网络上可用代币的总供应量
  • 批准一个帐户中一定的代币金额由第三方帐户使用

如果智能合约实施了下列方法和事件,它可以被称为 ERC-20 代币合约,一旦部署,将负责跟踪以太坊上创建的代币。

上面是官方的说法, 代币嘛,比如游戏:我们用金钱充值,经过一定换算,人民币对应的换算游戏的货币。这些游戏货币就是代币。

当然,只是打个比方,代币更多还是区块链所属的概念。

当然简单的来讲:

ERC20是以太坊定义的一个合约接口规范,符合该规范的合约被称为以太坊代币。

1.这是以太坊官方给的ERC20接口合约标准:

方法

function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

 事件

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

我们就围绕ERC20自己写个代币合约。

顺便在代码注释出讲解相应功能。

2.自己写一个ERC20合约实现

1.ERC20

pragma solidity  ^0.4.25;interface ERC20 {// 返回代币名称function name()public view returns (string memory);    // 返回代币符号function symbol()public view returns (string memory);// 返回代币小数点后位数function decimals()public view returns (uint8);// 总代币数量function totalSupply()public view returns (uint256);// 返回 _owner 地址拥有的代币数量。function balanceOf(address _owner)public view returns (uint256 balance);// 将 value 数量的代币发送给 to 地址,返回布尔值告知是否执行成功。触发 Transfer 事件。function transfer(address _to, uint256 _value)public returns (bool success);// 将 value 数量的代币从 from 地址发送到 to 地址,返回布尔值告知是否执行成功。触发 Transfer 事件。function transferFrom(address _from, address _to, uint256 _value)public returns (bool success);// 授权 spender 可以花费  value 数量的代币,返回布尔值告知是否执行成功。触发 Approval 事件。function approve(address _spender, uint256 _value)public returns (bool success);// 返回授权花费者 spender 通过 transferFrom 代表所有者花费的剩余代币数量。// 默认情况下为零。当 approve 和 transferFrom 被调用时,值将改变。function allowance(address _owner, address _spender)public view returns (uint256 remaining);event Transfer(address indexed _from, address indexed _to, uint256 _value);event Approval(address indexed _owner, address indexed _spender, uint256 _value);}   

2. Jzm20

pragma solidity  ^0.4.25;import './ERC20.sol';contract Jzm20 is ERC20 {///Filed///uint256 private _totalSupply;string private _symbol;// 地址余额mapping(address => uint256) private _balances;// 授权地址余额mapping(address => mapping(address => uint256)) private _allowances;///Function///constructor (string  symbol_) public {_symbol = symbol_;}function name() public view returns (string memory) {return "Jzm20";}   function symbol() public view returns (string memory){return _symbol;}function decimals() public view returns (uint8){return 18;}function totalSupply() public view returns (uint256){return _totalSupply;}function balanceOf(address _owner) public view returns (uint256 balance){balance =  _balances[_owner];}// 给指定owner地址创建value数量代币function mint(address _owner,uint256 _value) public {require(_owner != address(0),"Jzm20: owner address is not empty");_balances[_owner] = _value;_totalSupply = _sum(_totalSupply,_value);emit Transfer(address(0),_owner,_value);}function transfer(address _to, uint256 _value) public returns (bool success){address owner = msg.sender;_transfer(owner,_to,_value);success = true;}// 这个是给spender权限者使用的function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){address spender = msg.sender;uint256 approveBalance = allowance(_from,spender);require(approveBalance >= _value,"Jzm20:approve balance is Insufficient balance transfer");_transfer(_from,_to,_value);success = true;}function approve(address _spender, uint256 _value) public returns (bool success){address owner = msg.sender;require(_balances[owner] >= _value,"Jzm20:owner balance is not enough to value memory!");_allowances[msg.sender][_spender] = _sum( _allowances[msg.sender][_spender],_value);emit Approval(owner,_spender,_value);success = true;}   function allowance(address _owner, address _spender) public view returns (uint256 remaining){remaining = _allowances[_owner][_spender];}function _sum(uint256 a,uint256 b) private pure returns(uint256) {uint256  c = a + b;require(c >= a && c >= b,"Jm20:An arithmetic overflow has occurred");return c;}function _sub(uint256 a,uint256 b) private  pure returns(uint256) {uint256 c = a - b;require(c <= a,"Jm20:An arithmetic overflow Under has occurred");return c;}function _transfer( address _from, address _to, uint256 _value) private {require(_balances[_from] >= _value,"Jm20:owner balance is Insufficient balance transfer");require(_to != address(0),"Jm20:to can not be empty address!");_balances[_to] = _sum(_balances[_to],_value); _balances[_from] -= _sub(_balances[_from],_value);emit Transfer(_from,_to,_value);}
}

这篇关于ERC20 解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/634428

相关文章

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringCloud负载均衡spring-cloud-starter-loadbalancer解读

《SpringCloud负载均衡spring-cloud-starter-loadbalancer解读》:本文主要介绍SpringCloud负载均衡spring-cloud-starter-loa... 目录简述主要特点使用负载均衡算法1. 轮询负载均衡策略(Round Robin)2. 随机负载均衡策略(

解读spring.factories文件配置详情

《解读spring.factories文件配置详情》:本文主要介绍解读spring.factories文件配置详情,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用场景作用内部原理机制SPI机制Spring Factories 实现原理用法及配置spring.f

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi