💵 Solana Token Program - 创造你自己的代币帝国!
🎯 学习目标
准备好创建你自己的代币了吗?无论是 Meme 币、游戏币还是治理代币,今天你将掌握一切!🚀
你将学会:
- 🏗️ 理解 Solana 独特的代币架构
- 🪙 创建自己的 SPL 代币
- 📊 管理代币的供应和分发
- 🔐 控制铸造和冻结权限
🌟 为什么学习 Token Program?
代币是区块链的核心!
- 💰 DeFi:流动性、交易、借贷
- 🎮 GameFi:游戏内货币和资产
- 🏛️ DAO:治理和投票权
- 🎨 NFT:独特的数字资产
🎭 第一章:Solana 代币的独特之处
🤔 与其他链的对比
让我们先理解 Solana 的与众不同:
🔷 以太坊模式(ERC-20)
├── 一个合约 = 一种代币
├── 余额存在合约里
└── 简单但不够灵活
🟣 Solana 模式(SPL Token)
├── 一个程序管理所有代币
├── 账户模型存储余额
└── 复杂但超级灵活!
💡 核心理念
Solana = 一个程序统治所有代币!
想象一个超级管理员(Token Program)管理着所有代币的规则,而每种代币和每个用户的余额都存在独立的账户里。
🗃️ 第二章:三大核心账户
🎯 账户关系全景图
让我们用一个银行系统来类比:
🏦 Solana 代币银行系统
├── 👤 钱包账户(你的身份证)
├── 🏭 铸币账户(央行印钞机)
└── 💳 代币账户(你的银行卡)
📊 详细关系解析
🏭 第三章:铸币账户 - 代币的出生证明
📝 铸币账户结构
让我们深入了解铸币账户的属性:
interface MintAccount {
// 🔑 铸造权限 - 谁能印钞?
mintAuthority: PublicKey | null;
// 💰 总供应量 - 印了多少钱?
supply: number;
// 🔢 小数位数 - 能分多细?
decimals: number;
// ✅ 是否初始化
isInitialized: boolean;
// 🧊 冻结权限 - 谁能冻结账户?
freezeAuthority: PublicKey | null;
}
🎨 形象化理解
🏭 铸币账户就像造币厂
├── 📋 印钞许可证(mintAuthority)
├── 💵 已印钞票总量(supply)
├── ✂️ 最小面额(decimals)
├── 🔐 是否开工(isInitialized)
└── ❄️ 紧急冻结权(freezeAuthority)
⚠️ 小数位陷阱
链上没有小数! 一切都是整数!
举例:
- decimals = 2,supply = 100
- 实际代币数 = 100 ÷ 10² = 1 个代币
- 就像美分和美元的关系!
💡 实用示例
// 🎯 不同小数位的实际意义
// USDC:6 位小数
1_000_000 最小单位 = 1 USDC
// SOL:9 位小数
1_000_000_000 lamports = 1 SOL
// 你的 Meme 币:0 位小数
1 = 1(没有小数,要么 0 要么 1)
💳 第四章:代币账户 - 你的数字钱包
🗂️ 代币账户结构
interface TokenAccount {
// 🏭 对应哪种代币?
mint: PublicKey;
// 👤 谁拥有这个账户?
owner: PublicKey;
// 💰 有多少余额?
amount: number;
// 🔐 其他属性
state: AccountState;
// ... 更多
}
🔑 关联代币账户(ATA)
ATA = Associated Token Account,让我们用邮箱地址来理解:
📮 邮箱地址生成规则
用户地址 + 代币地址 = 唯一邮箱地址
示例:
Alice + USDC = Alice 的 USDC 邮箱
Bob + USDC = Bob 的 USDC 邮箱
Alice + CustomToken = Alice 的 CustomToken 邮箱
🎯 关键理解
你的钱包不直接持有代币!
❌ 错误理解:钱包 → 代币
✅ 正确理解:钱包 → 代币账户 → 代币余额
就像你的身份证(钱包)不是银行卡(代币账户),但银行卡关联着你的身份!
🚀 第五章:实战 - 创建你的代币
🛠️ 环境准备
# 安装 SPL Token SDK
npm install @solana/spl-token @solana/web3.js
# 导入必要的库
import {
createMint,
getOrCreateAssociatedTokenAccount,
mintTo,
transfer,
TOKEN_PROGRAM_ID
} from "@solana/spl-token";
🪙 Step 1: 创建代币
// 🎯 创建你的第一个代币!
async function createToken() {
// 🔑 生成代币地址(可选,也可以让程序自动生成)
const tokenKeypair = Keypair.generate();
console.log("🎯 代币地址:", tokenKeypair.publicKey.toBase58());
// 🏭 创建铸币账户
const tokenMint = await createMint(
connection, // 网络连接
payer, // 谁付钱
payer.publicKey, // 铸造权限给谁
payer.publicKey, // 冻结权限给谁(或 null)
9, // 小数位(9 = 像 SOL)
tokenKeypair, // 代币密钥对
{ commitment: 'confirmed' }, // 确认选项
TOKEN_PROGRAM_ID // 程序 ID
);
console.log("✅ 代币创建成功!");
console.log("🪙 代币地址:", tokenMint.toBase58());
return tokenMint;
}
💳 Step 2: 创建代币账户
// 🎯 为用户创建代币账户
async function createTokenAccount(
tokenMint: PublicKey,
owner: PublicKey
) {
// 🔍 获取或创建关联代币账户
const tokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
payer,
tokenMint, // 哪种代币
owner // 谁拥有
);
console.log("💳 代币账户创建成功!");
console.log("📍 账户地址:", tokenAccount.address.toBase58());
console.log("💰 当前余额:", tokenAccount.amount.toString());
return tokenAccount;
}
🖨️ Step 3: 铸造代币
// 🎯 铸造新代币
async function mintTokens(
tokenMint: PublicKey,
destination: PublicKey,
amount: number
) {
// 💵 铸造代币
const signature = await mintTo(
connection,
payer,
tokenMint, // 铸造哪种代币
destination, // 发送到哪个账户
payer.publicKey, // 铸造权限
amount * 10 ** 9 // 数量(考虑小数)
);
console.log("🎉 铸造成功!");
console.log("💰 铸造数量:", amount);
console.log("📝 交易签名:", signature);
return signature;
}
📤 Step 4: 转账代币
// 🎯 转账代币
async function transferTokens(
tokenMint: PublicKey,
fromAccount: PublicKey,
toAccount: PublicKey,
amount: number
) {
// 💸 执行转账
const signature = await transfer(
connection,
payer,
fromAccount, // 从哪转
toAccount, // 转到哪
payer.publicKey, // 授权人
amount * 10 ** 9 // 数量
);
console.log("💸 转账成功!");
console.log("📤 从:", fromAccount.toBase58());
console.log("📥 到:", toAccount.toBase58());
console.log("💰 数量:", amount);
return signature;
}
🎮 完整示例:创建 Meme 币
// 🚀 创建你的 Meme 币帝国!
async function launchMemeCoin() {
console.log("🚀 启动 Meme 币项目...\n");
// Step 1: 创建代币
console.log("1️⃣ 创建 DOGE2.0 代币...");
const dogeCoin = await createMint(
connection,
payer,
payer.publicKey, // 你控制铸造
null, // 没有冻结权限
6, // 6 位小数
undefined, // 自动生成地址
{ commitment: 'confirmed' },
TOKEN_PROGRAM_ID
);
console.log("✅ DOGE2.0 地址:", dogeCoin.toBase58());
// Step 2: 创建你的代币账户
console.log("\n2️⃣ 创建代币账户...");
const myAccount = await getOrCreateAssociatedTokenAccount(
connection,
payer,
dogeCoin,
payer.publicKey
);
console.log("✅ 账户地址:", myAccount.address.toBase58());
// Step 3: 铸造 100 万个代币
console.log("\n3️⃣ 铸造 1,000,000 DOGE2.0...");
await mintTo(
connection,
payer,
dogeCoin,
myAccount.address,
payer.publicKey,
1_000_000 * 10 ** 6 // 1M 代币 * 10^6 小数
);
console.log("✅ 铸造完成!");
// Step 4: 撤销铸造权限(可选)
console.log("\n4️⃣ 撤销铸造权限(总量锁定)...");
// await setAuthority(...)
console.log("\n🎉 恭喜!DOGE2.0 成功发射!");
console.log("📊 总供应量: 1,000,000 DOGE2.0");
console.log("💎 准备 To The Moon! 🚀");
}
🎯 第六章:高级技巧
🔒 权限管理
// 🔑 转移或撤销权限
import { setAuthority, AuthorityType } from "@solana/spl-token";
// 撤销铸造权限(锁定总量)
await setAuthority(
connection,
payer,
tokenMint,
payer.publicKey, // 当前权限
AuthorityType.MintTokens, // 权限类型
null // 新权限(null = 撤销)
);
🧊 冻结功能
// ❄️ 冻结可疑账户
import { freezeAccount } from "@solana/spl-token";
await freezeAccount(
connection,
payer,
tokenAccount,
tokenMint,
freezeAuthority
);
🔥 销毁代币
// 🔥 销毁代币减少供应
import { burn } from "@solana/spl-token";
await burn(
connection,
payer,
tokenAccount,
tokenMint,
owner,
1000 * 10 ** 9 // 销毁数量
);
🏆 实战项目建议
🎯 项目 1:游戏代币系统
创建游戏币 → 玩家获得奖励 → 商店消费
🎯 项目 2:DAO 治理代币
发行代币 → 分发给成员 → 投票权重
🎯 项目 3:稳定币系统
1:1 锚定 → 铸造/销毁机制 → 价格稳定
📚 深入学习资源
官方文档
工具和 SDK
🎊 恭喜完成!
你已经掌握了 Solana Token Program 的核心知识!
✅ 你学会了什么
- 🏗️ 账户模型 - 理解三大核心账户
- 🪙 创建代币 - 从零开始发行代币
- 💰 管理供应 - 铸造、转账、销毁
- 🔐 权限控制 - 管理铸造和冻结权限
🚀 下一步
- 创建你的代币 - 实践出真知
- 集成到 DApp - 构建代币应用
- 学习 Token-2022 - 探索新标准
- 研究 DeFi - 流动性池、交易等
准备好创建下一个百倍币了吗? 🚀 Let's BUIDL! 🔨