一、什麼是ERC-721標準
ERC-721標準是以太坊網絡上的一個智能合約標準,用於實現不可替代代幣(NFT)。2017年11月,由OpenZeppelin開發人員William Entriken及Fabian Vogelsteller發起提案,頗受社區認可,被視為加密貨幣領域的一項重要突破。
與傳統的ERC-20代幣不同,ERC-721的每一個代幣都是獨一無二的,不能互相替代。這種特性使得ERC-721適用於數字資產領域,比如遊戲中的人物、武器等虛擬道具,以及藝術品、證券等實物資產的數字版權。
代碼示例:
contract ERC721 { 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); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function getApproved(uint256 _tokenId) external view returns (address); function setApprovalForAll(address _operator, bool _approved) external; function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
二、ERC-721標準的優勢
相對於傳統的數字代幣,不可替代代幣具有以下優勢:
1、獨特性:每一個代幣都是唯一的,不能被互相替代,這大大增強了數字資產的價值感。
2、靈活性:ERC-721標準允許代幣的擁有者進行自由的轉移、銷毀和創建,不同於傳統的代幣需要獲得授權進行操作。
3、便捷性:ERC-721標準規定了代幣的基本功能,減少了上層應用的開發難度,使得數字資產可以更容易地被應用到各種領域。
代碼示例:
pragma solidity ^0.6.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract MyNFT is ERC721 { constructor() public ERC721("MyNFT", "MNFT") {} }
三、ERC-721標準的應用案例
1、數字藝術品領域:近年來,越來越多的藝術家藉助ERC-721標準,將自己的作品發行為數字藝術品,並通過區塊鏈技術確保其版權和流通性。
2、遊戲領域:ERC-721標準為遊戲廠商提供了一種新的籌款方式,即通過發行遊戲內道具的數字版權來獲得資金,從而支持遊戲的開發。
3、房地產領域:ERC-721標準也可以應用於房地產領域,使得房產的所有權變得更加清晰和透明。例如,通過將房地產轉化為數字代幣,可以更方便地進行交易和管理。
4、證券領域:ERC-721標準還可以用於證券領域,以實現更高效和便捷的證券交易,從而為更多的投資者開放投資市場。
代碼示例:
pragma solidity ^0.6.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract MyRealEstate is ERC721 { mapping(address => uint256[]) private _ownedTokens; mapping(uint256 => uint256) private _ownedTokensIndex; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor() public ERC721("MyRealEstate", "MRE") {} function mint(address to, uint256 tokenId) public { _mint(to, tokenId); } function _mint(address to, uint256 tokenId) internal virtual override { super._mint(to, tokenId); _ownedTokens[to].push(tokenId); _ownedTokensIndex[tokenId] = _ownedTokens[to].length - 1; } function transferFrom( address from, address to, uint256 tokenId ) public virtual override { super.transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { uint256 lastTokenIndex = _ownedTokens[from].length - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; _ownedTokensIndex[lastTokenId] = tokenIndex; } _ownedTokens[from].pop(); } function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokens[to].push(tokenId); _ownedTokensIndex[tokenId] = _ownedTokens[to].length - 1; } function ownedTokens(address user) public view returns(uint256[] memory) { return _ownedTokens[user]; } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238263.html