# Why you can't update a CID and how to do it.
A CID (Content IDentifier) is the hash of the content of the files so if you change the content the CID must change.
# But how to do it anyway
The goal should to not share a CID but share something else that points to a CID that is updatable.
## IPNS
IPNS (InterPlanetary Naming System) is a stack that allows to create things that points to a CID, so you instead of updating the CID you update the IPNS address,
IPNS supports multiple resolving technology.
- [IPNS records](https://docs.ipfs.io/concepts/ipns/#interplanetary-name-system-ipns)
- [ENS](https://docs.ipfs.io/how-to/websites-on-ipfs/link-a-domain/#ethereum-naming-service-ens)
- [DNSLink](https://docs.ipfs.io/how-to/websites-on-ipfs/link-a-domain/#domain-name-service-dns)
## Using CIDs with Smart Contracts
If your application is already receiving the CID from a smart contract (like an NFT for example).
You can just use smart contract logic to update the CID you give to peoples.
For example many NFTs has a function looking like this (python pseudocode) :
```py
def tokenURI(this, tokenID: uint256) -> string:
return this.baseURI + str(tokenID) + ".json"
````
So this function just grabs `baseURI` from the storage of the contract and appends the token id and `.json` extension, which is a metadata file for the NFT.
This will return something like this : `ipfs://Qmfoo/1234.json` for the NFT ID `1234`.
So you can just add a setter function that updates `this.baseURI`:
```py
def setBaseURI(this, newBaseURI: string):
require(msg.sender == this.owner)
this.baseURI = newBaseURI
```
So basically we just updated what we use to construct our tokenURI for our NFT returning a **new CID**.
So if I do `contract.setBaseURI("ipfs://Qmbar/")`, `tokenURI` will now return `ipfs://Qmbar/1234.json` instead of `Qmfoo`.
### --- Link the video NFT example about how to do it in remix ! ---