一文弄清以太坊代币ERC721
文章共2000字,预计阅读时间10分钟。
Web3是个令人眼花缭乱的地方,里面充斥着新颖的词汇:币、代币、NFT、跨链桥、Defi、Cefi,这些都让入门者感到非常困惑。
新手可能花好几天时间,看了好几个项目的白皮书,最终都不明白什么是代币,什么是NFT。有人好不容易清楚了代币的含义,依然会疑惑,以太坊不是已经有了主币ETH,为什么还有个代币wETH?
本文试图从代码角度帮助弄清以太坊上的各种代币,他们有什么功能,以及通常是如何实现这些功能的,欢迎交流。TL;DR
「ERC」全称「Ethereum Request for Comment」,中文名为「以太坊意见征求稿」,目前经常使用的有ERC-20和ERC-721两个标准,前者用于发行同质化代币,后者用于发行非同质化代币(即NFT,non-fungible token)。
满足标准的合约所记录的数据就被称为代币,代币只是被记录在合约中的数据,铸造、转账、销毁操作也只是在合约中修改记录的数值。
ERC标准规定了合约的接口,其他应用(例如OpenSea)可以通过合约的接口来操作代币。
容易误解的是,ERC标准仅仅规定了合约的接口格式,至于合约具体怎样实现这些接口,ERC标准是不做规定的,所以能有各式各样的NFT。ERC-20
ERC-20标准规定了以下6个函数和2个事件interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address from, address to, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); }
6个函数的含义分别是totalSupply() :获取代币的总发行量balanceOf(address account) :获取account 地址代币的余额transfer(address to, uint256 amount) :函数的调用者直接向to 地址发送amount 数量代币allowance(address owner, address spender) :获取owner 向spender 地址批准了多少消费额度approve(address spender, uint256 amount) :函数的调用者向spender 地址批准amount 数量消费额度transferFrom(address from, address to, uint256 amount) :函数的调用者使用from 地址给的消费额度向to 地址发送amount 数量代币
2个事件的含义分别是Transfer :转账时发出,记录from 地址向to 地址发送了amount 数量代币Approval :批准消费额度时发出,记录owner 地址向spender 地址批准了value 消费额度
其中approve 、transferFrom 和allowance 可能比较难理解,一个简单的例子就是父母给零花钱,花钱的虽然是子女,但钱是从父母钱包里面扣除的。
如果合约实现了以上6个函数和2个事件,我们就可以说满足ERC-20标准。通常项目方还会在合约中添加mint 函数和burn 函数,用来增发代币和销毁代币,这里是ERC-20合约的一种实现方式。
满足ERC-20标准的合约所铸造出来的代币,就可以上线uniswap等去中心化交易所,用来交换别的虚拟货币了。因为去中心化交易所需要调用transferFrom 方法,而以太坊的主币ETH并没有这个接口,所以查看ETH在uniswap中具体的交易情况,能发现ETH总是先被存入wETH合约转换成同等数量的wETH代币,之后uniswap再调用transferFrom 进行各种代币间的交换。ERC-721
ERC-721标准规定了以下10个函数和3个事件interface IERC165 { function supportsInterface(bytes4 interfaceID) external view returns (bool); } interface IERC721 is IERC165 { event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId ) external; function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function getApproved(uint256 tokenId) external view returns (address operator); function setApprovalForAll(address operator, bool _approved) external; function isApprovedForAll(address owner, address operator) external view returns (bool); }
ERC-721标准是继承了ERC-165标准的,其中ERC-165标准规定了函数supportsInterface(bytes4 interfaceID) 用于发布并检测合约实现了什么接口。
ERC-165标准使得外部可以查询合约是否支持接口,如果支持,查询接口的版本,以便用户可以调整与合约交互的方式。
剩下9个函数的含义分别是balanceOf(address owner) :获取owner 地址代币的余额ownerOf(uint256 tokenId) :获取tokenId 号代币的owner 地址safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) :安全地将tokenId 号代币从from 地址发送到to 地址并附加data 信息(data 信息在token发送到合约账户时会用到,可以用data 来操作接收的合约,安全发送指的是合约会检查to 地址是不是合法的token接收者)safeTransferFrom(address from, address to, uint256 tokenId) :同上,data 信息为空transferFrom(address from, address to, uint256 tokenId) :将tokenId 号代币从from 地址发送到to 地址,一般用于发送给他人账户,如果to 地址是合约账户则可能出错approve(address to, uint256 tokenId) :函数调用者将tokenId 号代币批准给to 地址getApproved(uint256 tokenId) :获取tokenId 号代币被批准给了哪个地址setApprovalForAll(address operator, bool _approved) :函数调用者管理第三方operator 地址的权限,_approved 表示是否给第三方批准isApprovedForAll(address owner, address operator) :获取owner 地址是否批准第三方operator 地址操作自己所有的代币
3个事件的含义分别是Transfer :转账时发出,记录from 地址向to 地址发送了tokenId 号代币Approval :批准时发出,记录owner 地址向approved 批准了tokenId 号代币ApprovalForAll :管理第三方权限时发出,记录owner 地址将第三方operator 地址的管理权限设置为approved
由于合约中含有tokenId ,所以每个代币都是不尽相同的,这正是「非同质化」的含义。ERC-721和ERC-20在设计思路上没有太大差别,只不过由于ERC-721的代币是非同质化的,所以既可以通过tokenId 进行单个批准,也可以将owner 地址的代币全部进行批准,而ERC-20只能批准固定数量。
在实际使用中,不一定需要把九个函数全部实现,这里是ERC-721合约的一种实现方式。尾记
知道了ERC-20和ERC-721有什么用呢?
知道了标准,我们就可以通过ERC标准提供的接口直接操作各类代币和NFT,例如,无聊猿是NFT,那么他的合约肯定也符合ERC-721标准。
可以通过以太坊浏览器,直接调用ownerOf 接口查看2022号无聊猿的拥有者(当然使用代码调用接口也可以,只是以太坊浏览器比较直观)
我们再在最大的NFT交易市场OpenSea上查看一下2022号无聊猿,发现其拥有者确实是这个B44618 开头的账户
事实上,OpenSea这类应用,正是通过调用ERC标准提供的各种接口来实现交易的,当我们完全了解ERC标准之后,完全可以自己编写应用来进行代币的交易。
今天就到这里,再见。
参考文章
https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/
https://ethereum.org/zh/developers/docs/standards/tokens/erc-721/
https://eips.ethereum.org/EIPS/eip-165
陕西面积最大的市,究竟有多大?相当于4个西安,11个铜川随着大家收入水平的提高,很多人一有时间就喜欢外出游玩。大家都知道,出门旅游除了观光之外,也可以很好地增长见识!我国拥有广阔的土地面积,拥有漫长的海岸线,是一个地理环境相当好的国度,
圣莲胜景9月22清晨,望着窗外下着小雨,还是导航圣莲山开车出发了真是好福气,汽车刚跑起来,雨停了!不久东方泛红,太阳出来了,一片金光撒在大地,我不禁回身拍下那泛光的道路。不久,首钢大桥出现
鹅喉羚,奔跑狂欢在准噶尔雪原上的精灵鹅喉羚,奔跑狂欢在准噶尔雪原上的精灵。冬天里的新疆准噶尔盆地是一片茫茫雪原,大雪覆盖了整个盆地,和盆地中的戈壁沙漠。纵贯南北的国道216线,汽车碾压去了冬天的积雪,显得黝黑发亮,宛
云南南涧乡村振兴与民族团结进步同向发力南涧无量山藏茶谷(南涧县融媒体中心供图)南涧县乐秋乡米家禄全景(南涧县融媒体中心供图)南涧小湾东镇澜沧江江雾(南涧县融媒体中心供图)全国首个针对乡村振兴特别设立的动车站小湾东站(南
我和我女儿感动瞬间来自她的出生我出生在青海一个小山村,我的家乡是世界第二大佛陀宗喀巴大师出生的地方,有著名的旅游胜地塔尔寺。在农村有很多重男轻女的思想,从我爷那辈说起,我爷生了三个儿子和一个女儿,女儿在出嫁一年
隐藏闹市的千年景点,诗仙诗圣都曾点赞位于四川成都西郊的百花潭公园,建于1881年,距今只有一百多年的历史百花潭公园其前身却可以追溯到大唐时期诗仙李白的一首诗登锦城散花楼传颂至今,诗圣杜甫在成都期间,更是留下了万里桥西
河南林州,盘龙山上原生态古村,红色粮仓却少有人知古村,是可以让人忘记时间的地方。流走的是岁月,留下的是历史。岁月的脚步轻轻,历史的印迹重重。古村婉约而富有内涵,从那些老旧的房屋中感受着时光刻下的印记,它承载着代代人的烟火气,经历
杭州地铁1h,这个山水宝地去N回都不腻朋友们,如果用时间纬度来衡量我于这座城市的存在,那么,今天是我杭漂的第642天。将近两年的时间,我见过了晴霜雨雪的西湖踏足过诗情画意的西溪湿地也被金秋时节的满城桂花香所深深吸引。当
为什么我们一定要登珠峰?2020年5月27日11点许,8名登山队员成功登顶珠穆朗玛峰。这个激动人心的时刻,值得被铭记!这场现实版的攀登者,吸引了千万人上线观看。登山成功的消息一出,无数人留言送祝福,语言满
成山头琐记中国荣成旅行笔记(连载二十六)走,跟我们一起去太阳最先升起的地方成山头如果说荣成哪个景点最吸引我,首当其冲是成山头。来了五次荣成,去了四次成山头。如果问我哪一次感受最深,回答是第一次。因为第一次去的时候,所有该
天下第一财神庙,就在西湖边上乘着周末天气好,去爬了趟西湖边上的北高峰。北高峰上有一座灵顺寺,号称天下第一财神。灵顺寺与2005年按照明清寺庙建制重建。严格意义上有点不符合寺庙的建制,因为地处北高峰,已经是没了
复读你会后悔吗?不会,复读这件事我是真正的经历过得。那会是由于自己高考分数线没达到二本,所以决定复读一年,那一年是我学生生涯中最黑暗的一年,孤独,痛苦,烦躁,不安时刻围绕着我,但是那一年我坚持了下
前列腺钙化是一种很严重的病吗?很高兴有机会可以回答您的问题。随着体检逐渐普及,很多中青年男性在B超检查中,发现有前列腺钙化的问题。这是怎么回事呢?钙化,是指局部组织中有钙盐沉积。前列腺钙化的常见原因,是前列腺内
得了糖尿病能不能吃醪糟?糖尿病人在饮食上是需要多加注意的,饮食治疗对于血糖的稳定也很重要。糖尿病是一种慢性终身性疾病,因此,做好饮食管理显得尤为重要。得了糖尿病能不能吃醪糟?醪糟,也就酒酿,糯米酒甜米酒等
十年内,只玩一只股票,你愿意吗?我愿意啊,我觉得对于大部分的散户来说也是一件好事!在A股市场里能走出独立行情的个股根本不多,所以大部分的个股都是跟着A股的周期进行涨跌的,也就是说频繁换股不会给你带来多大的收益,也
比特币成为犯罪帮凶,还有投资价值吗?菜刀成为杀人利器,还有必要存在吗?说比特币是犯罪帮凶应该不成立,只有些人不知出于什么原因,说比特币能洗钱与转移财产,但十多年来没听说过谁干过这事,所以没有根据,比特币变现很难,中国
为什么有些明星整容还不承认呢?能变得更美,这不仅是普通人的心愿,更是靠脸吃饭的艺人们穷极一生追求的目标,其实就像化妆一样,适度微调体现的是对事业和观众的尊重,无论口碑如何,归根到底还是要看业务能力。但一向低调的
安徽阜阳有哪些明星?安徽阜阳的明星也有不少,虽说都不是特别有名,但都算是小有名气,下面小编来简单列举几个1王乐乐王乐乐,一九八五年出生于安徽省阜阳市,是安徽卫视的节目主持人。王乐乐这个名字还是比较大众
雷阿伦当年为何宁可降薪加盟死敌热火,也不愿意和凯尔特人续约?20112012赛季NBA经历了劳资纠纷后的一个缩水赛季,雷阿伦因为伤病仅仅代表球队出场了46次,他的三分命中率创造了生涯最高的45。3,但是他的出手次数,场均得分甚至于场均出场时
孩子厌学的根本原因是什么?孩子厌学,首先要弄清楚孩子厌学的原因,然后根据原因对孩子进行恰当的诱导。根据我的观察,孩子厌学有以下几种原因。一孩子迷恋上了网络,由于大人给了孩子一定的零用钱,或是去外面吃早餐的钱
有些人期货连续盈利四五年甚至更久,但有一天突然爆仓,什么原因?很多投资者交易个45年,赚点钱就说自己的交易系统已经稳定了,就说自己已经能够做到稳定盈利了,作为过来人我觉得45年的时间还是不够的,一波牛市有的时候能持续个56年,大家都知道顺趋势
皮肤发黄是什么原因?如果是皮肤暗黄,首先得意识到,角质层的含水量是不是偏低。如果含水量低,那么皮肤由于光线反射看起来,就暗黄暗沉一些。这样的情况可以考虑定期敷面膜补水,再用一些保湿性好一点的面霜,晚安