NFT介绍

7 阅读5分钟

这是一份关于 NFT (Non-Fungible Token, 非同质化代币) 的深度技术指南。我们将从底层原理讲起,剖析交易流程,最后落实到后端系统架构的设计。


第一部分:什么是 NFT?(技术视角的定义)

在技术层面,NFT 本质上是区块链上的一条特殊的账本记录

与 ETH 或 USDT(同质化代币,每一枚都一样)不同,NFT 具有唯一性

1. 核心标准

以太坊上最主流的两个标准:

  • ERC-721(经典版): 每个 Token 都有唯一的 ID。
    • 例子: Bored Ape #8888。
  • ERC-1155(批量/半同质化): 一个 ID 可以有多个数量。
    • 例子: 游戏里的“屠龙刀”,ID 是 101,总量有 1000 把,你拥有其中 1 把。

2. NFT 到底存了什么?(Metadata 概念)

这是后端开发最需要理解的。链上的存储极其昂贵,所以 NFT 在链上通常只存了一个**“指针” (Token URI)**。

  • 链上数据: tokenId: 123, owner: 0xAbc..., tokenURI: "ipfs://QmXyz..."
  • 链下数据 (Metadata): tokenURI 指向的一个 JSON 文件,通常存在 IPFS(去中心化存储)或中心化服务器上。

JSON 内容示例:

{
  "name": "Golden Sword",
  "description": "A powerful weapon.",
  "image": "ipfs://QmImageHash...", // 图片的实际地址
  "attributes": [
    { "trait_type": "Damage", "value": 100 },
    { "trait_type": "Element", "value": "Fire" }
  ]
}

第二部分:NFT 交易的完整例子

我们需要区分两种场景:直接转账市场交易(如 OpenSea)

场景一:铸造 (Mint) —— 从无到有

  1. 用户操作: 用户在官网点击“Mint”。
  2. 合约交互: 调用合约的 mint() 函数。
  3. 链上发生:
    • 合约生成新的 tokenId(例如 888)。
    • 合约将 owner 设为用户地址。
    • 触发 Transfer(address from, address to, uint256 tokenId) 事件,其中 from0x0000...(空地址)。
  4. 后端动作: 监听到 Transfer 事件,发现 from 是空地址,识别为 Mint,将数据写入数据库。

场景二:市场交易 (Marketplace Listing & Sale)

这是最复杂的流程,涉及**“链下挂单,链上成交”**。

步骤 1:授权 (Approve)

  • 用户 A 想卖 NFT。首先,他必须调用合约的 setApprovalForAll,授权 NFT 市场合约(如 OpenSea) 有权支配他的 NFT。
  • 这一步上链,消耗 Gas。

步骤 2:挂单 (Listing) —— 链下签名

  • 用户 A 设定价格 10 ETH。
  • 用户 A 对这个订单信息进行数字签名(Sign)。
  • 后端: 市场后端接收到这个签名和订单信息,存入数据库(Order Book)。
  • 这一步不上链,不消耗 Gas(Gas-free Listing)。

步骤 3:购买 (Fulfillment) —— 链上成交

  • 用户 B 看到单子,点击购买,支付 10 ETH + Gas 费。
  • 用户 B 调用市场合约的 matchOrders(撮合)函数。
  • 市场合约逻辑:
    1. 验证用户 A 的签名是否有效。
    2. 检查用户 A 是否还拥有该 NFT。
    3. 把 10 ETH 转给用户 A(扣除手续费)。
    4. 调用 NFT 合约的 transferFrom 把 NFT 从 A 转给 B。
  • 这一步上链,交易完成。

第三部分:NFT 后端系统架构与功能清单

由于区块链查询速度极慢(读取一个 NFT 的 Metadata 可能需要几秒),且不支持复杂检索(比如“查找所有攻击力>50的剑”),因此必须构建一个后端索引层。

1. 核心模块一:链上数据同步 (Indexer / Listener)

