onflow / flow-nft

The non-fungible token standard on the Flow blockchain
https://onflow.org
The Unlicense
465 stars 169 forks source link

Metadata Views: Full License View #106

Open joshuahannan opened 2 years ago

joshuahannan commented 2 years ago

Issue To Be Solved

Flow is working with governments to define a standard for how NFT projects can define licensing rights for NFTs that define permissions for what can be done with them and their metadata by the owner. The current License view does not sufficiently cover the needs for a full license view, so we would like to define a new one that projects can start using.

Suggest A Solution

We'll post and discuss more in this issue

bluesign commented 2 years ago

is this Dapper Labs as Flow Team, or Dapper Labs as Dapper Wallet ? ( called Dapper Studio I guess if not different entity) or is it Dapper Labs as Dapper Foundation ?

In general I don't have problem with this issue, but I feel like that this can be used as a stepping stone of license enforcement on Flow Blockchain ( by Flow Protocol or Service Account ), so I think it would be nice to make that clear from the beginning.

joshuahannan commented 2 years ago

@psiemens @EricLin2004 Would you be able to elaborate a bit more on what is required for this? I want to make sure this is pretty clear

joshuahannan commented 2 years ago

Here are two documents that our legal team has put together for how we envision this. I'll try to respond again later this week with some ideas for how I might want to implement this but any ideas or feedback in the meantime is appreciated. :)

joshuahannan commented 2 years ago
Screen Shot 2022-07-18 at 2 19 45 PM
joshuahannan commented 2 years ago

Screen Shot 2022-07-18 at 2 22 59 PM Screen Shot 2022-07-18 at 2 23 11 PM

bluesign commented 2 years ago

This is very good idea, as long as Flow Team ( blockchain ) does not enforce this, just for user information and user trust, I think it will be beneficial to ecosystem.

But from the look of the chart seems grouping is not so well.

If we exclude the full ownership for a second:

We can summarize with 2 questions:

I think very poorly designed tbh. Maybe even multiple badges can cover better. ( e.g. base & commercial & voting )

Even technically those rights can be interfaces, and can be combined later. Or you can maybe upgrade your NFT later for another license.

joshuahannan commented 2 years ago

We can summarize with 2 questions: Do you want commercial license? ( no / limited / unlimited ) Do you want additional utility? ( Voting / Content / Skip ) I think very poorly designed tbh. Maybe even multiple badges can cover better. ( e.g. base & commercial & voting )

Are you saying that instead of indicating which group an NFT belongs to in this view, we just provide answers to these two questions with an enum or something? It isn't clear what you are suggesting.

"subject to potential approval of content creator" I think here can be a little push on the content provider side.

Can you elaborate here? I'm not sure what you mean

bluesign commented 2 years ago

Are you saying that instead of indicating which group an NFT belongs to in this view, we just provide answers to these two questions with an enum or something?

I meant If we want to make a generic license view, we should have an array of granted permissions on chain, rest should be up to dapp to show. e.g coloring/badging

Something like this:

License( name='Base NFT License' , rights=
[
   LicenseGrant(Code: License.PERSONAL, Text: 'Use content for personal use', Link: HttpLink('https://license.dapperlabs.com/personal')),
   LicenseGrant(Code: License.RESELL, Text: 'Resell short description', Link: HttpLink('https://license.dapperlabs.com/personal')),
])

Can you elaborate here? I'm not sure what you mean

Content providers will rarely grant this, so it is better to make this separate right. I mean License View should describe in full, it should not leave part like: " depends on provider "

psiemens commented 2 years ago

This is very good idea, as long as Flow Team ( blockchain ) does not enforce this, just for user information and user trust, I think it will be beneficial to ecosystem.

Definitely not something we'd enforce, just an optional tool for NFT developers.

I meant If we want to make a generic license view, we should have an array of granted permissions on chain, rest should be up to dapp to show. e.g coloring/badging

I was imagining something simpler: just a name, optional text and link rather than having all the different components of the license on the chain. A user would have to download the linked license (or read the text) to understand all the parts. Reason being that I'm not sure every license (now and in the future) can be so nicely (and legally) split into pieces.

