ZK (Zero-Knowledge) powered privacy preserving IP-NFT, which enable an IP owner to attach its metadata without revealing a sensitive data.
Smart Contract: Written in Solidity (Framework: Foundry)
Blockchain: EDU Chain (Testnet)
IP-NFT
(Intellectual Property Non-Fungible Token) would provide a secure and immutable proof of ownership for intellectual property on-chain and it is used for a scentific research in DeSci space.
(More details about the concept of IP-NFT is written in the Molecule's document)
When a IP owner would create their IP-NFT contract, the IP owner basically associated with their IP's metadata URI (i.e. IPFS CID
) via the ERC721#`_setTokenUR()`.
(In a case that an IPFS CID
is used as a IP's metadata URI, anyone can know it by calling the ERC721#`tokenURI()` and retrieve it (IPFS CID
) and see it - because it's "public")
However, within the IP's metadata URI (i.e. IPFS CID
), some sensitive information that the IP owner does not want to disclose in public may be included.
For resolving this problem, the ZK (Zero-Knowledge) powered privacy preserving IP-NFT contract can be used.
This ZK-powered privacy preserving IP-NFT contract would enable an IP owner to attach its metadata without revealing a sensitive data thanks to using a ZKP (Zero-Knowledge Proof), which is generated via ZK circuit in Noir (`./circuits/src/main.nr`).
When a ZKP is generated via ZK circuit, a Poseidon Hashed-IPFS CID
will be generated as a public input
. Instead of associating a a public metadata URI (i.e. IPFS CID
), the IP owner can associated the Poseidon Hashed-IPFS CID
with their IP-NFT.
If a third party actor would like to check wether or not an owner is a valid IP owner and a metadada, which is asscoiated with a IP-NFT, is a valid metadata, the IP owner can show their ownership and valid metadata by calling the IPNFTOwnershipVerifier#`verifyIPNFTOwnershipProof()` with ZKP and public inputs (`Poseidon Hashed-IPFS CID`, etc) without disclosing a sensitive data-included in the IPFS CID
.
(NOTE: The IPNFTOwnershipVerifier
contract, which is the on-chain verifier contract for the ZK circuit (`./circuits/src/main.nr`))
1/ A IP owner would generate a new ZKP (Zero-Knowledge Proof) and public input data (`Poseidon Hashed-IPFS CID`, etc) through calling ZK circuit /w IPFS CID
, etc.
(NOTE: At this point, Nullifier
and Merkle Root
will also generated as public inputs
).
(NOTE: This step 1/ is an "off-chain" process)
2/ The IP owner would create/deploy a new IP-NFT contract via the IPNFTFactory#`createNewIPNFT()`.
3/ The IP owner would mint a new tokenID of IP-NFT /w the ZKP and public inputs, which was generated when the step 1/ through calling the IPNFT#`mintIPNFT()` /w the ZKP and public inputs.
- At this point, a given Poseidon Hashed-IPFS CID
, which is one of public inputs, will internally be associated with the tokenID of IP-NFT to be minted.
4/ If a third party actor would like to check wether or not an owner is a valid IP owner and a metadada, which is asscoiated with a IP-NFT, is a valid metadata, the IP owner can show their ownership and valid metadata by calling the IPNFTOwnershipVerifier#`verifyIPNFTOwnershipProof()` with ZKP and public inputs (`Poseidon Hashed-IPFS CID`, etc) without disclosing a sensitive data-included in the IPFS CID
.
MVP of the ZK circuit in Noir and smart contracts in Solidity has been done.
None.