这是地基。你需要一个服务不断地“扫链”。

  • 功能:
    • 实时监听: 监听 Transfer 事件。
    • 历史回溯: 从 Block 0 开始同步历史数据。
    • 处理回滚 (Reorg): 这一步非常关键(参考之前 Postgres 介绍)。
  • 逻辑:
    • 收到 Transfer(from: A, to: B, id: 1)
    • 数据库更新:UPDATE nfts SET owner = 'B' WHERE token_id = 1

2. 核心模块二:Metadata 爬虫 (Metadata Fetcher)

链上只给了你一个 URL,后端需要去下载内容。

  • 功能:
    • 解析 TokenURI: 识别 ipfs://, https://, ar:// 等协议。
    • 下载 JSON: 获取名称、描述、属性。
    • 下载媒体资源: 图片、视频。注意: 必须转存到自己的云存储(如 AWS S3),因为 IPFS 访问很慢且不稳定。
  • 难点:
    • 有些项目是“盲盒”,Metadata 会在某个时间点统一更新(Reveal)。后端需要支持“重新刷新 Metadata”的功能。

3. 核心模块三:API 服务 (Query Layer)

为前端提供高性能查询。

  • 功能:
    • 资产列表: “查询用户 A 拥有的所有 NFT”。
    • 属性筛选: “查询 Collection X 中,眼睛是蓝色 (Eyes: Blue) 的所有 NFT”。(这是 Postgres JSONB 的强项)。
    • 排序: 按稀有度排序、按价格排序。
    • 活动历史: 展示一个 NFT 的 Mint -> Sale -> Transfer 的完整时间轴。

4. 核心模块四:交易市场逻辑 (Order Book)

如果你要做交易市场,需要这个模块。

  • 功能:
    • 存储挂单: 存储卖家的签名、价格、过期时间。
    • 验证有效性: 定期检查卖家是否把 NFT 转走了,或者取消了授权。如果是,需要把挂单标记为无效。
    • API: 提供 Make Offer(出价)和 List(挂单)的接口。

第四部分:数据库设计示例 (PostgreSQL)

基于之前的讨论,这是 NFT 后端的典型表结构:

-- 1. 收藏品/合约表
CREATE TABLE collections (
    address CHAR(42) PRIMARY KEY,
    name TEXT,
    symbol TEXT,
    type VARCHAR(10) -- 'ERC721' or 'ERC1155'
);

-- 2. NFT 资产表 (最核心)
CREATE TABLE nfts (
    contract_address CHAR(42) REFERENCES collections(address),
    token_id NUMERIC(78, 0), -- 大数支持
    owner CHAR(42),
    token_uri TEXT,
    metadata JSONB, -- 存名称、属性等 { "image": "...", "attributes": [...] }
    last_updated TIMESTAMP,
    PRIMARY KEY (contract_address, token_id)
);

-- 建立 GIN 索引以支持属性筛选
CREATE INDEX idx_nft_metadata ON nfts USING GIN (metadata);

-- 3. 交易历史表 (用于前端展示 Activity)
CREATE TABLE activities (
    id SERIAL PRIMARY KEY,
    transaction_hash CHAR(66),
    block_number INT,
    event_type VARCHAR(20), -- 'MINT', 'TRANSFER', 'SALE'
    from_address CHAR(42),
    to_address CHAR(42),
    price NUMERIC, -- 如果是市场成交,记录价格
    timestamp TIMESTAMP
);

-- 4. 挂单表 (如果是交易市场)
CREATE TABLE orders (
    order_hash CHAR(66) PRIMARY KEY,
    maker CHAR(42),
    contract_address CHAR(42),
    token_id NUMERIC,
    price NUMERIC,
    signature TEXT, -- 核心:签名的 hex 字符串
    status VARCHAR(20) -- 'ACTIVE', 'FILLED', 'CANCELLED'
);

总结

开发 NFT 后端,核心不是写智能合约,而是如何优雅地把链上极其简陋的数据(Event + URI),通过 ETL(提取、转换、加载)过程,变成 Web2 用户习惯的高速、可搜索、富媒体的数据。