NFTs have a problem that their metadata can be changed without the owners' permission. In this project, I propose a solution to that. As a trial implementation, I have used Ethereum, Flow, and IPFS.
In general, NFT metadata is stored off-chain, and only its URL is stored on-chain. With ERC721 and ERC1155, it is possible to trace how the URL string has been changed so far, but not the changes in its content. IPFS is a technology that can solve this, as it allows you to trace changes in the metadata content, because the content corresponds directly to the URL. But who can change this: the owner, operator, or minter of the NFT contract? And when will it be changed? The current owner of the NFT, who paid a lot of money for it, has no control over any of this.
There is also another problem. Ethereum's Gas is too expensive these days, so there are more and more products where NFTs can be minted on L2 chains or other chains that connect to Ethereum. What happens to the metadata when NFTs are moved between chains? No one knows the standard way to do that.
I thought that two mechanisms are needed to solve these problems:
In this project, I created a sample web app that allows artists to issue NFTs. The NFTs contain art works. In it, I provide a mechanism for its creator to make proposals for new metadata URI. It will actually change to this new metadata URI only if the current NFT owner approves it. And in order to be able to trace this change, the metadata contains the previous metadata URI. This is, in other words, a chain of metadata.
This time, I have implemented two types of smart contracts. One is Solidity smart contract, and the other is Flow Blockchain one. These implementation examples shown here will go a long way in considering standardization when updating NFT metadata or moving it to another chain.
IPFS (via Fleek)
Store NFT metadata
Build a chain to track metadata changes
React.js (Firebase Hosting)
Node.js (Google Cloud Functions)
Flow Blockchain
NFT Contract
Function to propose new metadata URI
Function to accept new metadata URI
Ethereum
NFT Contract
Function to propose new metadata URI
Function to accept new metadata URI