Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-5553: 知识产权及其版税结构的表示

一种在链上表示知识产权及其各自版税结构的方法

Authors Roy Osherove (@royosherove)
Created 2022-08-17
Discussion Link https://ethereum-magicians.org/t/eip-5553-representing-intellectual-property-on-chain-with-royalty-rights/10551
Requires EIP-20, EIP-721

摘要

本提案介绍了一种在链上表示知识产权的通用方法,以及一种改进的版税表示机制和相关的元数据链接。此标准不与特定类型的 IP 相关联,可以代表多种类型的 IP,例如音乐 IP、视频、书籍、图像等。 该标准保持非常通用,以允许行业发展新的生态系统,这些生态系统都可以在其核心依赖于相同的基本标准。

此标准允许市场参与者: 1) 观察知识产权的规范链上表示 2) 发现其附加的元数据 3) 发现其相关的版税结构 4) 这将能够在未来为知识产权资产构建注册、许可和支付机制。

动机

除了使用传统的 NFT 之外,没有被接受的标准机制来许可知识产权或代表它。然而,常规 NFT 仅代表收藏品用例,并且不能轻易地代表更复杂的用于不同类型用途的 IP 许可用例。 如果我们可以做到以下几点,我们就可以启用这种许可机制:

1) 声明 IP 存在,与购买能力分开 2) 声明可能存在的多个相关方以获得此类 IP 的付款

对于 1,今天没有标准存在。

对于 2,传统的拆分标准存在,基于 NFT 购买或通过诸如 0xsplits 之类的机制。虽然这些解决了主要问题,但它们不包含命名多种类型的协作参与者的能力。

规范

本文档中的关键词“必须”,“不得”,“必需”,“应”,“不应”,“应该”,“不应该”,“推荐”,“可以”和“可选”应按照 RFC 2119 中所述进行解释。

想要在链上表示 IP 的合约必须实现 EIP-721 和本提案

此标准使用以下 IIPRepresentation (简称 IPR) 接口扩展 EIP-721。 此标准的实施者必须具有以下所有功能:

royaltyPortionTokens() 函数

此函数必须返回与 EIP-20 token 相关的地址数组,这些 token 必须代表不同类型相关方的版税部分。这些版税部分 token 提供了一种更精细和简化的方式来声明 IP 创建的多个协作参与者的版税拆分。

例如,对于音乐 IP,我们可能有两个 token,分别代表作曲/写作/出版版税部分和录音/母带部分。这些版税部分 token 会分发给协作参与者,并且可以稍后由各个持有者查询以分配版税。也就是说,如果一个人持有版税部分 token 的 10%,则该持有人将获得与该版税类型相关的财务分配的 10%。

metadataURI() 函数

此函数必须返回指向包含 IP 所需任何元数据的元数据文件的 URI,或者返回一个空字符串。每种 IP 类型可以单独实施其元数据标准。该文件必须托管在 IPFS、Arweave 或其他去中心化的内容寻址系统中,在该系统中,文件的内容在不更改 URI 的情况下不可更改。

changeMetadataURI() 函数

此函数允许更改元数据 URI 以指向元数据文件的新版本。如果成功调用此函数必须触发事件 MetadataChanged

ledger() 函数

此函数必须返回注册表或注册商合约地址或初始化 IP 和关联版税 token 的 EOA 帐户。IP 表示可以由不同的参与者在多个地方注册以用于不同的目的。此函数使市场参与者能够发现哪个注册机制是 IP 的父级,并且可能具有管理 IP 的特殊访问权限。

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.9;
import '@openzeppelin/contracts/interfaces/IERC165.sol';


///
/// @dev Interface for Intellectual Property Representation
/// 知识产权表示的接口
interface IIPRepresentation is IERC165 {
    
    /// @notice Called with the new URI to an updated metadata file
    /// 使用更新的元数据文件的新 URI 调用
    /// @param _newUri - the URI pointing to a metadata file (file standard is up to the implementer)
    /// 指向元数据文件的 URI(文件标准由实施者决定)
    /// @param _newFileHash - The hash of the new metadata file for future reference and verification
    /// 新元数据文件的哈希值,供将来引用和验证
    function changeMetadataURI(string memory _newUri, string memory _newFileHash) external ;

    /// @return array of addresses of ERC20 tokens representing royalty portion in the IP
    /// 返回代表 IP 中版税份额的 ERC20 token 的地址数组
    /// @dev i.e implementing ERC5501 (IRoyaltyInterestToken interface)
    /// 即实现 ERC5501(IRoyaltyInterestToken 接口)
    function royaltyPortionTokens() external view returns (address[] memory) ;

    /// @return the address of the contract or EOA that initialized the IP registration
    /// 返回初始化 IP 注册的合约或 EOA 的地址
    /// @dev i.e., a registry or registrar, to be implemented in the future
    /// 例如,注册表或注册商,将在未来实施
    function ledger() external view returns (address) ;

    /// @return the URI of the current metadata file for the II P
    /// 返回 II P 的当前元数据文件的 URI
    function metadataURI() external view returns (string memory) ;

    /// @dev event to be triggered whenever metadata URI is changed
    /// 元数据 URI 更改时触发的事件
    /// @param byAddress the addresses that triggered this operation
    /// 触发此操作的地址
    /// @param oldURI the URI to the old metadata file before the change
    /// 更改前旧元数据文件的 URI
    /// @param oldFileHash the hash of the old metadata file before the change
    /// 更改前旧元数据文件的哈希值
    /// @param newURI the URI to the new metadata file 
    /// 新元数据文件的 URI
    /// @param newFileHash the hash of the new metadata file 
    /// 新元数据文件的哈希值
    event MetadaDataChanged(address byAddress, string oldURI, string oldFileHash, string newURI, string newFileHash);
}