But I'm not a lawyer! I'll get an opinion from the lawyers who drafted the framework above.

turbolent commented 2 years ago

Maybe the existing license metadata should be renamed to indicate it is a software license?

I really like the idea of machine-readable license information. It would be great to have a Rights Expression Language for Cadence.

The Creative Commons organization has done a lot in this space over the years, maybe we can adopt their ccREL?

W3C's ODRL looks even more expressive.

psiemens commented 2 years ago

I clarified a few things based on the discussion here.

joshuahannan commented 2 years ago

So what I am hearing from the discussion here is that we can do something simple like @psiemens suggests, but it would still be good to have the information accessible on chain, like @bluesign says:

Here is a basic view structure that might work. let me know if I am not understanding something properly here

pub enum LicenseCategory {
    pub case PERSONAL
    pub case VOTING
    pub case CONTENT
    pub case LIMITED_COMMERCIALIZATION
    pub case UNLIMITED_COMMERCIALIZATION
    pub case FULL_OWNERSHIP
}

// Not sure what to name it here
pub struct NFTLicenseInfo {

    pub let rights: LicenseCategory

    pub let description: String

    pub let httplink: HTTPLink?

    pub let ipfslink: IPFSLink?

    init(category: LicenseCategory) {
        switch LicenseCategory {
        case PERSONAL:
            self.description = "Use content for personal use"
            self.httplink = HttpLink('https://license.dapperlabs.com/personal')
            self.ipfslink = IPFSfile(....)
         case VOTING:
            self.description = "Use for voting purposes"
            ...
            ...
            /// and so on and so forth

}

pub fun getLicenseInfo(category: LicenseCategory): NFTLicenseInfo {

    return NFTLicenseInfo(category: category) 

}

// The actual view that the view resolver could return
pub struct NFTLicenses {
    pub let rights: [NFTLicenseInfo]
}
satyamakgec commented 2 years ago

So what I am hearing from the discussion here is that we can do something simple like @psiemens suggests, but it would still be good to have the information accessible on chain, like @bluesign says:

Here is a basic view structure that might work. let me know if I am not understanding something properly here

pub enum LicenseCategory {
    pub case PERSONAL
    pub case VOTING
    pub case CONTENT
    pub case LIMITED_COMMERCIALIZATION
    pub case UNLIMITED_COMMERCIALIZATION
    pub case FULL_OWNERSHIP
}

// Not sure what to name it here
pub struct NFTLicenseInfo {

    pub let rights: LicenseCategory

    pub let description: String

    pub let httplink: HTTPLink?

    pub let ipfslink: IPFSLink?

    init(category: LicenseCategory) {
        switch LicenseCategory {
        case PERSONAL:
            self.description = "Use content for personal use"
            self.httplink = HttpLink('https://license.dapperlabs.com/personal')
            self.ipfslink = IPFSfile(....)
         case VOTING:
            self.description = "Use for voting purposes"
            ...
            ...
            /// and so on and so forth

}

pub fun getLicenseInfo(category: LicenseCategory): NFTLicenseInfo {

    return NFTLicenseInfo(category: category) 

}

// The actual view that the view resolver could return
pub struct NFTLicenses {
    pub let rights: [NFTLicenseInfo]
}

I like the idea of keeping it simple, however, It seems confusing to me when we divide the license category as per the voting or whatnot. I like the idea of @bluesign, where the license can be broadly divided into two categories, and we can have subcategories. ex - Utility (voting/content/skip). Right now, it is a flat structure that can also work unless it creates confusion

satyamakgec commented 2 years ago

@joshuahannan, I think we need to look into this as well. Today a16z released this https://a16zcrypto.com/introducing-nft-licenses/ they are using what @turbolent proposes creative common stuff.

satyamakgec commented 2 years ago

@joshuahannan, I think we need to look into this as well. Today a16z released this https://a16zcrypto.com/introducing-nft-licenses/ they are using what @turbolent proposes creative common stuff.

They have more or less the same as what we have above.

jrkhan commented 2 years ago

I believe this might be well outside the scope of the current proposal, but leaving room for further elaboration on "derivative works" might be helpful (a separate view perhaps?). I believe there's an opportunity to facilitate licensing of IP through smart contracts, and having a more expressive language for this would likely be helpful. Pie in the sky examples:

While I understand it's likely outside the scope of this proposal, I believe a more expressive language for granting derivative works rights would be helpful, and hoping we can find a way to represent this as a gray area here in the short term in cases where content creators are not satisfied with a bool.

bjartek commented 2 years ago

Maybe the existing license metadata should be renamed to indicate it is a software license?

That was never the intention from my part. The intention was always that the view was content lisence and that you should use relevant identifiers in SPDX that are content based like https://spdx.org/licenses/CC-BY-4.0.html.

bjartek commented 2 years ago

Another relevant post popped up recently https://a16zcrypto.com/introducing-nft-licenses/

bjartek commented 2 years ago

Another aspect to all of this that I personally feel is important is the mutability of said license. Changing the license of an NFT is problematic at best horrible at worst. There are examples on projects doing this in ETH and it was nasty.

bjartek commented 2 years ago
> pub struct NFTLicenseInfo {
>     pub let httplink: HTTPLink?
> 
>     pub let ipfslink: IPFSLink?

>

the links should be MetadataViews.Media here IMHO, as they have both a file/url and a content/type. Somebody might want to store a PDF version in ipfs and a html/plan-text version in http.

bluesign commented 2 years ago

Another aspect to all of this that I personally feel is important is the mutability of said license. Changing the license of an NFT is problematic at best horrible at worst. There are examples on projects doing this in ETH and it was nasty.

I think mutable is the correct way legally although I agree with you totally on problematic side.

Btw @psiemens can we invite some ecosystem people ( like Dapper Studio etc ) to this discussion directly ? I mean obviously licenses are designed to protect their rights, not user’s

bjartek commented 2 years ago

I also think we kind of need mutability, but should we have some way then to track when this license was changed? and have a version to check when the previous version was added or something?

bjartek commented 1 year ago

This view would be very useful for Doodles, can we try to get this through the door?

bluesign commented 1 year ago

Yeah covers #150 too @bjartek , I think minimal solution is the best for start, we can call it SimpleLicenseView or something, with grants inside

bjartek commented 1 year ago

I would think so yes

joshuahannan commented 1 year ago

Yeah, I'm pinging the relevant people to see if any of their ideas have changes and I'm gonna get them to join in the conversation on this thread as well. I also closed #150 so we can concentrate discussion here.

franklywatson commented 1 year ago

Hi All,

Flow core team is seeking legal guidance on NFT licenses and we believe that a standard view for licenses declared by the NFT minter remains the right path forward. We will be calling for a community working group to advance this topic forward once we have more clarity but this is one of the top priorities for the ecosystem. We will soon follow up with an update on our proposal for licensing in NFT views and then brainstorm in the working group. We recognize that, despite the options, licenses won’t be right for every project, and that the licensing needs of projects will change as rapid innovation tirelessly drives the space in new directions. Thanks for your patience

louisguitton commented 1 year ago

Flow core team is seeking legal guidance on NFT licenses and we believe that a standard view for licenses declared by the NFT minter remains the right path forward. We will be calling for a community working group to advance this topic forward once we have more clarity but this is one of the top priorities for the ecosystem.

My legal counsel colleague might be able to help @franklywatson. I'll DM you.

joshuahannan commented 1 year ago

@albeethekid Shared a new proposal that the Flow team is working on with Creative Commons for NFT Licenses. We'd like to utilize some of what we've discussed here to make the standard metadata view for this initiative, but we want to make sure that the proposal itself is sound before we do too much technical work on the view. Please leave any feedback you have about the core proposal in the forum post.

Also, If you'd like to take a stab at implementing the metadata view based on this, please share your ideas here and we'll be happy to support you! If nobody volunteers to lead this, the Flow team will make some proposals.

Thanks for your support!

joshuahannan commented 1 year ago

I posted a new PR with the license proposal based off Bjarte's that I am looking for feedback on: https://github.com/onflow/flow-nft/pull/173