Solana/SPL Token/历史与核心规范概览
让我们把时间退回到 2017 年, 在这一年, 以太坊上的 erc-20 正式成为以太坊生态的标准. 它定义了一套标准化的智能合约接口, 极大地降低了开发者创建代币的复杂性. 通过统一的规范, 开发者无需从头构建代币合约, 只需遵循 erc-20 标准即可快速发行代币.
该规范直接推动了 2017 年以及 2021 年的两次加密货币牛市. 第一次的行业热点是 ico(首次代币发行), 吸引了大量资金和开发者进入以太坊生态, 奠定了以太坊作为智能合约平台领导者的地位. 第二次的行业热点是 defi(去中心化金融), 我们现在熟知的几乎所有 defi 玩法(如 uniswap, compound, aave 等) 都爆发于 2021 年, 它们全都依赖 erc-20 代币进行价值传递, 流动性提供和链上治理.
我们可以肯定的说, 代币是以太坊生态发展的最关键推动力.
现在, 问题来到了 solana. 作为行业的年轻挑战者, solana 应当如何设计并实现一个代币标准?
破局之道
与以太坊不同, 基于 solana 账户模型的关系, solana 本身并不内建"一个钱包账户有多少余额"这样的逻辑. 开发者必须使用 pda 数据账户手动实现代币的存储, 增发与转账. 但这显然容易出错, 也容易重复造轮子. 用户还必须面临一个最大的问题: 不同的代币, 所支持的指令可能是不同的.
为了解决这个问题, solana 团队创建了 spl token, 作为统一的代币标准. 它参考了以太坊的 erc20 规范, 为开发者提供标准接口, 来促进生态兼容性. 这样钱包, 去中心化交易所, 去中心化金融等应用都可以通用识别代币.
得益于 solana 生态支持原生程序, 因此开发者无需自己部署 spl token 的代码, 相反开发者只需要创建一个被称为 spl 铸造账户的账户, 用于存储该代币的基本信息, 就可以创建出一个自己的 spl token.
查询链上代币信息
我们以 solana 上使用较为广泛的 usdc 代币为例, 该代币的铸造账户地址为 EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
, 您可以通过浏览器查询到该代币, 一些重要信息如代币总量, 小数点精度, 名称等如下.
Overview | Value |
---|---|
Current Supply | 7761611891.221625 |
Decimals | 6 |
data.name | USD Coin |
data.symbol | USDC |
根据最新数据, 截至 2025 年 06 月, solana 网络上总共有一千三百万个 spl token, 其中 pump.fun 一家就铸出了一千一百万个 token. 历史峰值出现在 2024 年 10 月 24 日, 仅仅一天就铸造了 3.6 万个新 spl token.
在 solana 创建一个新的代币几乎不花钱, 任何有一定经验的开发者都能在 1 秒之内就能完成. 同时像 pump.fun 以及 let's bonk 等网站上线的一键发币功能也吸引了大量非开发者用户, 助推了 spl token 的数量暴涨.
没时间解释了, 让我们铸出来再说!
发展历史
Solana 刚上线时, spl token 是以最小可行产品方式发布(v1). 该版本仅支持铸造, 销毁和转账基本操作. 这时的 spl token 主要目标是跑通代币系统, 尚不追求高级功能.
随着 raydium 等去中心化交易所的出现, spl token 成为了 solana 各类资产流通的基石(v2). 这一阶段的重点是规范了钱包的支持, 并引入 token metadata 概念. 该功能最初由 metaplex 提供, 目的是为扩充 spl token v1 版本的功能, 允许开发者为自己的代币设置名字, 符号, 图像等信息.
从 2023 至今, 最近的 spl token v3(也称 token-2022)开始引入更强大的功能, 例如允许冻结账户, 转账钩子(用于支持合约式回调). 但这也意味着 token-2022 开始与旧版 spl token 不完全兼容, 一些老旧的钱包和应用可能尚未完全支持. 虽然如此, 如果您正试图创造一种新代币, 从 token-2022 入手, 是一条最省心的路径, 本课程也将默认采用 token-2022 规范进行讲解.
核心规范概览
定义一个 spl token 需要使用到两个核心组件.
- 代币程序: 代币的核心程序, 负责代币的创建, 转移, 销毁等操作. 有两个版本:
TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
. 新版, 即 token-2022.TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
. 旧版, 目前已经基本弃用. 如果您在浏览器上查找一些极早期发行的代币, 可能会见到它.
- 铸造账户: 定义代币的基础数据如总供应量, 小数位数等. 每个 spl token 都有一个唯一的铸造账户. 从 token-2022 开始, 您可以在此账户中添加"扩展数据", 最常用的扩展为代币元数据信息, 可用于存储该 spl token 的人类可读信息, 如名字, 符号, 图标 url 等.
一个普通铸造账户的整体数据结构大致上如下所示.
┌─────────────────────────────────────┐
│ Mint Account │
│-------------------------------------│
│ decimals: u8 │
│ supply: u64 │
│ mint_authority: Pubkey │
│ freeze_authority: Pubkey │
│-------------------------------------│
│ ... ... │
│-------------------------------------│
│ name: "Thai Baht Coin" │
│ symbol: "THB" │
│ uri: "http://accu.cc/..." │
└─────────────────────────────────────┘
基于一些历史原因, spl token 被设计为如此, 如果您有机会深入阅读其代码, 可能会发现它内部有着极重的历史包袱. 我们不得不使用一种非常复杂的数据结构来在铸造账户里存储一个代币的信息. 铸造账户里的基础数据是代币的基础, 用来管理代币供应和权限. 元数据则是基于"旧"的铸造账户结构, 为了保持一定的兼容性而附加上去的, 它像是一张包装纸, 描述代币的名字, logo 等供人类阅读的信息.
Solana 已经铺好路, 只等您发车.