# From NFT 1.0 to NFT 2.0: A Review of the Evolution of Non-Fungible Tokens
## 2 Background and Preliminaries
### Ethereum Standards  
The current concept of NFT was first introduced in Ethereum with EIP-721 (Ethereum Improvement Protocol) in 2017 ([[https://eips.ethereum.org/EIPS/eip-721](https://eips.ethereum.org/EIPS/eip-721)]([https://eips.ethereum.org/EIPS/eip-721](https://eips.ethereum.org/EIPS/eip-721)), accessed on 23 May 2023). EIP-721 defines a standard, ERC-721 [42], for unique tokens significantly different from the ERC-20 standard, which is the one adopted by Ethereum for fungible tokens.  
Ethereum's ERC-721 standard contains an interface that must be implemented by a smart contract to let users mint and trade ERC-721-compliant NFTs. NFTs are identified  
Figure 3: NFT key properties.  
by a unique, 256-bit-long, unsigned integer identifier stored inside the smart contract, which cannot change. However, different contracts may use the same identifiers for their tokens, meaning that each NFT can be globally and equivocally identified by the pair (contract_address, tokenId). When a new NFT is minted, some ERC-721 smart contracts [43] find it convenient to use incrementally generated tokenIds for each new NFT; however, no safe assumption can be made because the standard does not set a specific rule for the tokenId creation. On top of that, NFTs may be destroyed on specific occasions, thus requiring additional functions for enumeration [8].  
The interface proposed by the ERC-721 standard provides functionalities to transfer tokens among Ethereum's addresses. The main functions are the following:  
* transferFrom allows the change of ownership of an NFT;
* approve allows the owner of an NFT to let another address transfer the NFT;
* getApproved returns the approved (via the approve function) addresses of an NFT;
* balanceOf returns the number of NFTs owned by an address;
* ownerOf returns the owner address of an NFT.  
On top of the interface that a contract must implement, the ERC-721 also supplies an interface that addresses what must be implemented to receive NFTs, and contains a callback method to handle the receipt of a token being transferred. Optionally, ERC-721 tokens can have a metadata extension that specifies the name and symbol of the tokens, and a function that, given a tokenId as input, returns a JSON object with metadata assigned to a specific token. The JSON object contains the name of the token, and can also contain a URI to a resource tied to the NFT. Examples of resources that can be tied to the NFT are images and gifs, sound and songs, virtual resources and characters, digital items, tickets to physical events, and more.  
Another Ethereum standard is the ERC-1155, called the Multi-Token Standard. It offers the possibility to define \"semi-fungible\" tokens, or in other words, NFTs for which there are multiple circulating copies. While in the ERC-721 standard, a unique ID represents a single asset, in the ERC-1155 standard, a unique ID represents a class of assets. For each class, an additional field represents the number of tokens. All the tokens that have the same ID are interchangeable, and the user can transfer any amount of assets to others ([[https://eips.ethereum.org/EIPS/eip-1155](https://eips.ethereum.org/EIPS/eip-1155)]([https://eips.ethereum.org/EIPS/eip-1155](https://eips.ethereum.org/EIPS/eip-1155)), accessed on 23 May 2023).  
Lastly, ERC-998 is the standard that provides composable tokens. Thanks to this standard, it is possible to group ERC-721 and ERC-20 tokens into specific structures and manage their ownership atomically. A structure has a single owner address and can contain an arbitrary set of fungible and non-fungible tokens. Managing the ownership of such a structure is easier than managing each token individually because the owner can be changed with a single transaction ([[https://eips.ethereum.org/EIPS/eip-998](https://eips.ethereum.org/EIPS/eip-998)]([https://eips.ethereum.org/EIPS/eip-998](https://eips.ethereum.org/EIPS/eip-998)), accessed on 23 May 2023).