GET Protocol – General Smart Contract Specification – getNFT – GET协议-通用智能合约规范-getNFT区块链毕设代写

区块链毕设代写本文提供国外最新区块链项目源码下载,包括solidity,eth,fabric等blockchain区块链,GET Protocol – General Smart Contract Specification – getNFT – GET协议-通用智能合约规范-getNFT区块链毕设代写 是一篇很好的国外资料

GET Protocol – General Smart Contract Specification – getNFT

Contract overview and definition of the GET Protocols getNFTs. Allowing P2P trading of smart tickets, lending and more. In this repo the conceptual and achritectual documentation of the GET Protocol is maintained and updated. The code in this repo is only a small part of the tech stack of the GET Protocol.

High Level Overview GET Protocol GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT Custody (the HD wallet infrastructure) and engine (the tx processing and logic board) are still closed-source. This repository is the asset_factory. At the moment the GET Protocol is issuing getNFT assets on the blockchains Ropsten (Ethereum Testnet), BSC Testnet (Binance Smart Chain) and for all Korean ticketing and services the Klaytn Blockchain (mainnet).

Definition of a getNFT asset

The GET Protocol offers a toolsel to make (event) tickets interoperable, liquid and securitizable. Tickets are digital rights of entry. Hence. the crypto address that owns a getNFT at the moment the event scanning starts, is the entity that will be able to use the ticket to enter the venue.

The getNFT is thus a transferrable digital right. These tickets/getNFTs will have a value on the secondary market. The contract logic described in the repo, allow for getNFTs to be traded and exchanged between Ethereum/Klaytn/BSC addresses/users.

getNFT is compliant with the ERC721 standard. getNFT adopts the following interfaces:

  • IERC721
  • IERC721Metadata
  • IERC721Enumerable
  • IERC721Receiver

Besides the standard function and features the getNFT has several special functions and metadata contracts allowing it to be used for the rather specialized smart ticketing usecase. The code of these custom functions is found in the following contracts:

  • ERC721_TICKETING_V2.sol
  • MetaDataTE.sol
  • OrderbookBuyers.sol
  • OrderbookSellers.sol

API Documentation for ticketIssuers (Ticketeers)

The GET Protocol offers for ticketIssuers an API interface to pass on the activity on their systems to the blockchain twin of the issued tickets. Provided links below detail the API interface for ticketeers:

  • GETProtocol getNFT Interface

  • GETProtocol getNFT Callbacks

It is for the public not possible to interact with these API endpoints. getNFTs owners that want to move their getNFTs and that have access to their private keys, are able to use their own wallet to interact with their assets.

GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT


1. getNFT Asset Specification

The getNFT contract(ERC721_TICKETING_V2) processes all the requests from the getNFT engine. The primary rol of the getNFT engine & its contracts is to manage the exchange/trading of getNFTs as instructed by the ticketissuer.

Note: integrators/ticketissuers do not need to understand or study or adopt this data specification. The getNFT engine will handle all data and convert it in the right format for the getNFT smart contract to process.

The ticketing usecase requires several custom variables and datafields. The tables below will break down these variables per metadata category.

1 A. Identity variables specification

Data fields on ownership of getNFTs.

Var Description Type
destinationAddress The to-be/intended future owner of a getNFT asset. address
originAddress The current/past owner of a getNFT asset. address
ticketIssuerAddress The address of the ticketissuer that has issued the getNFT. address
1 B. Metadata variables specification

Data fields describing metadata of getNFTs.

Var Description Type
ticketMetadata Data field pointing/reference set by ticketissuer (no rules set by protocol). string
eventAddress Address of the event the getNFT asset belongs to set by custody. address
statusNft Metadata field specifying if getNFT is scanned. True = scanned, False = unscanned. bool
1 C. Internal variables specification

Variables that are used internally in the getNFT contact.

Var Description Type
nftIndex Internal reference/pointer to the asset in the smart contract. uint256
_timestamp Data field pointing to a certain ticket/asset of the issuer. string
onlyRelayer Solidity modifier. Only addresses that are registered as a ‘relayer’ can access this func. msg.sender (address)
onlyMinter Solidity modifier. Only addresses that are registered as a ‘relaminteryer’ can access this func. msg.sender (address)

