erc20和erc271
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协议
![](/assets/blank.gif)
现在这个不怎么用了。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相关推荐
- 【Ethereum】以太坊ERC20 Token标准完整说明
什么是ERC20 token 市面上出现了大量的用ETH做的代币,他们都遵守REC20协议,那么我们需要知道什么是REC20协议. 概述 token代表数字资产,具有价值,但是并不是都符合特定的规范. ...
- erc20 php,使用php将erc20令牌从一个帐户传输到另一个帐户
ERC20代币转账是如何进行的? 即使erc20合同abi附带了一个内置的传输方法,但这不是如何进行erc20令牌传输.传递令牌的方法涉及正确格式的契约的编码,传递方法语句包括使用keccak算法传递 ...
- 用 Parity 发送 ERC20 Token
Parity 是以太坊的 Rust 实现,它也内置了一个钱包.用过 Parity 的人都知道,用它发送 ETH 非常简单,点几下就行.但是可能不少人还不知道如何发送 ETH 以外的 ERC20 Tok ...
- 以太坊代币标准: ERC20、ERC223的介绍与比较
代币(Token)是区块链中定义价值的方式,用于标定金融或数字资产.在以太坊上,代币使用相同的标准,这样代币之间的兑换和DAPP支持就会变得容易. 什么是ERC20标准 ERC-20 标准是在2015 ...
- 圈钱跑路 ERC20 Token 合约代码分析
ERC20 Token 合约代码分析 合约接口代码 // https://github.com/ethereum/EIPs/issues/20// 接口标准contract ERC20 {functi ...
- 圈钱跑路 发行自己的ERC20 Token
发行自己的ERC20 Token 这次主要实现 发行一个自己的ERC20 标准的 Token. (然后进行ICO, 圈钱跑路, 走上人生巅峰,XD) 其实把Token 叫做代币, 容易让人产生误解.实 ...
- ERC20 Short Address Attack
ERC20 Short Address Attack 什么是ERC20 Application Binary Interface(ABI) ERC20 Short Address Attack 开始攻 ...
- api php usdt 以太坊_以太坊智能地址PHP开发包【零GAS归集ERC20】
SmartWallet开发包适用于平台方高效完成对用户地址上的Ether/ERC20代币的归集工作,无需向用户地址注入Ether即可完成Ether/ERC20代币的归集.官方下载地址:以太坊智能钱包P ...
- 以太坊ERC20代币合约案例
一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...
最新文章
- ANT集成SVNANT访问SVN(Subversion)
- FreeRTOS之列表和列表项
- 【STL源码剖析读书笔记】【第5章】关联式容器之set、map、multiset和multimap
- IOS 中runtime 不可变数组__NSArray0 和__NSArrayI
- 工业机器人关节拆装流程_机器人走进大学——工业机器人拆装与应用工作站
- java实现socket连接,向指定主机指定端口发送socket数据,并获取响应数据
- 大中小型项目管理的区别
- linux下的文件结构
- LeetCode 要记得一些小trick
- IT人士易犯4大职业病 鼠标手居第一位
- java.lang.IllegalStateException: Web app root system property already set to different value
- html怎么隐藏信息,3.2.5 在HTML文件中隐藏信息
- 动易 转 html5,动易dedecms数据转成dedecms的php程序
- ccfb类会议有哪些_CCF推荐的国际学术会议和期刊目录修订版发布
- 2022年安全员-B证题库及答案
- IBM System 服务器做RAID步骤
- oracle两个字段减法,Oracle 的加减法函数
- 每天晚上坚持1500个跳绳,两个月后,身体会有什么变化?
- Linux系统入门学习
- poj 4005 Moles