目录
NFT Platform Architecture and Workflow
🦊原文:Can I Own Your NFTs? Understanding the New Attack Surface to NFTs
🦊写在前面:本文只会记录个人认为极有价值的部分。
NFT Platform Architecture and Workflow
在本节中,我们将给出现有 NFT 平台的通用网络架构,介绍创建新 NFT 的「minting,铸币」过程,并讨论 NFT 是如何进行交易的。
1 NFT Platform Architecture
大部分用户通过 OpenSea、SoRare 等平台与 NFT 打交道。
下图展示了一个「off-chain NFTs,链下 NFTs」平台的通用架构,它通常由三部分组成:
- 存储数字资产及其元数据的数据库 Storage
- 用户应用程序 User Applications
- 区块链 Blockchains
个人理解:「链下平台」是指没有将数字资产及其元数据存储在区块链中的平台,与之对应的,「链上平台」就是指将数字资产及其元数据存储在区块链中的平台。
上图列举了常见的数据存储服务器、用户应用程序和区块链平台。
OpenSea 等市场平台提供「User Applications,用户应用程序」来与底层「Blockchains,区块链」系统交互,同时使用「Storage,存储」站点来进行数据托管。
用户可以通过使用「用户应用程序」来铸造和交易 NFT,以避开复杂的区块链交互。
具体流程如下:
- 首先,「用户应用程序」从用户那里收集数据,即数字资产及其元数据;
- 接着,「用户应用程序」将这些数据发送到「存储」站点;
- 然后,「存储」站点将会返回一个「link,链接」作为指针;
- 最后,「市场」使用智能合约在区块链上存储返回的「链接」。
NFTs 交易只涉及区块链上的数据,即内部的交易和数据,而不涉及「存储」站点上的数据。
大多数市场平台都在区块链上部署了自己的智能合约以用于交易活动,这些智能合约需要遵循特定的以太坊代币标准,例如:ERC721 标准。
除此之外,可以只使用一个「存储」站点来存储数字资产及其元数据,也可以使用多个「存储」站点来分别存储数字资产及其元数据。存储站点可以是云服务器,如 Google Cloud 和 Amazon AWS,也可以是去中心化服务器,如 IPFS 。
数字资产是指艺术品本身,比如一张图片,而元数据是指关于数字资产的描述。对于「链下平台」,区块链上存储指向元数据的链接,而元数据内部存储指向数字资产的链接。
2 Minting NFTs
当用户打算将数字资产上链并宣布其所有权时,用户首先需要铸造相应的 NFT 。
下图展示了铸造 NFT 的过程:
上图展示了 NFT 铸造过程的三大步骤。
首先,用户即 NFT 的「creator,创作者」,需要决定将数字资产及其元数据放在哪里。大多数情况下,它们要么是被存储在链下的第三方「存储」站点上,要么是被存储在区块链上。
元数据通常包括对数字资产的一些描述,并以 JSON 格式存在。在区块链上,指向元数据的链接被称为 tokenURI 。
需要注意的是,在 ERC721 标准中:
interface ERC721Metadata {
function name() external pure returns (string _name);
function symbol() external pure returns (string _symbol);
function tokenURI(uint256 _tokenId) external view returns (string);
}
上述 ERC721Meradata 接口是可选的而不是必须的。但在实践中,NFT 通常包括它,因为智能合约依赖于它来了解 NFT 的名称和详细信息。
其次,用户将元数据与一个通过智能合约与相应区块链接口的「user wallet,用户钱包」相连接。
这里的意思应该是「用户钱包」通过智能合约与区块链进行交互,并且用户需要把元数据与自己的「用户钱包」连接起来。
智能合约可以被视为一个模板,它接受如「创作者」地址、数字资产及其元数据或 tokenURI 等作为输入。智能合约会为新生成的 NFT 分配 tokenID,一个智能合约可以被重复用于多个 NFT 。
针对链上模式的平台,需要传入的参数是数字资产及其元数据;针对链下模式的平台,需要传入的是参数 tokenURI,即指向元数据的链接。
对应上图第三步
最后,用户使用「smart contract instance,智能合约实例」。具体来说,用户首先需要提供智能合约要求的输入,然后再「sign a transaction,签署交易」以铸造 NFT 。由此,tokenID(是由智能合约生成的)和元数据(或 tokenURI)会被存储在区块链上。
同样地,链上平台直接存储元数据,链下平台存储 tokenURI,即指向元数据的链接。事实上,链上平台不仅需要存储元数据,还可能需要存储数字资产本身。
如下是一个 NFT 的通用标识符:
[ContractAddress, tokenID]
需要注意的是,一个智能合约可能拥有多个 NFT 。
个人理解:由一个智能合约创建的多个 NFT 之间的 tokenID 不会重复,但是不同智能合约创建的多个 NFT 之间的 tokenID 可能重复。因此,这里的通用标识符类似于一个复合主键。
3 Trading NFTs
一旦 NFT 被铸造,它就可以被用于交易。直观地说,NFT 交易涉及数字资产所有权的转移。由于 NFT 涉及数字资产本身、元数据和交易,因此在讨论 NFT 所有权如何通过交易被转移之前,我们先描述它们是如何被存储的。
3.1 Storage
下图展示了 NFT 的数据存储组织方式:
数字资产被「online,在线」存储,并通过「public link,公共链接」被访问。该链接可用于向潜在客户展示NFT,但更重要的是,它被用来构建 NFT 的元数据。
貌似不管是指向数字资产的链接,还是指向元数据的链接,都采用的是 URL 的形式。上图应该是为了避免混淆,所以一个写的是 link 一个写的是 url 😇
JSON 格式的元数据包括名称、描述和图片等多个属性,如下图所示:
{
"title": "Asset Metadata",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Identifies the asset to which this NFT represents",
},
"description": {
"type": "string",
"description": "Describes the asset to which this NFT represents",
},
"image": {
"type": "string",
"description": "A URI pointing to a resource with mime type image/*
representing the asset to which this NFT represents.
Consider making any images at a width between 320
and 1080 pixels and aspect ratio between 1.91:1
and 4:5 inclusive.",
}
}
}
如果 NFT 所代表的数字资产是一张图片,那么 NFT 元数据中 “image” 的属性 “description” 的值就是指向该图片的链接。
指向该图片的链接就是上图中的 link
由于存储和检索元数据需要消耗大量的时间和资源,因此元数据通常存储在链下,即位于中心化的或去中心化的服务器上。同样地,元数据也可以通过「public URL,公共 URL」被访问。
NFT 数字资产和元数据通过这些 URL 以链式方式关联:
- 数字资产的 URL 被包含在元数据中;
- 元数据的 URL 被包含在交易中,即 tokenURI,存储在区块链上;
虽然叫的是 tokenURI,但是实际上用的是 URL😇
3.2 Trading
NFT 的所有者可以对自己的 NFT 定价,并上架进行销售,该过程由一个名为「listing」的智能合约来执行。为了出售一个 NFT,NFT 交易平台会使用指向元数据的 URL,并在前端(通常是一个网页)向潜在的客户展示数字资产。任何接受售价并且付款的客户都可以购买到该 NFT 。
另一方面,如果 NFT 所有者没有上架 NFT,或者潜在的客户不接受售价,那么客户也可以设置一个智能合约报价,即提出自己可以接受的价格,询问 NFT 所有者是否同意这个价格。如果 NFT 所有者接受客户给出的报价,那么交易就可以完成。
所有的交易和智能合约都被记录在区块链上,可供公众进行验证。
成功的交易将导致 NFT 所有权的转移。然而,这种所有权的转移仅涉及更新存储在区块链上的数据,即产生一笔新的交易,而不涉及原始的数字资产及其元数据。在此过程中,URL 只是简单地作为参数传递,而没有受到任何的保护。换句话说,数字资产、元数据、交易之间的联系是脆弱的、易受攻击的。如果其中任何一个 URL 失效或被篡改,那么 NFT 的安全性就会受到威胁。