原理

返回 EIP-20 token 数组呈现了更强大的版税份额结构/

当前的版税实施仅处理一种版税支付类型:NFT 销售。它们还只允许一种版税类型 - 即,音乐 NFT 不能在不同的场景中向不同的人支付费用。 换句话说,目前,无论所有相关方的购买或许可交易类型如何,版税拆分的工作方式都相同。

有了这个提案,允许多种类型的版税场景。一个经典的案例是音乐产业,我们有写作/作曲版税和录音/母带版税。不同的许可类型将根据不同的情况向不同的方支付不同的百分比。

在歌曲翻唱的情况下,可以创建一个许可支付公式,以便 a) 原始 IP 的作者因使用歌曲的歌词或作曲而获得报酬 b) 原始歌曲的录音艺术家不获得报酬,因为未使用其录音 c) 新 IP 的录音艺术家将获得报酬 d) 翻唱的创作者没有写作版税。

此外,此 EIP 具有连接到所有类型版税类型的单一结构,并允许更轻松地找到它们。 最后,移动 EIP-20 token 比管理 0xsplits 合约容易得多。

将 IP 合约与可收藏和许可 NFT 分离可以扩展许可类型

通过将 IP 的规范版本与其各种许可用途(NFT 购买、流媒体、艺术品使用等)分离,此 EIP 引入了一条发展各种许可类型和支付分配的生态系统的路径。 换句话说,当人们使用此方案时,他们不会从创建音乐 NFT 或艺术 NFT 开始;他们从创建 IP 表示开始,然后为其创建各种类型的许可或收藏品,每种都作为其自己可销售的 NFT。

指向 IP 元数据的单个指针

IPR 指向托管在 IPFS 或 Arweave 中的元数据,并允许以简单且标准的方式更改和跟踪更改。如今,唯一的元数据标准是 NFT 元数据扩展,但不可能知道该文档遵循哪个标准。通过不同的 IP 类型,可以制定针对不同 IP 类型的不同元数据标准,并且可以简单,轻松地发现附加的元数据。

参考实现

基于 IIPRepresentation 实施音乐 IP 表示(简称 MIPR)

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.9;
import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import "./interfaces/IIPRepresentation.sol";
import "./interfaces/Structs.sol";


contract MusicalIP is ERC721, IIPRepresentation {
    address public songLedger;
    address public compToken;
    address public recToken;
    string public metadataURI;
    string public fileHash;
    uint256 public tokenId;
    bool public activated =false;

    function supportsInterface(bytes4 interfaceId) public view virtual override( ERC721, IERC165) returns (bool) {
        return
            interfaceId == type(IIPRepresentation).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function getInterfaceId() public pure returns (bytes4){
        return type(IIPRepresentation).interfaceId;
    }

    constructor (
        uint256 _tokenId,
        address _songLedger,
        SongMintingParams memory _params,
        address _compAddress,
        address _recAddress
        )
    ERC721(_params.shortName, _params.symbol){

        songLedger = _songLedger;
        compToken = _compAddress;
        recToken = _recAddress;
        metadataURI = _params.metadataUri;
        fileHash = _params.fileHash;
        tokenId = _tokenId;
        
        _safeMint(_songLedger, _tokenId);
        emit Minted(_params.shortName,_songLedger,_compAddress,_recAddress,_msgSender(),tokenId,_params.metadataUri);
    }

    function changeMetadataURI(string memory _newURI,string memory _newFileHash) public 
     {
        string memory oldURI = metadataURI;
        string memory oldHash = fileHash;
        metadataURI = _newURI; 
        fileHash = _newFileHash;
        
        emit MetadataChanged(oldURI, oldHash,_newURI,_newFileHash);
    }
    
    function royaltyPortionTokens() external view returns (address[] memory) {
        address[] memory items = new address[](2); 
        items[0] = compToken;
        items[1] = recToken;
        return items;
    }
    function ledger() external view returns (address) {
         return songLedger;
    }

    event MetadataChanged(
        string  oldUri, string oldFileHash,
        string  newUri, string newFileHash
        );
    event Minted(
        string  abbvName,
        address ledger,
        address compToken,
        address recToken,
        address creator,
        uint256 tokenId,
        string metadataUri
        );
}



使用简单的歌曲注册合约部署新的音乐 IP

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/utils/Counters.sol";
import "./MusicalIP.sol";
import "./CompositionRoyaltyToken.sol";
import "./RecordingRoyaltyToken.sol";


contract SimpleSongLedger is IERC721Receiver {
    using Counters for Counters.Counter;
    Counters.Counter private mipIds;
      function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

    function mintSong(SongMintingParams memory _params) public {
        CompositionRoyaltyToken comp = new CompositionRoyaltyToken(address(this),"SONGCOMP","COMP");
        RecordingRoyaltyToken rec = new RecordingRoyaltyToken(address(this),"SONGREC","REC");
        mipIds.increment();

        MusicalIP mip = new MusicalIP(
                                        mipIds.current(),
                                        address(this),
                                        _params,
                                        address(comp),
                                        address(rec)
                                    );
    }
}


安全考虑

攻击者可能会说服版税份额 token 的持有者将这些 token 发送给他们,并在各种 IPR 中获得版税份额,这可能存在潜在的安全挑战。但是,这些并非版税特有的,而是 EIP-20 token 的常见问题。

在 IP 注册所有权的情况下,建议注册合约拥有 IP 注册,该注册将不可转让(帐户绑定到创建它的注册表)。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Roy Osherove (@royosherove), "ERC-5553: 知识产权及其版税结构的表示 [DRAFT]," Ethereum Improvement Proposals, no. 5553, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5553.