2. getNFT Ownership Functions Specification

The getNFT contract manages the ownership and metadata management of event-assets on-chain. The getNFT engine (and its blockchain nodes) have access to the GET Protocol custody vault. This system holds all the HD wallets derivations of all the users in the system that prefer to have their keys managed by a specialized third party.

A. primaryMint: Issuance of getNFT to address. This action is triggered when a ticket is sold to a fan/user. Triggering the creation of the digital twin of the ticket.

B. secondaryTransfer: Secondary market/P2P getNFT ownership change This action is triggered when a ticket is resold/traded between fans.

C. scanNFT: Validation of getNFT by scanner/issuer This action is triggered when a ticket is scanned validated.

Functions A, B & C can only be called by whitelisted addresses(see section 3 of this documentation covering modifiers). If an getNFT owner wants to interact directly with their NFT, they can use the ERC721 functions (meaning, safeTransferFrom, approve, ownerOf etc). The getNFT is still completely compatable with the ERC271 standard, what makes a getNFT different is that it includes several ‘custom’ functions that allow ticketIssuers to move getNFTs as the data-base twin of the ticket changes state/hands.

A1. primaryMint (OLD V0)

Mint a new getNFT to a destinationAddress(address of buyer of the getNFT). The function will return the nftIndex (uint256) of the issued getNFT.

    function primaryMint(address destinationAddress, address ticketIssuerAddress, address eventAddress, string memory ticketMetadata) public onlyMinter returns (uint256) {

This function will emit the following event to the event-log of the GET Factory contract: txPrimaryMint(destinationAddress, ticketIssuerAddress, nftIndex, _timestamp).

The values passed in the ticketIssuerAddress, eventAddress and ticketMetadata are stored immutably in the metadata fields of the ERC721 asset.

GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT

B. secondaryTransfer

If a ticket is resold to a other address this function is triggered. The getNFT custody uses a fresh wallet for each getNFT. The originAddress needs to be the owner of a getNFT for this function to be successful.

    function secondaryTransfer(address originAddress, address destinationAddress) public onlyRelayer;

This function will emit the following event: txSecondary(originAddress, destinationAddress, getAddressOfticketIssuer(nftIndex), nftIndex, _timestamp).

GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT

C. scanNFT

Function that sets the _nftScanned metadata field to true in the getNFT. This is an immutable action. The getNFT remains transferrable after this action.

    function scanNFT(address originAddress) public onlyRelayer;

This function will emit the following event: emit txScan(originAddress, destinationAddress, nftIndex, _timestamp);. As of now validating a ticket is immutable.

GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT


3. Contract Modifiers

To manage acces the contract uses the RoleManager modules from open zeppelin.

  1. Minter/Admin: Set contract variables, proxy adminstration, add/remove addresses to access control etc.
  2. Relayer: Mint NFFs, move NFTs, store metadata in getNFTs etc

In the first versions of the GET Protocol contracts these addresses will be managed and maintained by the GET Protoocol foundation.


4. getNFT Contract Events Emitted (Ticket Explorer)

Events emitted by ERC721_TICKETING_V2

    event txPrimaryMint(address indexed destinationAddress, address indexed ticketIssuer, uint256 indexed nftIndex, uint _timestamp);     event txSecondary(address originAddress, address indexed destinationAddress, address indexed ticketIssuer, uint256 indexed nftIndex, uint _timestamp)     event txScan(address originAddress, address indexed ticketIssuer, uint256 indexed nftIndex, uint _timestamp);     event doubleScan(address indexed originAddress, uint256 indexed nftIndex, indexed uint _timestamp);

Event log of ERC721_TICKETING_V2:

  • txPrimaryMint: Primary market ticket sold/issued.
  • txSecondary: Secondary market ticket traded/shared.
  • txScan: Ticket scanned/validated.
  • doubleScan: An already valid ticket was scanned again.

Events emitted by MetaDataTE

    event newEventRegistered(address indexed eventAddress, string indexed eventName, uint indexed _timestamp);     event newTicketIssuerRegistered(address indexed ticketeerAddress, string indexed ticketeerName, uint indexed _timestamp);

Event log of MetaDataTE:

  • newEventRegistered: New event registered in Metadata contract.
  • newTicketIssuerRegistered: New ticketIssuer registered in Metadata contract.
  • eventMetaDataUpdated: TO BE ADDED / NOT YET PRESENT IN CONTRACT – Metadata of an event was changed/updated.

Deploying the contracts in this repository

WORK IN PROGRESS (commands as stated do not work yet).

# install dependencies $ npm install  # deploy contracts (be sure to change the 'from' account in 'truffle.js') $ truffle migrate --reset --network ganache  # start app $ npm run dev

Variables changed

ticketeer = ticketIssuer _ticketeerAddresss = _ticketIssuerAddresses _ticketeerAddress = _ticketIssuerAddress TicketeerStruct = TicketIssuerStruct allTicketeerStructs = allTicketIssuerStructs isTicketeer = isTicketIssuer ticketeerAddress = ticketIssuerAddress ticketeerAddresses = ticketIssuerAddresses _markTicketeerAddress = _markTicketIssuerAddress ticketeerMetaData = ticketIssuerMetadata newTicketeer = newTicketIssuer newTicketeerRegistered = newTicketIssuerRegistered


获取协议-通用智能合约规范-getNFT

合同概述和GET协议getNFTs的定义。允许P2P交易的智能门票,贷款等。在本报告中,对GET协议的概念性和规范性文档进行了维护和更新。此repo中的代码只是GET协议技术堆栈的一小部分

高级概述GET协议GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT托管(高清钱包基础设施)和引擎(tx处理和逻辑板)仍然是封闭源代码。这个存储库就是资产工厂。目前,GET协议正在区块链blockchainRopsten(以太坊eth测试网)、BSC测试网(Binance智能链)和Klaytn区块链blockchain(mainnet)上为所有韩国票务和服务发布getNFT资产

getNFT资产的定义

GET协议提供了一个工具sel,使(事件)票证具有互操作性、流动性和安全性。门票是数字入场权。因此。在事件扫描开始时拥有getNFT的加密地址是能够使用门票进入场馆的实体

因此,getNFT是一种可转让的数字权利。这些票在二级市场上有价值。repo中描述的契约逻辑允许getnft在以太坊eth/Klaytn/BSC地址/用户之间进行交易和交换

getNFT符合ERC721标准。getNFT采用了以下接口:

  • OrderbookBuyers.sol
  • OrderbookSellers.sol
  • GETProtocol getNFT接口
  • GETProtocol getNFT回调

除了标准的功能和特性外,getNFT还具有一些特殊的功能和元数据契约,可以用于相当专业的智能售票用例。这些自定义函数的代码可在以下合同中找到:

  • Minter/Admin:设置合同变量、代理管理、添加/删除访问控制地址等
  • Relayer:Mint NFFs、move NFTs,将元数据存储在getNFTs etc中
  • txPrimaryMint:已售出/发行的主要市场票据
  • txSecondary:二级市场交易/共享的门票

用于票据发行者(Ticketeers)的API文档

GET协议为票证发行者提供了一个API接口,将其系统上的活动传递给已发行票证的区块链blockchain孪生子。下面提供的链接详细介绍了票务者的API接口:

  • txScan:票据扫描/验证
  • doubleScan:再次扫描已经有效的票证

对于公众来说,不可能与这些API端点交互。想要移动他们的getnft并且能够访问他们的私钥的getNFTs所有者能够使用他们自己的钱包与他们的资产进行交互

注:集成商/票务人员无需了解、研究或采用本数据规范。getNFT引擎将处理所有数据,并将其转换为getNFT智能合约要处理的正确格式


1.getNFT资产规格

1A。恒等变量规范。元数据变量规范。内部变量规范

2.getNFT所有权函数规范

A1。初生薄荷(旧V0)

B。二次转移。scanNFT

3.契约修饰符

4.发出getNFT契约事件(票据资源管理器)

在此存储库中部署契约

变量已更改MetaDataTE.sol
  • OrderbookBuyers.sol
  • OrderbookSellers.sol
  • GETProtocol getNFT接口
  • GETProtocol getNFT回调
  • Minter/Admin:设置合同变量、代理管理、添加/删除访问控制地址等
  • Relayer:Mint NFFs、move NFTs,将元数据存储在getNFTs etc中
  • txPrimaryMint:已售出/发行的主要市场票据
  • txSecondary:二级市场交易/共享的门票
  • txScan:票据扫描/验证
  • doubleScan:再次扫描已经有效的票证
  • newEventRegistered:在元数据协定中注册的新事件
  • newTicketIssuerRegistered:在元数据合同中注册的新票务发行人
  • eventMetaDataUpdated:待添加/尚未出现在合同中-事件的元数据已更改/更新
  • 目的地地址 getNFT资产的未来/预期所有者 地址 原始地址 getNFT资产的当前/过去所有者 地址 出票人地址 出票人的地址 地址 票证元数据 票证发布者设置的数据字段指向/引用(没有协议设置的规则) 地址 状态nft 元数据字段,指定是否扫描getNFT。真=扫描,假=未扫描 bool nftIndex 智能合约中资产的内部引用/指针 uint256 u timestamp 指向发行人的特定票据/资产的数据字段 字符串 仅限继电器 坚固性修饰符。只有注册为“中继层”的地址才能访问此函数 消息发送者(地址) 仅限中间 实体修饰符。只有注册为“relaminteryer”的地址才能访问此函数 邮件发件人(地址)

    票务用例需要几个自定义变量和数据字段。下表将按元数据类别细分这些变量

    有关getNFTs所有权的数据字段

    描述getNFTs元数据的数据字段

    1A。恒等变量规范。元数据变量规范。内部变量规范

    2.getNFT所有权函数规范

    A1。初生薄荷(旧V0)

    B。二次转移。scanNFT

    3.契约修饰符

    4.发出getNFT契约事件(票据资源管理器)

    在此存储库中部署契约

    变量已更改MetaDataTE.sol
  • OrderbookBuyers.sol
  • OrderbookSellers.sol
  • GETProtocol getNFT接口
  • GETProtocol getNFT回调
  • Minter/Admin:设置合同变量、代理管理、添加/删除访问控制地址等
  • Relayer:Mint NFFs、move NFTs,将元数据存储在getNFTs etc中
  • txPrimaryMint:已售出/发行的主要市场票据
  • txSecondary:二级市场交易/共享的门票
  • txScan:票据扫描/验证
  • doubleScan:再次扫描已经有效的票证
  • newEventRegistered:在元数据协定中注册的新事件
  • newTicketIssuerRegistered:在元数据合同中注册的新票务发行人
  • eventMetaDataUpdated:待添加/尚未出现在合同中-事件的元数据已更改/更新
  • 目的地地址 getNFT资产的未来/预期所有者 地址 原始地址 getNFT资产的当前/过去所有者 地址 出票人地址 出票人的地址 地址 票证元数据 票证发布者设置的数据字段指向/引用(没有协议设置的规则) 地址 状态nft 元数据字段,指定是否扫描getNFT。真=扫描,假=未扫描 bool nftIndex 智能合约中资产的内部引用/指针 uint256 u timestamp 指向发行人的特定票据/资产的数据字段 字符串 仅限继电器 坚固性修饰符。只有注册为“中继层”的地址才能访问此函数 消息发送者(地址) 仅限中间 实体修饰符。只有注册为“relaminteryer”的地址才能访问此函数 邮件发件人(地址)

    getNFT触点内部使用的变量

    Var Description Type
    目的地地址 getNFT资产的未来/预期所有者 地址
    原始地址 getNFT资产的当前/过去所有者 地址
    出票人地址 出票人的地址 地址
    1A。恒等变量规范。元数据变量规范。内部变量规范

    getNFT契约管理链上事件资产的所有权和元数据管理。getNFT引擎(及其区块链blockchain节点)可以访问GET协议保管库。该系统拥有系统中所有用户的所有高清钱包衍生产品,这些用户更喜欢由专门的第三方管理他们的密钥

    Var Description Type
    票证元数据 票证发布者设置的数据字段指向/引用(没有协议设置的规则) 地址
    状态nft 元数据字段,指定是否扫描getNFT。真=扫描,假=未扫描 bool
    nftIndex 智能合约中资产的内部引用/指针 uint256
    2.getNFT所有权函数规范

    A。初级铸币厂:发行getNFT地址。当票证出售给粉丝/用户时,会触发此操作。触发票的数字孪生子的创建

    Var Description Type
    u timestamp 指向发行人的特定票据/资产的数据字段 字符串
    仅限继电器 坚固性修饰符。只有注册为“中继层”的地址才能访问此函数 消息发送者(地址)
    仅限中间 实体修饰符。只有注册为“relaminteryer”的地址才能访问此函数 邮件发件人(地址)
    onlyMinter Solidity modifier. Only addresses that are registered as a ‘relaminteryer’ can access this func. msg.sender (address)

    A1。初生薄荷(旧V0)

    B。secondaryTransfer:SecondaryMarket/P2P getNFT所有权更改当车票在粉丝之间转售/交易时会触发此操作

    C。scanNFT:由扫描仪/发卡机构验证getNFT此操作在对票据进行扫描验证时触发

    功能A、B和;C只能由白名单上的地址调用(参见本文档第3节中的修饰符)。如果getNFT所有者希望直接与他们的NFT交互,他们可以使用ERC721函数(即safeTransferFrom、approve、ownerOf等)。getNFT仍然与ERC271标准完全兼容,getNFT的不同之处在于它包含几个“自定义”函数,允许票务人员在票证的数据库孪生子改变状态/指针时移动getNFT

    将一个新的getNFT复制到一个destinationAddress(getNFT买家的地址)。函数将返回发出的getNFT的nftIndex(uint256)

    此函数将向GET Factory contract的事件日志发出以下事件:txPrimaryMint(destinationAddress,ticketissueradress,nftIndex,u timestamp)

    B。二次转移。scanNFT

    在ticketissueradress、eventAddress和ticketMetadata中传递的值不可变地存储在ERC721资产的元数据字段中

        function primaryMint(address destinationAddress, address ticketIssuerAddress, address eventAddress, string memory ticketMetadata) public onlyMinter returns (uint256) {

    GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT

    如果票证被转售到其他地址,则触发此功能。getNFT托管为每个getNFT使用一个新的钱包。originAddress必须是getNFT的所有者,此函数才能成功

    此函数将发出以下事件:txSecondary(originAddress、destinationAddress、getAddressOfticketIssuer(nftIndex)、nftIndex、u timestamp)

    3.契约修饰符

    此函数将发出以下事件:emit txScan(originAddress,destinationAddress,nftIndex,_timestamp);。到目前为止,验证票证是不可变的

        function secondaryTransfer(address originAddress, address destinationAddress) public onlyRelayer;

    GET Protocol - General Smart Contract Specification - getNFT - GET协议-通用智能合约规范-getNFT

    为了管理访问,合同使用open zeppelin的RoleManager模块

    4.发出getNFT契约事件(票据资源管理器)

    ERC721u TICKETINGu V2发出的事件

        function scanNFT(address originAddress) public onlyRelayer;

    ERC721u TICKETINGu V2的事件日志:

    元数据发出的事件


    在此存储库中部署契约

    元数据的事件日志:

    1. newEventRegistered:在元数据协定中注册的新事件
    2. newTicketIssuerRegistered:在元数据合同中注册的新票务发行人

    正在工作(所述命令尚未工作)


    变量已更改MetaDataTE.sol
  • OrderbookBuyers.sol
  • OrderbookSellers.sol
  • GETProtocol getNFT接口
  • GETProtocol getNFT回调
  • Minter/Admin:设置合同变量、代理管理、添加/删除访问控制地址等
  • Relayer:Mint NFFs、move NFTs,将元数据存储在getNFTs etc中
  • txPrimaryMint:已售出/发行的主要市场票据
  • txSecondary:二级市场交易/共享的门票
  • txScan:票据扫描/验证
  • doubleScan:再次扫描已经有效的票证
  • newEventRegistered:在元数据协定中注册的新事件
  • newTicketIssuerRegistered:在元数据合同中注册的新票务发行人
  • eventMetaDataUpdated:待添加/尚未出现在合同中-事件的元数据已更改/更新
  • 目的地地址 getNFT资产的未来/预期所有者 地址 原始地址 getNFT资产的当前/过去所有者 地址 出票人地址 出票人的地址 地址 票证元数据 票证发布者设置的数据字段指向/引用(没有协议设置的规则) 地址 状态nft 元数据字段,指定是否扫描getNFT。真=扫描,假=未扫描 bool nftIndex 智能合约中资产的内部引用/指针 uint256 u timestamp 指向发行人的特定票据/资产的数据字段 字符串 仅限继电器 坚固性修饰符。只有注册为“中继层”的地址才能访问此函数 消息发送者(地址) 仅限中间 实体修饰符。只有注册为“relaminteryer”的地址才能访问此函数 邮件发件人(地址)

    ticketeer=ticketisueru ticketeeradresses=u ticketisueradressesu ticketeeradress=u ticketisueradress ticketeerdresst=ticketisuerdresst allTicketeerStructs=allticketisuerstructs isTicketeer=isTicketIssuer ticketeeradress=ticketisueradress ticketeeradresses=ticketisueradress ticketeeradressesu markticketeeradress=_markticketissueradress ticketeerMetaData=ticketIssuerMetadata newTicketeer=newTicketIssuer newTicketeerRegistered=newTicketIssuerRegistered

        event txPrimaryMint(address indexed destinationAddress, address indexed ticketIssuer, uint256 indexed nftIndex, uint _timestamp);     event txSecondary(address originAddress, address indexed destinationAddress, address indexed ticketIssuer, uint256 indexed nftIndex, uint _timestamp)     event txScan(address originAddress, address indexed ticketIssuer, uint256 indexed nftIndex, uint _timestamp);     event doubleScan(address indexed originAddress, uint256 indexed nftIndex, indexed uint _timestamp);

    Event log of ERC721_TICKETING_V2:

    • eventMetaDataUpdated:待添加/尚未出现在合同中-事件的元数据已更改/更新
    • txSecondary: Secondary market ticket traded/shared.
    • txScan: Ticket scanned/validated.
    • doubleScan: An already valid ticket was scanned again.

    Events emitted by MetaDataTE

        event newEventRegistered(address indexed eventAddress, string indexed eventName, uint indexed _timestamp);     event newTicketIssuerRegistered(address indexed ticketeerAddress, string indexed ticketeerName, uint indexed _timestamp);

    Event log of MetaDataTE:

    • newEventRegistered: New event registered in Metadata contract.
    • newTicketIssuerRegistered: New ticketIssuer registered in Metadata contract.
    • eventMetaDataUpdated: TO BE ADDED / NOT YET PRESENT IN CONTRACT – Metadata of an event was changed/updated.

    Deploying the contracts in this repository

    WORK IN PROGRESS (commands as stated do not work yet).

    # install dependencies $ npm install  # deploy contracts (be sure to change the 'from' account in 'truffle.js') $ truffle migrate --reset --network ganache  # start app $ npm run dev

    Variables changed

    ticketeer = ticketIssuer _ticketeerAddresss = _ticketIssuerAddresses _ticketeerAddress = _ticketIssuerAddress TicketeerStruct = TicketIssuerStruct allTicketeerStructs = allTicketIssuerStructs isTicketeer = isTicketIssuer ticketeerAddress = ticketIssuerAddress ticketeerAddresses = ticketIssuerAddresses _markTicketeerAddress = _markTicketIssuerAddress ticketeerMetaData = ticketIssuerMetadata newTicketeer = newTicketIssuer newTicketeerRegistered = newTicketIssuerRegistered

    部分转自网络,侵权联系删除区块链源码网

    www.interchains.cc

    https://www.interchains.cc/22861.html

    区块链毕设网(www.interchains.cc)全网最靠谱的原创区块链毕设代做网站 部分资料来自网络,侵权联系删除! 最全最大的区块链源码站 ! QQ3039046426
    区块链知识分享网, 以太坊dapp资源网, 区块链教程, fabric教程下载, 区块链书籍下载, 区块链资料下载, 区块链视频教程下载, 区块链基础教程, 区块链入门教程, 区块链资源 » GET Protocol – General Smart Contract Specification – getNFT – GET协议-通用智能合约规范-getNFT区块链毕设代写

    提供最优质的资源集合

    立即查看 了解详情