Aptos 实战:链上 NFT 创建与转移超详细教程

·

在现代公链生态中,Aptos NFT 因低 Gas、高性能而备受开发者青睐。本文将通过 TypeScript 示例,教你从零部署 Move 智能合约,完成 数字资产(下称 NFT)发行、查询及转移,并避开常见坑点。

👉 想直接体验完整 DEMO,点这里抢先跑通代码!

基础准备:环境、术语与关键词

我们需要提前了解:

关键词:Aptos NFT、Move 智能合约、数字资产、Create Collection、Mint Token、Token Transfer、Devnet。

Step 1:选择 SDK 与安装

官方提供 TypeScriptPython 双端 SDK,本文集中使用更高效的 TypeScript 方案。

  1. 推荐使用 pnpm 管理包:

    pnpm add --global typescript ts-node
  2. 获取项目模版:

    git clone https://github.com/aptos-labs/aptos-ts-sdk.git
    cd aptos-ts-sdk
    pnpm install
  3. 若编译提示「内存不足」,可用:

    node --max-old-space-size=8192 ./node_modules/.bin/tsup

⚠️ 部分仓库默认会导出 ESM 与 CommonJS 两套产物,若内存爆炸,优先只保留目标版本。

Step 2:运行官方示例并观察输出

进入目录启动 simple_digital_asset

cd examples/typescript-esm
pnpm install
pnpm build
pnpm run simple_digital_asset

成功日志将打印三步结果:

👉 一分钟看懂输出字段代表什么,速览↑

Step 3:代码深度拆解(6 个子任务)

3.1 Aptos Client 初始化

import { Aptos, AptosConfig, Network } from "@aptos-labs/ts-sdk";

const config = new AptosConfig({ network: Network.DEVNET });
const aptos = new Aptos(config);

配置 network 可一键切换:DEVNET | TESTNET | MAINNET

3.2 本地生成账户并上链

const alice = Account.generate();  // 本地随机私钥
const bob   = Account.generate();

await aptos.fundAccount({ 
  accountAddress: alice.accountAddress, 
  amount: 100_000_000   // 0.1 APT
});
await aptos.fundAccount({ accountAddress: bob.accountAddress, amount: 100_000_000 });

Faucet 会在 Devnet 空投对应 APT,用于后续交易 Gas。

3.3 创建 Collection

Collection 是 NFT 的“文件夹”,同一作者可以有任意数量的 Collection。

const createTxn = await aptos.createCollectionTransaction({
  creator: alice,
  name: "My First Move Art",
  description: "Demo for Aptos NFT creation",
  uri: "https://metadata.example.com",
});
await aptos.signAndSubmitTransaction({ signer: alice, transaction: createTxn });

字段说明:

3.4 Mint Token(NFT)

const mintTxn = await aptos.mintTokenTransaction({
  creator: alice,
  collection: "My First Move Art",   // 与上一步 name 对应
  name: "Move #001",
  description: "First token in collection",
  uri: "https://metadata.example.com/move001",
});
await aptos.signAndSubmitTransaction({ signer: alice, transaction: mintTxn });

此时链上 Token 受 Alice 唯一拥有,地址可在控制台 JSON 里查看。

3.5 查询 Collection / Token 元数据

想了解你的 NFT:

const collData = await aptos.getCollectionData({
  creatorAddress: alice.accountAddress,
  collectionName: "My First Move Art",
});
console.log(JSON.stringify(collData, null, 2));
const aliceAssets = await aptos.getOwnedDigitalAssets({
  ownerAddress: alice.accountAddress,
});
console.log("Alice holds:", aliceAssets.map(a => a.token_data.name));

输出将展示所有 数字资产 的名称、描述、Owner 地址以及链外 URI。

3.6 转移 Token 给 Bob

await aptos.transferDigitalAsset({
  sender: alice,
  digitalAssetAddress: aliceAssets[0].token_data_id,
  recipient: bob.accountAddress,
})
await aptos.signAndSubmitTransaction({ signer: alice, transaction: transferTxn });

随后分别查询 Alice 与 Bob 余额

console.log(await aptos.getOwnedDigitalAssets({ ownerAddress: alice.accountAddress }).length);
console.log(await aptos.getOwnedDigitalAssets({ ownerAddress: bob.accountAddress }).length);

若分别输出 0 与 1,表示 NFT 转移 成功。

Step 4:常见坑 & FAQ

  1. module not found
    确保依赖安装完毕,必要时 rm -rf node_modules && pnpm i 清理缓存并重装。
  2. 水龙头领取失败?
    Devnet 水龙头限制 IP 与频次,断网或 VPN 环境可能导致请求被拒。官方社区反馈后近期正在扩容节点。
  3. Token 元数据无更新?
    mutable_uri / mutable_description 在 Collection 层面为 false,则链上数据不可改。需在创建之初就启用可变性。
  4. 遇到 “OUT OF GAS”?
    检查你的 Faucet 空投是否到账,Devnet 每笔交易普遍 <0.001 APT。
  5. 如何批量 Mint?
    目前 mintTokenTransaction 单次触发一个 Token。批量请手写循环或构建 MultiSigTransaction,注意各笔交易需独立签名。
  6. 如何验证唯一性?
    tokenURI 中存储哈希值,并在链下服务校验,防止重复文件。

结语

通过以上 6 步,即可在 Aptos 上完成 NFT 创建、查询、转移 全流程。Move 的语言特性让资产 安全分类、可组合化,开发者只需关心业务逻辑即可。尝试在 Devnet 打磨合约后,再平滑迁移到 Mainnet。未来叠加可编程版税、动态链上属性,Aptos 的 NFT 玩法将更加多彩。

祝你链上创作愉快!