ERC20代币合约详解,附实现代码
2019独角兽企业重金招聘Python工程师标准>>>
目前几乎所有用于艾希欧筹集资金的代币,都是基于同样的技术:以太坊ERC-20标准。 因此这些代币实际上就是实现了ERC20标准的智能合约。在下文中,我们将全面剖析ERC20 标准规范,并给出一个ERC20代币合约的完整实现代码。此外,在下文中我们将不加区分地使用 __通证__和__代币__来表示遵循ERC20规范的智能合约,虽然前者完全涵盖了后者的范围。
如果你希望马上开始学习以太坊智能合约和应用开发,可以访问汇智网提供的出色的在线互动教程:
- 以太坊智能合约和应用开发入门
- 以太坊去中心化电商DApp实战开发
ERC20是Fabian Vogelsteller在2015年末提出的以太坊改进建议,它是许多流行的合约都在遵循的标准。 ERC20使通证智能合约的行为非常类似于传统的加密货币,例如在不同账户之间发送和接收、 查看通证总供应量或者查看某个地址可用的通证余额,就像比特币或以太币一样。这类似于用以太坊钱包 发送和接收以太币、查看流通中的以太币总量、查看特定钱包的货币余额等。
ERC20接口
ERC20定义了一些标准的接口函数:balanceOf 、 totalSupply 、transfer 、transferFrom 、approve和allowance 。 以及一些可选的字段,例如通证名称、符号以及小数保留位数等。你可以在github 查看ERC-20全文。
下面的代码声明一个简明的ERC20智能合约:
contract ERC20 {function totalSupply() constant returns (uint theTotalSupply);function balanceOf(address _owner) constant returns (uint balance);function transfer(address _to, uint _value) returns (bool success);function transferFrom(address _from, address _to, uint _value) returns (bool success);function approve(address _spender, uint _value) returns (bool success);function allowance(address _owner, address _spender) constant returns (uint remaining);event Transfer(address indexed _from, address indexed _to, uint _value);event Approval(address indexed _owner, address indexed _spender, uint _value);
}
合约中每个字段的描述及示例如下。
totalSupply()
尽管与比特币一样,通证供给总量可以很容易地固定下来,但此函数允许合约实例计算 并返回存在于流通中的通证总量。
contract MyERCToken {//在本示例中,通证供给量是固定的,但也可以将其设定为可修改的uint256 _totalSupply = 1000000;function totalSupply() constant returns (uint256 theTotalSupply) {//函数声明中已经定义了返回变量theTotalSupplytheTotalSupply = _totalSupply;return theTotalSupply;}
}
balanceOf()
该函数允许智能合约返回指定账户地址的通证余额。 该函数接受一个地址作为参数, 所以任何地址的通证余额都是公开的。
contract MyERCToken {//创建映射表来记录账户余额mapping(address => uint256) balances;// Owner of this contract//合约拥有者address public owner;function balanceOf(address _owner) constant returns (uint256 balance) {//返回指定地址的通证余额return balances[_owner];}
}
approve()
此函数的调用方授权给定的地址可以从其地址中提款。
在这里,以及后面的代码片段中,你可能会看到一个变量msg 。 这是由外部应用程序(如钱包)提供 的隐含字段,以便更好地与合约进行交互。 以太坊虚拟机(EVM)允许我们使用该字段来存储和处理 由外部应用程序提供的数据。
在这个例子中, msg.sender是合约方法调用方的地址。
contract MyERCToken {//创建映射表记录通证持有者、被授权者以及授权数量mapping(address => mapping (address => uint256)) allowed;function approve(address _spender, uint256 _amount) returns (bool success) {allowed[msg.sender][_spender] = _amount;//当授权时触发Approval事件Approval(msg.sender, _spender, _amount);return true;}
}
transfer()
该函数让调用方将指定数量的通证发送到另一个地址,就像加密货币交易一样。
contract MyERCToken {mapping(address => uint256) balances;//返回值为true时,表示转账成功function transfer(address _to, uint256 _amount) returns (bool success) {//如果发送方有足够的资金并且发送数量非0 ,则发送给指定地址if (balances[msg.sender] >= _amount && _amount > 0&& balances[_to] + _amount > balances[_to]) {balances[msg.sender] -= _amount;balances[_to] += _amount;//触发Transfer事件Transfer(msg.sender, _to, _amount);return true;} else {return false;}}
}
transferFrom()
该函数允许智能合约自动执行转账流程并代表所有者发送给定数量的通证。
看到这的时候你可能会有点困惑:为什么有了transfer(),还需要transferFrom()?。
回一下在日常生活中,通过转账来支付账单的情况。 通常你需要自己去办转账汇款来支付账单,这 就像使用transfer() :你需要自己执行,没有其他人的帮助。
在另一种情况下,你可以与银行签订自动代支付协议。 这就像使用transferFrom() : 银行的机器会自动以你的名义进行转账支持。 有了这个函数,合约就可以代表你自动 发送通证到另一个地址,而无需你的干预。
contract MyERCToken {mapping(address => uint256) balances;function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) {if (balances[_from] >= _amount&& allowed[_from][msg.sender] >= _amount&& _amount > 0&& balances[_to] + _amount > balances[_to]) {balances[_from] -= _amount;balances[_to] += _amount;Transfer(_from, _to, _amount);return true;} else {return false;}}
}
name - 通证名称
name
是一个可选字段,但许多流行的通证都定义了这个字段,以便像Mist和MyEtherWallet 这样的钱包能够识别它们:
contract MyERCToken {string public constant name = "My Custom ERC20 Token";
}
symbol - 通证符号
symbol
是另一个用于标识通证的可选字段,通常采用三到四个字母的缩写,就像BTC、ETH、AUG或SJCX一样,
contract MyERCToken {string public constant symbol = "MET";
}
decimals - 小数位数
这是一个可选字段,用于确定通证数量的小数位数。 最常见的小数位数是18。
contract MyERCToken {uint8 public constant decimals = 18;
}
这个ERC20通证的源代码可以在Github找到。
ERC20标准开辟了一套新的智能合约,可以像比特币或以太坊一样创建和分发,而且, 这些代币可以在交易所托管,像其他资产一样进行交易,因此投资者也可以轻松地购买和出售这些代币。
原文:ERC20剖析:最火的以太坊智能合约
转载于:https://my.oschina.net/u/3794778/blog/1808339
ERC20代币合约详解,附实现代码相关推荐
- 以太坊ERC20代币合约案例
一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...
- 构建 ERC20 代币合约
构建 ERC20 代币合约 使用 Contracts,我们可以轻松创建我们自己的 ERC20 代币合约,该合约将用于跟踪假设游戏中的内部货币黄金(GLD). 这就是我们的 GLD 代币的样子. // ...
- Linux用户、权限及改变文件所有者及文件所属组多例详解 附python代码
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Linux用户.权 ...
- 数据结构-数组-字符串匹配:Knuth-Morris-Pratt算法(详解附完整代码)
字符串匹配 字符串抽象数据类型 字符串模式匹配 简单的字符串匹配 Knuth-Morris-Pratt算法 背景分析 失配函数 定义 实现方法 函数分析 KMP函数 实现方法 函数分析 失配信息的另一 ...
- java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)
首先看一下官方文档 地址:微信小程序官方文档API登录接口 我们先对官方给的时序图进行简单的分析 1.当小程序调用wx.login()时,会获得一个code(临时登录凭证),然后我们需要用wx.req ...
- 数据结构 插入排序(InsertionSort Sort) 详解 附C++代码实现:
目录 简介: 算法描述: 代码实现: 总结: 简介: 是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 时间复杂度为o(n^2 ...
- C# 调用高德地图API获取经纬度以及定位,JS获取定位【万字详解附完整代码】
最近有个需求,需要用到定位,本来打算用百度地图API定位,但是发现百度地图定位申请AppKey太麻烦了.因为是写的web端,百度地图定位API申请的Appkey需要网址过滤.索性就用高德定位了(有一说 ...
- KDD Cup风力发电赛题详解-附baseline代码【时间序列相关赛题方案】
shiji按序列 赛题名称 Baidu KDD CUP 2022 赛题链接 https://aistudio.baidu.com/aistudio/competition/detail/152/0/i ...
- 滚球控制系统详解 —— (附核心代码)
最近练习了17年的国赛题 -- 滚球控制系统 这里展示一下画圆: 观看完整视频点这里 接下来,我来分享一下从搭整体结构到调试完的过程. 这是我搭完的整体结构 (缩小版) (不管什么题,结构部分还是很重 ...
- lenet 5 代码 matlab,Lenet 和 Lenet5 结构简单粗暴详解(附完整代码)
LeNet LeNet 早期用来识别手写体数字的图像的卷积神经网络 组成部分: 卷积层块 全连接层块 138CFD41-65C8-4ED7-9FB6-ACA8D5E98FEF.png image.pn ...
最新文章
- “叽里呱啦”说英语,这家公司要用AI增值语言输出能力
- Table.Rows.Remove(dr)和Table.Delete()的区别
- php 命令执行crud_使用活动记录执行CRUD
- Scala构建工具SBT
- git pull出现错误的解决办法
- Linux 中的 20 大网络监控工具
- 隐式差分方程组差分法matlab,一维扩散方程的有限差分法matlab
- Android音视频——Libyuv使用实战
- 【夜神模拟器运行app】uniapp将app运行到夜神模拟器
- java poi word 复制_java poi如何复制word中的table
- 黄山学院计算机科学与技术怎么样,黄山学院怎么样?黄山学院点评及最新评价情况...
- 记一次失败的阿里巴巴电话面试
- iOS10-iOS13全系统越狱来了,A5-A11芯片全部能越狱工具来了
- 金山词霸2010牛津旗舰破解版【最完美的】的使用方案
- 拼多多推广中出价是越高效果越好吗?
- 关于零基础入门金融风控挑战赛的笔记系列
- 正确使用#include和前置声明(forward declaration)
- Android OkHttp是如何上位的?
- C语言自学完备手册(07)——printf()输出格式详解
- GoldenGate—日常管理