- 第 1 章 区块链
- 第 2 章 以太坊
- 第 3 章 以太坊私链入门
- 第 4 章 以太坊网络
- 第 5 章 geth v1.8.16 命令详解
- 第 6 章 Wallet
- 第 7 章 Token
- 第 8 章 智能合约语言 Solidity v0.5.0
- 第 9 章 Truffle v4.1.8 开发框架
- 第 10 章 web3.js - 1.0.0
- 第 11 章 web3j v3.4.0 - Jave Client
- 11.2. 启动以太坊
- 11.3. Maven pom.xml 文件
- 11.4. Java 与 Solidity 数据类型映射关系
- 11.5. 常量
- 11.6. 连接到服务器获取版本号
- 11.7. 获得以太坊状态信息
- 11.8. 单位转换
- 11.9. 账号管理
- 11.10. Credentials
- 11.11. 交易
- 11.12. 钱包
- 11.13. 智能合约
- 11.14. ERC20合约
- 11.15. Infura
- 11.16. 助记词
- 11.17. 过滤器 (Filter)
- 11.18. Subscription
- 11.19. 解锁账号
- 11.20. IBAN (International Bank Account Number)
- 11.21. Springboot with Ethereum (web3j)
- 第 12 章 web3.py - A python interface for interacting with the Ethereum blockchain and ecosystem.
- 第 14 章 Ethereum Developer APIs
- 第 15 章 infura
- 第 16 章 以太坊案例
- 第 17 章 FAQ
- 17.3. Error: authentication needed: password or unlock
- 17.4. 新增节点后不生效
- 17.5. Unhandled rejection Error: Returned error: The method personal_unlockAccount does not exist/is not available
- 17.6. Error: exceeds block gas limit
- 17.7. Migrations.sol:11:3: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(…) { … }" instead.
- 17.8. Exception in thread "main" rx.exceptions.OnErrorNotImplementedException: Invalid response received: okhttp3.internal.http.RealResponseBody@6c25e6c4
- 17.9. 旧版本 Remix(browser-solidity) 本地安装
- 第 18 章 Hyperledger Fabric v2.0.0
- 第 19 章 Hyperledger Fabric 运维
- 第 20 章 Chaincode 链码(智能合约)
- 第 21 章 Hyperledger Fabric Client SDK for Node.js
- 第 22 章 fabric-sdk-java
- 第 24 章 已知 Hyperledger 落地案例
- 第 25 章 Fabric Command
- 第 26 章 Fabric FAQ
- 第 27 章 IPFS(InterPlanetary File System,星际文件系统)
- 第 28 章 IPFS 命令
- 第 29 章 IPFS WebUI
- 第 30 章 IPFS 集群配置
- 第 31 章 IPFS API
- 第 32 章 IPFS Faq
- 第 33 章 EOS
- 第 34 章 EOS 安装
- 第 35 章 CLEOS
- 第 36 章 智能合约开发
- 第 37 章 EOS Dapp 开发
- 第 38 章 FAQ
- 第 39 章 BaaS (Blockchain as a Service) 平台
- 第 40 章 BitCoin
- 第 41 章 其他区块链相关
- 附录 1. 附录
7.2. ERC20 Token Solidity 0.4.24
7.2. ERC20 Token Solidity 0.4.24
https://theethereum.wiki/w/index.php/ERC20_Token_Standard
ERC20 “描述了实现代币合约的标准功能”,ERC20 是各个代币的标准接口。ERC20 代币仅仅是以太坊代币的子集。为了充分兼容 ERC20,开发者需要将一组特定的函数集成到他们的智能合约中,以便在高层面能够执行以下操作:
ERC20 提供的方法
获得代币总供应量
获得账户余额
转让代币
批准花费代币
7.2.1. 构造方法
原合约
pragma solidity ^0.4.21; contract NetkillerToken { address public owner; string public name; string public symbol; uint public decimals; uint256 public totalSupply; event Transfer(address indexed from, address indexed to, uint256 value); /* This creates an array with all balances */ mapping (address => uint256) public balanceOf; function NetkillerToken(uint256 initialSupply, string tokenName, string tokenSymbol, uint decimalUnits) public { owner = msg.sender; name = tokenName; symbol = tokenSymbol; decimals = decimalUnits; totalSupply = initialSupply * 10 ** uint256(decimals); balanceOf[msg.sender] = totalSupply; } /* Send coins */ function transfer(address _to, uint256 _value) public { /* Check if the sender has balance and for overflows */ require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to]); /* Add and subtract new balances */ balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; /* Notify anyone listening that this transfer took place */ emit Transfer(msg.sender, _to, _value); } }
新版合约
pragma solidity ^0.4.24; contract NetkillerToken { address public owner; string public name; string public symbol; uint public decimals; uint256 public totalSupply; event Transfer(address indexed from, address indexed to, uint256 value); /* This creates an array with all balances */ mapping (address => uint256) public balanceOf; constructor(uint256 initialSupply, string tokenName, string tokenSymbol, uint decimalUnits) public { owner = msg.sender; name = tokenName; symbol = tokenSymbol; decimals = decimalUnits; totalSupply = initialSupply * 10 ** uint256(decimals); balanceOf[msg.sender] = totalSupply; } /* Send coins */ function transfer(address _to, uint256 _value) public { /* Check if the sender has balance and for overflows */ require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to]); /* Add and subtract new balances */ balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; /* Notify anyone listening that this transfer took place */ emit Transfer(msg.sender, _to, _value); } }
7.2.2. 官方规定 Method 方法
所有的ERC20代币都是按照下面这些方法来定义的。下面我们讲解一下每个方法的作用。
7.2.2.1. name
function name() view public returns (string name)
返回string类型的ERC20代币的名字,例如:Netkiller Reader Coin
7.2.2.2. symbol
function symbol() view public returns (string symbol)
返回string类型的ERC20代币的符号,也就是代币的简称,例如:NRC。
7.2.2.3. decimals
function decimals() view public returns (uint decimals)
支持几位小数点后几位。如果设置为3。也就是支持0.001表示。
7.2.2.4. totalSupply
function totalSupply() view public returns (uint256 totalSupply)
发行代币的总量,可以通过这个函数来获取。所有智能合约发行的代币总量是一定的,totalSupply必须设置初始值。
7.2.2.5. balanceOf
function balanceOf(address _owner) public returns (uint256 balance)
输入地址,可以获取该地址代币的余额。
7.2.2.6. transfer
function transfer(address _to, uint256 _value) public returns (bool success)
调用transfer函数将自己的token转账给_to地址,_value为转账金额
7.2.2.7. approve
function approve(address _spender, uint256 _value) public returns (bool success)
批准_spender账户从自己的账户转移_value个token。可以分多次转移。
7.2.2.8. transferFrom
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
与approve搭配使用,approve批准之后,调用transferFrom函数来转移token。
7.2.2.9. allowance
function allowance(address _owner, address _spender) public returns (uint256 remaining)
返回_spender还能提取token的个数。
approve、transferFrom及allowance解释:账户A有1000个代币,想允许B账户随意调用100个代币。A账户按照以下形式调用approve函数approve(B,100)。当B账户想用这100个代币中的10个代币给C账户时,则调用transferFrom(A, C, 10)。这时调用allowance(A, B)可以查看B账户还能够调用A账户多少个token。
7.2.3. 事件
7.2.3.1. Transfer
event Transfer(address indexed _from, address indexed _to, uint256 _value)
当成功转移token时,一定要触发Transfer事件
7.2.3.2. Approval
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
当调用approval函数成功时,一定要触发Approval事件
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论