erc20协议,定义了一种代币token规范、通俗的书是协议。你的100和我的100没有区别。等价的。只要定义了一种token符合erc20协议标准就兼容以太坊钱包。可以进行erc20里的操作方法,比如:

  • 将代币从一个帐户转到另一个帐户

  • 获取帐户的当前代币余额

  • 获取网络上可用代币的总供应量

  • 批准一个帐户中一定的代币金额由第三方帐户使用

function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)//不需要花费gas,view total。获取该token的流通总量。
function totalSupply() public view returns (uint256)//view address balance。获取该地址下的token数量。
function balanceOf(address _owner) public view returns (uint256 balance)//消耗gas,msg,sender的token数量转移value个到to address。
function transfer(address _to, uint256 _value) public returns (bool success)//转账。花费贷款的钱
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)//授权(贷款)
function approve(address _spender, uint256 _value) public returns (bool success)//查看授权的额度
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

每个token都是一样的,并且可以分割,比如1个gTH可以分割成10分,0.1gTH。

ERC721标准

erc721给每个符合标准的token唯一tokenI的,每个token无法分割

pragma solidity ^0.4.20;/// @title ERC-721非同质化代币标准
/// @dev See https://learnblockchain.cn/docs/eips/eip-721.html
///  Note: ERC-165 接口id 为 0x80ac58cd.
interface ERC721 /* is ERC165 */ {/// @dev 当任何NFT的所有权更改时(不管哪种方式),就会触发此事件。///  包括在创建时(`from` == 0)和销毁时(`to` == 0), 合约创建时除外。event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);/// @dev 当更改或确认NFT的授权地址时触发。///  零地址表示没有授权的地址。///  发生 `Transfer` 事件时,同样表示该NFT的授权地址(如果有)被重置为“无”(零地址)。event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);/// @dev 所有者启用或禁用操作员时触发。(操作员可管理所有者所持有的NFTs)event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);/// @notice 统计所持有的NFTs数量/// @dev NFT 不能分配给零地址,查询零地址同样会异常/// @param _owner : 待查地址/// @return 返回数量,也许是0function balanceOf(address _owner) external view returns (uint256);/// @notice 返回所有者/// @dev NFT 不能分配给零地址,查询零地址抛出异常/// @param _tokenId NFT 的id/// @return 返回所有者地址function ownerOf(uint256 _tokenId) external view returns (address);/// @notice 将NFT的所有权从一个地址转移到另一个地址/// @dev 如果`msg.sender` 不是当前的所有者(或授权者)抛出异常/// 如果 `_from` 不是所有者、`_to` 是零地址、`_tokenId` 不是有效id 均抛出异常。///  当转移完成时,函数检查  `_to` 是否是合约,如果是,调用 `_to`的 `onERC721Received` 并且检查返回值是否是 `0x150b7a02` (即:`bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`)  如果不是抛出异常。/// @param _from :当前的所有者/// @param _to :新的所有者/// @param _tokenId :要转移的token id./// @param data : 附加额外的参数(没有指定格式),传递给接收者。function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;/// @notice 将NFT的所有权从一个地址转移到另一个地址,功能同上,不带data参数。function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;/// @notice 转移所有权 -- 调用者负责确认`_to`是否有能力接收NFTs,否则可能永久丢失。/// @dev 如果`msg.sender` 不是当前的所有者(或授权者、操作员)抛出异常/// 如果 `_from` 不是所有者、`_to` 是零地址、`_tokenId` 不是有效id 均抛出异常。function transferFrom(address _from, address _to, uint256 _tokenId) external payable;/// @notice 更改或确认NFT的授权地址/// @dev 零地址表示没有授权的地址。///  如果`msg.sender` 不是当前的所有者或操作员/// @param _approved 新授权的控制者/// @param _tokenId : token idfunction approve(address _approved, uint256 _tokenId) external payable;/// @notice 启用或禁用第三方(操作员)管理 `msg.sender` 所有资产/// @dev 触发 ApprovalForAll 事件,合约必须允许每个所有者可以有多个操作员。/// @param _operator 要添加到授权操作员列表中的地址/// @param _approved True 表示授权, false 表示撤销function setApprovalForAll(address _operator, bool _approved) external;/// @notice 获取单个NFT的授权地址/// @dev 如果 `_tokenId` 无效,抛出异常。/// @param _tokenId :  token id/// @return 返回授权地址, 零地址表示没有。function getApproved(uint256 _tokenId) external view returns (address);/// @notice 查询一个地址是否是另一个地址的授权操作员/// @param _owner 所有者/// @param _operator 代表所有者的授权操作员function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}interface ERC165 {/// @notice 是否合约实现了接口/// @param interfaceID  ERC-165定义的接口id/// @dev 函数要少于  30,000 gas./// @return 合约实现了 `interfaceID`(不为  0xffffffff)返回`true` , 否则false.function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

ERC165

每个符合ERC721的智能合约必须同时符合ERC721和ERC165。

ERC165是智能合约定义自己支持哪些接口的一种方式。 那么比如说,智能合约是否支持接收ERC-721代币? 如果支持,则该合约的 supportsInterface 函数必须存在并返回true。

ERC165标准接口如下:

interface ERC165 {/// @notice 是否合约实现了接口/// @param interfaceID  ERC-165定义的接口id/// @dev 函数要少于  30,000 gas./// @return 合约实现了 `interfaceID`(不为  0xffffffff)返回`true` , 否则false.function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

接受安全转账接口

如果合约(应用)要接受NFT的安全转账,则必须实现如下接口。

interface ERC721TokenReceiver{/// @notice 处理接收NFT
/// @dev ERC721智能合约在`transfer`完成后,在接收这地址上调用这个函数。
/// 函数可以通过revert 拒绝接收。返回非`0x150b7a02` 也同样是拒绝接收。
/// 注意: 调用这个函数的 msg.sender是ERC721的合约地址
/// @param _operator :调用 `safeTransferFrom` 函数的地址。
/// @param _from :之前的NFT拥有者
/// @param _tokenId : NFT token id
/// @param _data : 附加信息
/// @return 正确处理时返回 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
function onERC721Received(address_operator,address_from,uint256_tokenId,bytes_data)externalreturns(bytes4);}

元数据接口

元数据包括一个名称和符号,就像它许多其他代币标准中一样(如ERC-20)。 此外,还可以为一个代币定义tokenURI , 每个代币都应该有自己的URI。

interfaceERC721Metadata{
/// @notice NFTs 集合的名字
function name()externalviewreturns(string_name);
/// @notice NFTs 缩写代号
function symbol()externalviewreturns(string_symbol);/// @notice 一个给定资产的唯一的统一资源标识符(URI)
/// @dev 如果 `_tokenId` 无效,抛出异常. URIs在 RFC 3986 定义,
/// URI 也许指向一个 符合 "ERC721 元数据 JSON Schema" 的 JSON 文件
function tokenURI(uint256_tokenId)externalviewreturns(string);}

枚举接口

枚举接口包含了按索引获取到对应的代币,可以提供NFTs的完整列表,以便NFT可被发现。

interface ERC721Enumerable{
/// @notice  NFTs 计数
/// @return  返回合约有效跟踪(所有者不为零地址)的 NFT数量
function totalSupply()externalviewreturns(uint256);/// @notice 枚举索引NFT
/// @dev 如果 `_index` >= `totalSupply()` 则抛出异常
/// @param _index 小于 `totalSupply()`的索引号
/// @return 对应的token id(标准不指定排序方式)
function tokenByIndex(uint256_index)externalviewreturns(uint256);/// @notice 枚举索引某个所有者的 NFTs
/// @dev  如果 `_index` >= `balanceOf(_owner)` 或 `_owner` 是零地址,抛出异常
/// @param _owner 查询的所有者地址
/// @param _index 小于 `balanceOf(_owner)` 的索引号
/// @return 对应的token id (标准不指定排序方式)
function tokenOfOwnerByIndex(address_owner,uint256_index)externalviewreturns(uint256);}

使用Openzeppelin的erc271协议

现在这个不怎么用了。Contract presets are now deprecated in favor of Contracts Wizard as a more powerful alternative。

// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.8.0 <0.9.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol";contract HelloWorld is ERC721URIStorage {using Counters for Counters.Counter;Counters.Counter private _tokenIds; //计数器,用于NTF的编号address private creater; //合约创建者constructor() ERC721("Demo721 of Elwin", "ELW") {creater = msg.sender;mint(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4,"ceshi");mint(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4,"qwqwe");}//产生一个NFT,钱包地址,JSON文件路径function mint(address player, string memory tokenURI) public  returns (uint256){//只有创建者才可以生产NFTrequire(msg.sender==creater,"you are not the creater of the contract!");uint256 newItemId = _tokenIds.current();_mint(player, newItemId);_setTokenURI(newItemId, tokenURI);_tokenIds.increment();return newItemId;}
}

erc20和erc271相关推荐

