关于 aptos
aptos 是面向 Aptos 区块链与 Move 语言开发的技能,适用于编写合约、使用框架模块及测试 dApp。内容涵盖资源与能力、代币标准、Gas 优化和 TypeScript SDK。
主要功能
- 01Move 类型系统与资源操作
- 02Aptos 框架模块及常用模式
- 03Coin、Fungible Asset 与 NFT 标准
- 04合约测试与 CLI 命令
- 05Gas 优化及 TypeScript SDK
适用场景
- 01编写 Aptos Move 智能合约
- 02实现代币及 NFT 功能
- 03测试合约并优化 Gas 使用
- 04使用 TypeScript SDK 集成 dApp
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ raintree-technology/ claude-starter --skill aptos安装后在 Claude Code 中输入/aptos确认已加载。
详细介绍
Aptos 区块链与 Move 语言专家
Aptos 是一个采用 Move 编程语言的 Layer 1 区块链,旨在实现安全且可扩展的智能合约。
适用场景
- 编写 Move 智能合约
- 理解 Move 类型系统(能力、泛型、资源)
- 使用 Aptos 框架模块(coin、fungible_asset、object)
- 代币标准(Coin、Fungible Asset、Digital Asset/NFT)
- Gas 优化与测试
- 使用 TypeScript SDK 集成 dApp
Move 语言基础
能力——Move 的核心特性
每种类型都有能力,用于控制你可以对它执行的操作:
| 能力 | 含义 | 示例 |
|---|---|---|
copy | 可以复制 | 基本类型、配置 |
drop | 可以丢弃 | 临时数据 |
store | 可以存储在结构体中 | 大多数数据类型 |
key | 可以作为顶层资源 | 账户资源 |
// Resource that can be stored globally
struct Balance has key, store {
coins: u64
}
// Value type that behaves like a primitive
struct Point has copy, drop, store {
x: u64,
y: u64
}
// No abilities = must be explicitly handled (hot potato)
struct Receipt {
amount: u64
}
泛型与幻影类型
// Type parameter with ability constraint
struct Box<T: store> has key {
value: T
}
// Phantom type - zero runtime cost, type safety only
struct Coin<phantom CoinType> has store {
value: u64
}
// Different types can't be mixed
let btc: Coin<BTC> = Coin { value: 100 };
let eth: Coin<ETH> = Coin { value: 50 };
// btc + eth → compile error!
全局存储操作
// Store resource at signer's address
public fun initialize(account: &signer) {
move_to(account, MyResource { value: 0 });
}
// Read resource (requires acquires annotation)
public fun get_value(addr: address): u64 acquires MyResource {
borrow_global<MyResource>(addr).value
}
// Modify resource
public fun set_value(addr: address, val: u64) acquires MyResource {
borrow_global_mut<MyResource>(addr).value = val;
}
// Check existence
public fun exists_at(addr: address): bool {
exists<MyResource>(addr)
}
// Remove and return resource
public fun destroy(addr: address): MyResource acquires MyResource {
move_from<MyResource>(addr)
}
Signer——身份验证
use std::signer;
// Only the account owner can call this
public entry fun transfer(
sender: &signer,
recipient: address,
amount: u64
) acquires Balance {
let sender_addr = signer::address_of(sender);
// sender proves ownership of sender_addr
}
可见性修饰符
module example {
// Private (default) - only within module
fun internal() { }
// Public - callable from anywhere
public fun library_fn() { }
// Friend - only from declared friend modules
public(friend) fun restricted() { }
// Entry - transaction entry point
public entry fun user_action(account: &signer) { }
}
Aptos 框架(0x1)
核心模块
| 模块 | 用途 |
|---|---|
account | 创建账户、轮换身份验证密钥 |
coin | 原始的同质化代币标准 |
fungible_asset | 新型灵活代币标准 |
object | 可组合资产的对象模型 |
aptos_coin | 原生 APT 代币 |
timestamp | 区块时间戳 |
event | 发出事件 |
Coin 标准(0x1::coin)
use aptos_framework::coin;
// Register to receive a coin type
public entry fun register<CoinType>(account: &signer) {
coin::register<CoinType>(account);
}
// Transfer coins
public entry fun transfer<CoinType>(
from: &signer,
to: address,
amount: u64
) {
coin::transfer<CoinType>(from, to, amount);
}
// Check balance
public fun balance<CoinType>(addr: address): u64 {
coin::balance<CoinType>(addr)
}
Fungible Asset 标准(0x1::fungible_asset)
现代、灵活的代币标准:
use aptos_framework::fungible_asset::{Self, FungibleAsset, Metadata};
use aptos_framework::primary_fungible_store;
// Create fungible asset metadata
public fun create_fa(creator: &signer): Object<Metadata> {
let constructor_ref = object::create_named_object(creator, b"MY_FA");
primary_fungible_store::create_primary_store_enabled_fungible_asset(
&constructor_ref,
option::none(), // max supply
utf8(b"My Token"),
utf8(b"MTK"),
8, // decimals
utf8(b"https://example.com/icon.png"),
utf8(b"https://example.com"),
);
object::object_from_constructor_ref(&constructor_ref)
}
// Transfer FA
public entry fun transfer_fa(
sender: &signer,
metadata: Object<Metadata>,
recipient: address,
amount: u64
) {
primary_fungible_store::transfer(sender, metadata, recipient, amount);
}
对象模型(0x1::object)
可组合、可转移的对象:
use aptos_framework::object::{Self, Object, ConstructorRef};
struct MyObject has key {
value: u64
}
// Create object
public fun create(creator: &signer): Object<MyObject> {
let constructor_ref = object::create_object(signer::address_of(creator));
let object_signer = object::generate_signer(&constructor_ref);
move_to(&object_signer, MyObject { value: 42 });
object::object_from_constructor_ref(&constructor_ref)
}
// Transfer object
public entry fun transfer_object(
owner: &signer,
obj: Object<MyObject>,
recipient: address
) {
object::transfer(owner, obj, recipient);
}
代币标准
Digital Asset(NFT)标准
use aptos_token_objects::collection;
use aptos_token_objects::token;
// Create collection
public entry fun create_collection(creator: &signer) {
collection::create_unlimited_collection(
creator,
utf8(b"My Collection Description"),
utf8(b"My Collection"),
option::none(), // royalty
utf8(b"https://example.com/collection"),
);
}
// Mint token
public entry fun mint_token(creator: &signer, to: address) {
let token_constructor_ref = token::create(
creator,
utf8(b"My Collection"),
utf8(b"Token description"),
utf8(b"Token #1"),
option::none(), // royalty
utf8(b"https://example.com/token/1"),
);
let transfer_ref = object::generate_transfer_ref(&token_constructor_ref);
let linear_transfer_ref = object::generate_linear_transfer_ref(&transfer_ref);
object::transfer_with_ref(linear_transfer_ref, to);
}
常见模式
能力模式
struct AdminCap has key, store {}
public fun init_module(deployer: &signer) {
move_to(deployer, AdminCap {});
}
public entry fun admin_only(admin: &signer) acquires AdminCap {
assert!(exists<AdminCap>(signer::address_of(admin)), E_NOT_ADMIN);
// Admin-only logic
}
资源账户
use aptos_framework::resource_account;
// Create resource account for deterministic addresses
public fun create_resource_account(creator: &signer): signer {
let (resource_signer, _cap) = resource_account::create_resource_account(
creator,
b"seed"
);
resource_signer
}
事件
use aptos_framework::event;
#[event]
struct TransferEvent has drop, store {
from: address,
to: address,
amount: u64,
}
public fun emit_transfer(from: address, to: address, amount: u64) {
event::emit(TransferEvent { from, to, amount });
}
测试
#[test]
fun test_basic() {
let x = 1 + 1;
assert!(x == 2, 0);
}
#[test(account = @0x123)]
fun test_with_signer(account: &signer) {
let addr = signer::address_of(account);
assert!(addr == @0x123, 0);
}
#[test]
#[expected_failure(abort_code = E_NOT_FOUND)]
fun test_expected_failure() {
abort E_NOT_FOUND
}
CLI 命令
# Initialize project
aptos init
# Compile
aptos move compile
# Test
aptos move test
# Publish
aptos move publish --profile mainnet
# Run function
aptos move run --function-id 'addr::module::function'
Gas 优化
- 对频繁调用的小型函数使用
inline - 对大型集合优先使用
Table而非vector - 尽量减少存储操作(成本最高)
- 使用
SmartTable实现并行执行 - 尽可能批量执行操作
TypeScript SDK
import { Aptos, AptosConfig, Network } from "@aptos-labs/ts-sdk";
const config = new AptosConfig({ network: Network.MAINNET });
const aptos = new Aptos(config);
// Query account balance
const balance = await aptos.getAccountAPTAmount({
accountAddress: "0x1"
});
// Submit transaction
const txn = await aptos.transaction.build.simple({
sender: account.accountAddress,
data: {
function: "0x1::coin::transfer",
typeArguments: ["0x1::aptos_coin::AptosCoin"],
functionArguments: [recipientAddress, amount],
},
});
const result = await aptos.signAndSubmitTransaction({
signer: account,
transaction: txn,
});
资源
评论
支持 Markdown