文章目录

  • ERC-20协议是什么意思?
  • 取值函数
    • totalSupply
    • balanceOf
    • allowance
  • 操作函数
    • transfer
    • approve
    • transferFrom
  • 事件
    • Transfer
    • Approval
  • ERC-20 通证的基本实现

ERC-20协议是什么意思?

ERC代表“Etuereum Request for Comment”,以太坊社区为了创建一个以太坊平台的标准,开发人员提交了一个以太坊改进方案(EIP),改进方案中包括协议规范和合约标准。最终确定的EIP为以太坊开发者提供了一套可实施的标准。这使得智能合约可以遵循这些通用的接口标准来构建。可以在这里检索到所有EIP提案。

而ERC-20是以太坊上最重要的智能合约标准之一。它已经成为基于以太坊公链上用于发行可替换通证,所使用智能合约的技术标准。ERC-20 定义了所有可替换的以太坊通证都应该遵守的通用规则列表。 这简化了开发者的任务,开发者知道只要通证遵循标准中的规则,每次发布新的通证时就不需要重新实现每个新项目。

知识点:什么是可替换的以太坊通证,还有不可替换的以太坊通证吗?
可替换的以太坊通证是表示通证与通证之间是完全一样的,可以被替换的,通常遵循ERC-20标准。比如A钱包中的一个ERC-20通证和B钱包中的一个相同合约地址的ERC-20通证,在区块链上看来完全一致没有什么不同,可以被相互替换。
不可替换的以太坊通证又叫非同质化通证(Non-Fungible Token)缩写为NFT,就算AB两个钱包中存在合约地址相同的两个通证,它们也存在着不一致的属性值,它们是不一样的。所以在区块链上看来是不可被相互替换的。这样的通证通常遵循ERC-721标准。

这里有段 ERC-20 接口代码,它定义了遵循 ERC-20 标准通证所必须实现的函数:

pragma solidity ^0.8.0;interface IERC20 {event Transfer(address indexed from, address indexed to, uint256 value);event Approval(address indexed owner,address indexed spender,uint256 value);function totalSupply() external view returns (uint256);function balanceOf(address account) external view returns (uint256);function allowance(address owner, address spender)externalviewreturns (uint256);function transfer(address to, uint256 amount) external returns (bool);function approve(address spender, uint256 amount) external returns (bool);function transferFrom(address from,address to,uint256 amount) external returns (bool);
}

下面说明一下这些函数的用途


取值函数

totalSupply

这个函数返回存在的通证数量,展示了目前该通证的流通总量,可以被所有函数调取。该函数是一个取值函数,不会修改合约的状态。重点:Solidity 中没有浮点数。 因此,大多数通证都会采用 18 位小数,并且会返回总供应量和其他结果,如下所示:1 个通证 = 100000000000000000。 这需要在处理通证数量时格外注意,不过并不是每个通证都有 18 位小数。

function totalSupply() external view returns (uint256);

balanceOf

这个函数返回某地址拥有的通证数量(account)。 该函数同样是一个取值函数,不会修改合约的状态。

function balanceOf(address account) external view returns (uint256);

allowance

此函数被用来查看owner给spender的通证额度。此函数是一个取值函数,不会修改合约的状态,并且默认应返回 0。

function allowance(address owner, address spender)externalviewreturns (uint256);

操作函数

transfer

将一定数量(amount)的通证从函数调用者地址(msg.sender)移动到接收者(to)地址。此函数发出稍后定义的Transfer事件。 如果可进行转账,它将返回 true,转账操作需要消耗gas。

function transfer(address to, uint256 amount) external returns (bool);

approve

函数调用方(msg.sender)可以调用这个函数授权spender代表它使用amount数量的通证,即设置允许spender从函数调用方(msg.sender)余额转账的allowance的数额。 此函数发出 Approval 事件。 此函数返回是否成功设置了余量。

function approve(address spender, uint256 amount) external returns (bool);

transferFrom

使用余量机制将通证的amount从from移动到to。 然后从调用者的余量中扣除该数额。 此函数发出Transfer事件。

function transferFrom(address from,address to,uint256 amount
) external returns (bool);

事件

Transfer

将通证的数量value从from地址发送到to地址时会发出此事件,比如在调用 transfer 或 transferFrom 函数时。

event Transfer(address indexed from, address indexed to, uint256 value);

在铸造新的通证情况下,转账通常是 from 0x00…0000 地址,而在销毁通证的情况下,转账是 to 0x00…0000。

Approval

当owner批准要由spender使用的通证数量(value)时,将发出此事件。比如在调用 approve 函数时。

event Approval(address indexed owner,address indexed spender,uint256 value
);

ERC-20 通证的基本实现

下面是 ERC-20 通证的最简单代码:

pragma solidity ^0.8.0;interface IERC20 {event Transfer(address indexed from, address indexed to, uint256 value);event Approval(address indexed owner,address indexed spender,uint256 value);function totalSupply() external view returns (uint256);function balanceOf(address account) external view returns (uint256);function allowance(address owner, address spender)externalviewreturns (uint256);function transfer(address to, uint256 amount) external returns (bool);function approve(address spender, uint256 amount) external returns (bool);function transferFrom(address from,address to,uint256 amount) external returns (bool);
}contract ERC20Basic is IERC20 {string public constant name = "ERC20Basic";string public constant symbol = "ERC";uint8 public constant decimals = 18;mapping(address => uint256) balances;mapping(address => mapping(address => uint256)) allowed;uint256 totalSupply_ = 10 ether;constructor() {balances[msg.sender] = totalSupply_;}function totalSupply() public view override returns (uint256) {return totalSupply_;}function balanceOf(address tokenOwner)publicviewoverridereturns (uint256){return balances[tokenOwner];}function transfer(address receiver, uint256 numTokens)publicoverridereturns (bool){require(numTokens <= balances[msg.sender]);balances[msg.sender] = balances[msg.sender] - numTokens;balances[receiver] = balances[receiver] + numTokens;emit Transfer(msg.sender, receiver, numTokens);return true;}function approve(address delegate, uint256 numTokens)publicoverridereturns (bool){allowed[msg.sender][delegate] = numTokens;emit Approval(msg.sender, delegate, numTokens);return true;}function allowance(address owner, address delegate)publicviewoverridereturns (uint256){return allowed[owner][delegate];}function transferFrom(address owner,address buyer,uint256 numTokens) public override returns (bool) {require(numTokens <= balances[owner]);require(numTokens <= allowed[owner][msg.sender]);balances[owner] = balances[owner] - numTokens;allowed[owner][msg.sender] = allowed[owner][msg.sender] - numTokens;balances[buyer] = balances[buyer] + numTokens;emit Transfer(owner, buyer, numTokens);return true;}
}

关于以太坊ERC-20通证智能合约协议相关推荐

  1. 【附代码】如何在私有链上编写、部署与以太坊进行交互的智能合约

    原文:How To Write, Deploy, and Interact with Ethereum Smart Contracts on a Private Blockchain  作者:jack ...

  2. 以太坊(Ethereum) - 什么是智能合约

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  3. 什么是以太坊?什么是智能合约?

    以太坊是一个分布式的计算平台.它会生成一个名为Ether的加密货币.程序员可以在以太坊区块链上写下"智能合约",这些以太坊智能合约会根据代码自动执行. 以太坊是什么? 以太坊经常与 ...

  4. [区块链]详解以太坊标准发行通证Token代码(技术面看待ICO)

    /* This creates a public tradeable fungible token in the Ethereum Blockchain. https://github.com/eth ...

  5. java开源库web3j的以太坊过滤器(filter)和智能合约事件(event)教程

    2019独角兽企业重金招聘Python工程师标准>>> web3j过滤器提供以太坊网络发生的某些事件的通知,对java和安卓程序员来说很有用.在Ethereum以太坊中支持三类过滤器 ...

  6. Poly Network现已支持以太坊至币安智能链及火币生态链一键跨链

    异构链跨链互操作协议Poly Network现已支持不同网络资产的跨链流通,用户可通过一键跨链工具Poly Bridge将各种跨链资产高效便捷地从以太坊桥接到币安智能链(BSC)或火币生态链(Heco ...

  7. 以太坊之Remix部署智能合约(Remix简介,使用,测试网络部署合约)

    1.Remix简介 Remix 是一个开源的 Solidity 智能合约开发环境,提供基本的编译.部署至本地或测试网络.执行合约等功能.Solidity 是 以太坊Ethereum 官方设计和支持的开 ...

  8. 技术沙龙|解读以太坊黄皮书,学习智能合约应用开发(北京)

    2019独角兽企业重金招聘Python工程师标准>>> 前几天HiBlock区块链社区的杨镇老师在一次访谈中再次聊到了区块链技术学习和应用的话题,杨镇老师的观点很明确,技术学习要回归 ...

  9. 以太坊暴跌20%的幕后“黑手”:大概率是中国游资所为

    文  | 棘轮 比萨 "仿佛坐了一次过山车."对以太坊近日的币价走势,投资者如是评价. 在经历数月的下行后,以太坊在短短几天内,实现了超越币市平均水平的增长:随后,又掉头下跌. 在 ...

最新文章

  1. yaourt -S mysql_arch中yaourt的安装和使用
  2. WindowsPhone基础琐碎总结-----数据绑定(一)
  3. 为什么不能在init和dealloc函数中使用accessor方法
  4. Docker实战第二天(Docker常用命令详解)
  5. 去掉字符串左右的空格
  6. Faster RCNN minibatch.py解读
  7. 苹果电脑更改sd卡只读_SD卡变为只读系统
  8. 实名开撕!格力举报奥克斯空调虚标不合格 奥克斯回应:将起诉!
  9. jQuery实现影院选座订座效果
  10. mysql 存储过程 风险_删除/恢复SQL server危险的存储过程方法
  11. linux下无法执行PHP命令,错误 php: command not found
  12. datagrid编辑单元格中的内容
  13. MySQL查询优化:查询慢原因和解决技巧
  14. C语言中16进制转字符串字符串转16进制
  15. Java类属性字段校验(validation的使用)
  16. mysql删表数据不删表结构_在SQL中删除表数据和删除表结构有什么不同
  17. mysql 联合主键_Mysql的联合主键
  18. 计算机专业应聘范围,求职面试自我介绍范围
  19. Galaxy数据统计平台(一)
  20. 网箱补网水下机器人电控调试日志-驱动水下推进器-Day1

热门文章

  1. EV录屏怎么把自己的摄像头放进去,摄像头好的,但是人像很花,看不清人脸
  2. 2019投资总结,5月入市的小账户,收益25%
  3. 2018上海区块链国际周倒计时,汇聚全球意见领袖的技术盛会
  4. 如何设计账户余额的数据准确性?
  5. 茗香茶艺网/茶叶宣传网站
  6. S7-1200PLC求数组里数据最大值最小值FB块
  7. 今天看了you tu be 上面的舞蹈
  8. MySQL删除行之后空间没有被释放
  9. 数据预测之BP神经网络具体应用以及matlab代码(转)
  10. pm961 mysql_搭建Memcache服务详解