  1. 【Ethereum】以太坊ERC20 Token标准完整说明

    什么是ERC20 token 市面上出现了大量的用ETH做的代币,他们都遵守REC20协议,那么我们需要知道什么是REC20协议. 概述 token代表数字资产,具有价值,但是并不是都符合特定的规范. ...

  2. erc20 php,使用php将erc20令牌从一个帐户传输到另一个帐户

    ERC20代币转账是如何进行的? 即使erc20合同abi附带了一个内置的传输方法,但这不是如何进行erc20令牌传输.传递令牌的方法涉及正确格式的契约的编码,传递方法语句包括使用keccak算法传递 ...

  3. 用 Parity 发送 ERC20 Token

    Parity 是以太坊的 Rust 实现,它也内置了一个钱包.用过 Parity 的人都知道,用它发送 ETH 非常简单,点几下就行.但是可能不少人还不知道如何发送 ETH 以外的 ERC20 Tok ...

  4. 以太坊代币标准: ERC20、ERC223的介绍与比较

    代币(Token)是区块链中定义价值的方式,用于标定金融或数字资产.在以太坊上,代币使用相同的标准,这样代币之间的兑换和DAPP支持就会变得容易. 什么是ERC20标准 ERC-20 标准是在2015 ...

  5. 圈钱跑路 ERC20 Token 合约代码分析

