DAPP开发【05】ERC20/ERC721简介

2023-12-02 21:44
文章标签 开发 05 简介 dapp erc721 erc20

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

ERC20是以太坊上最受欢迎和广泛使用的代币标准之一。ERC20代币符合一组通用规则,包括代币的转账方法和余额查询方法。这些规则使得 ERC20 代币易于与钱包、交易所和其他合约进行集成和交互。

ERC20标准规定了代币合约必须实现以下6个函数:

  1. balanceOf(address _owner):获取给定地址的代币余额。

  2. transfer(address _to, uint256 _value):将代币从一个地址转移到另一个地址。

  3. allowance(address _owner, address _spender):返回给定地址的可转移余额。

  4. approve(address _spender, uint256 _value):允许另一个地址花费指定数量的代币。

  5. transferFrom(address _from, address _to, uint256 _value):从一个地址转移代币到另一个地址,前提是交易需要经过第三方的批准。

  6. totalSupply():获取代币的总供应量。

ERC20代币合约必须遵守并实现这些函数,以确保它们与其他代币和钱包兼容。此外,ERC20代币合约还必须包含代币的名称、符号和小数位数等元数据。

任何人都可以创建自己的ERC20代币,并将其用于支付、投票或其他用途。同时, ERC20代币也很容易与其他代币和钱包进行交互。

ERC20代币具有以下属性:

  1. 总供应量(Total Supply): 该代币发行的总数量。

  2. 名称(Name): 代币的名称,例如“以太币”。

  3. 符号(Symbol): 代币的简称,例如“ETH”。

  4. 小数位数(Decimals): 代币可以拆分的最小单位,例如“18”,代表代币可以被拆分为10的18次方的最小单位。

  5. 余额(Balance): 代币持有人的余额。

  6. 转移记录(Transfer Record): 代币的转移记录,包括发送、接收方、数量和时间。

  7. 批准记录(Approval Record): 代币的批准记录,包括批准者、受批准者和数量。

  8. 总供应限制(Total Supply Limit): 可以控制代币的总供应量,可以选择是否限制代币的总供应量。

以上属性可以在ERC20代币合约中进行定义和设置,以确保标准化和互操作性。

ERC721是一种以太坊上的代币标准,用于创建不可替代的代币。与ERC20代币不同,每个ERC721代币都是独一无二的,因此它们通常用于代表唯一的资产,如游戏中的虚拟物品、数字艺术品、房屋和土地证书等。

ERC721代币具有以下属性:

  1. 每个ERC721代币都有一个独一无二的标识符(Token ID),通过这个标识符可以唯一地标识每个代币。

  2. ERC721代币不可替代,即每个代币都是唯一的,不能被其他代币所替代。

  3. 每个ERC721代币都可以被拥有者进行转移,就像普通的代币一样。

  4. ERC721合约必须实现一组标准接口,包括balanceOfownerOfapprovetransferFromsafeTransferFrom,以便于与其他合约进行交互和转移代币。

  5. ERC721代币可以被继承和扩展,以实现更复杂的功能,例如用于游戏的虚拟物品。

下面是一个以太坊智能合约的示例代码,用于实现一个简单的ERC721代币合约:

pragma solidity ^0.8.0;contract MyNFT {// ERC721 标准string public constant name = "My NFT";string public constant symbol = "MYNFT";event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);mapping(uint256 => address) private _tokenOwner;mapping(uint256 => address) private _tokenApprovals;mapping(address => uint256) private _ownedTokensCount;function balanceOf(address owner) public view returns (uint256) {require(owner != address(0), "ERC721: balance query for the zero address");return _ownedTokensCount[owner];}function ownerOf(uint256 tokenId) public view returns (address) {address owner = _tokenOwner[tokenId];require(owner != address(0), "ERC721: owner query for nonexistent token");return owner;}function approve(address to, uint256 tokenId) public {address owner = ownerOf(tokenId);require(to != owner, "ERC721: approval to current owner");require(msg.sender == owner || isApprovedForAll(owner, msg.sender),"ERC721: approve caller is not owner nor approved for all");_tokenApprovals[tokenId] = to;emit Approval(owner, to, tokenId);}function getApproved(uint256 tokenId) public view returns (address) {require(_exists(tokenId), "ERC721: approved query for nonexistent token");return _tokenApprovals[tokenId];}function setApprovalForAll(address operator, bool approved) public {require(operator != msg.sender, "ERC721: approve to caller");_operatorApprovals[msg.sender][operator] = approved;emit ApprovalForAll(msg.sender, operator, approved);}function isApprovedForAll(address owner, address operator) public view returns (bool) {return _operatorApprovals[owner][operator];}function transferFrom(address from, address to, uint256 tokenId) public {require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");_transfer(from, to, tokenId);}function safeTransferFrom(address from, address to, uint256 tokenId) public {safeTransferFrom(from, to, tokenId, "");}function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");_safeTransfer(from, to, tokenId, _data);}// 扩展功能function mint(address to, uint256 tokenId) public {require(to != address(0), "ERC721: mint to the zero address");require(!_exists(tokenId), "ERC721: token already minted");_tokenOwner[tokenId] = to;_ownedTokensCount[to] += 1;emit Transfer(address(0), to, tokenId);}function _exists(uint256 tokenId) internal view returns (bool) {address owner = _tokenOwner[tokenId];return owner != address(0);}function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {require(_exists(tokenId), "ERC721: operator query for nonexistent token");address owner = ownerOf(tokenId);return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));}function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal {_transfer(from, to, tokenId);require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");}function _transfer(address from, address to, uint256 tokenId) internal {require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");require(to != address(0), "ERC721: transfer to the zero address");_tokenApprovals[tokenId] = address(0);_ownedTokensCount[from] -= 1;_ownedTokensCount[to] += 1;_tokenOwner[tokenId] = to;emit Transfer(from, to, tokenId);}function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) {if (isContract(to)) {try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {return retval == IERC721Receiver(to).onERC721Received.selector;} catch (bytes memory reason) {if (reason.length == 0) {revert("ERC721: transfer to non ERC721Receiver implementer");} else {assembly {revert(add(32, reason), mload(reason))}}}} else {return true;}}function isContract(address account) internal view returns (bool) {uint256 size;assembly { size := extcodesize(account) }return size > 0;}
}interface IERC721Receiver {function onERC721Received(address operator,address from,uint256 tokenId,bytes calldata data) external returns (bytes4);
}

这个示例代码中包含了ERC721代币标准的主要功能,包括标识符、转移、批准、所有者等。此外,它还包括了一些扩展功能,例如 mint 函数用于发行新的代币。请注意,这个示例代码并不完整,你需要根据自己的需求进行修改和扩展。

这篇关于DAPP开发【05】ERC20/ERC721简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者