在现代公链生态中,Aptos NFT 因低 Gas、高性能而备受开发者青睐。本文将通过 TypeScript 示例,教你从零部署 Move 智能合约,完成 数字资产(下称 NFT)发行、查询及转移,并避开常见坑点。
基础准备:环境、术语与关键词
我们需要提前了解:
- Move 语言:Aptos 生态的核心 DSL,资源安全、对象导向。
- Aptos Token:Aptos 官方
aptos_token.move模块,支持「标准 v2」NFT。 - Devnet 水龙头:免费领测试币,部署合约、支付 Gas 零成本。
- 对象模型:Collection 与 Token 在 Aptos 上均为资源对象,具备唯一地址。
关键词:Aptos NFT、Move 智能合约、数字资产、Create Collection、Mint Token、Token Transfer、Devnet。
Step 1:选择 SDK 与安装
官方提供 TypeScript 与 Python 双端 SDK,本文集中使用更高效的 TypeScript 方案。
推荐使用
pnpm管理包:pnpm add --global typescript ts-node获取项目模版:
git clone https://github.com/aptos-labs/aptos-ts-sdk.git cd aptos-ts-sdk pnpm install若编译提示「内存不足」,可用:
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成功日志将打印三步结果:
- Alice 创建 Collection:
collection_id、current_supply=0、mutable_uri=true等字段一应俱全。 - Mint Token 后,余额变为
Alice's digital assets balance: 1,owner_address指向 Alice。 - Token Transfer 完成后,Bob 账户出现相同资产,Alice 余额归零。
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 });字段说明:
uri:链外元数据链接,可覆盖到token_uri级别。mutable_x:属性可变性标记,漏填将导致后续更新失败。
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
- 报
module not found?
确保依赖安装完毕,必要时rm -rf node_modules && pnpm i清理缓存并重装。 - 水龙头领取失败?
Devnet 水龙头限制 IP 与频次,断网或 VPN 环境可能导致请求被拒。官方社区反馈后近期正在扩容节点。 - Token 元数据无更新?
mutable_uri/mutable_description在 Collection 层面为 false,则链上数据不可改。需在创建之初就启用可变性。 - 遇到 “OUT OF GAS”?
检查你的 Faucet 空投是否到账,Devnet 每笔交易普遍 <0.001 APT。 - 如何批量 Mint?
目前mintTokenTransaction单次触发一个 Token。批量请手写循环或构建MultiSigTransaction,注意各笔交易需独立签名。 - 如何验证唯一性?
在tokenURI中存储哈希值,并在链下服务校验,防止重复文件。
结语
通过以上 6 步,即可在 Aptos 上完成 NFT 创建、查询、转移 全流程。Move 的语言特性让资产 安全分类、可组合化,开发者只需关心业务逻辑即可。尝试在 Devnet 打磨合约后,再平滑迁移到 Mainnet。未来叠加可编程版税、动态链上属性,Aptos 的 NFT 玩法将更加多彩。
祝你链上创作愉快!