    ERC20 Token 合约代码分析 合约接口代码 // https://github.com/ethereum/EIPs/issues/20// 接口标准contract ERC20 {functi ...

  6. 圈钱跑路 发行自己的ERC20 Token

    发行自己的ERC20 Token 这次主要实现 发行一个自己的ERC20 标准的 Token. (然后进行ICO, 圈钱跑路, 走上人生巅峰,XD) 其实把Token 叫做代币, 容易让人产生误解.实 ...

  7. ERC20 Short Address Attack

    ERC20 Short Address Attack 什么是ERC20 Application Binary Interface(ABI) ERC20 Short Address Attack 开始攻 ...

  8. api php usdt 以太坊_以太坊智能地址PHP开发包【零GAS归集ERC20】

    SmartWallet开发包适用于平台方高效完成对用户地址上的Ether/ERC20代币的归集工作,无需向用户地址注入Ether即可完成Ether/ERC20代币的归集.官方下载地址:以太坊智能钱包P ...

  9. 以太坊ERC20代币合约案例

    一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...

最新文章

  1. ANT集成SVNANT访问SVN(Subversion)
  2. FreeRTOS之列表和列表项
  3. 【STL源码剖析读书笔记】【第5章】关联式容器之set、map、multiset和multimap
  4. IOS 中runtime 不可变数组__NSArray0 和__NSArrayI
  5. 工业机器人关节拆装流程_机器人走进大学——工业机器人拆装与应用工作站
  6. java实现socket连接,向指定主机指定端口发送socket数据,并获取响应数据
  7. 大中小型项目管理的区别
  8. linux下的文件结构
  9. LeetCode 要记得一些小trick
  10. IT人士易犯4大职业病 鼠标手居第一位
  11. java.lang.IllegalStateException: Web app root system property already set to different value
  12. html怎么隐藏信息,3.2.5 在HTML文件中隐藏信息
  13. 动易 转 html5,动易dedecms数据转成dedecms的php程序
  14. ccfb类会议有哪些_CCF推荐的国际学术会议和期刊目录修订版发布
  15. 2022年安全员-B证题库及答案
  16. IBM System 服务器做RAID步骤
  17. oracle两个字段减法,Oracle 的加减法函数
  18. 每天晚上坚持1500个跳绳,两个月后,身体会有什么变化?
  19. Linux系统入门学习
  20. poj 4005 Moles

热门文章

  1. 拉绳编码器选型要注意的问题
  2. html字体模糊怎么变清晰,电脑WIN7字体模糊怎么变清晰详细步骤
  3. 随机突然黑屏重启解决经验分享(华硕主板)
  4. 亚泰史诗游戏攻略_史诗游戏与苹果大战
  5. TMC2226一款散热性更强的电机驱动芯片
  6. echarts图例默认只显示某几个,其余图例手动控制显示
  7. 应用在飞机的导航系统上的计算机,惯性导航在飞机上的应用
  8. 专访 | 小白也能搭建深度模型,百度EasyDL的背后你知多少
  9. 工作8年,今天被一个新来的实习生上了一课...
  10. 浏览器是如何运作【前端必备】