IB-Solana-SPLToken合约创建
Codes in lesson5.1
Codes in lesson5.2
代币创建(Create Token) 与 铸造(Mint)
核心概念
账户模型基础
- 数据账户
- 原生账户、代币账户、状态账户
- 铸币账户
- 程序账户
如何判断一个账户的类型?
1 | 步骤 1:检查 executable(判断是程序账户 or 数据账户) |
1、数据账户(Data Account)
数据账户(Data account)是存储状态的“容器”,是 Solana 区块链上的基础存储单元
每个账户需要支付租金以维持数据存储,余额低于阈值可能导致账户被回收清除
只有所有者程序可以修改账户数据,其他程序只能读取(除非特别授权)
2、程序账户(Program Account)
程序账户(Program account)存储可执行代码的“智能合约”,是 Solana 上的“智能合约容器”
程序账户是特殊类型的数据账户(executable=true),基于 Berkeley Packet Filter(BPF)虚拟机
部署流程:
1 | 1. 创建普通账户(executable=false) |
3、原生账户(Native Account)
- 原生账户(Native account)是存储和管理 SOL,由系统程序(1111111…)拥有
- 每个公钥自动拥有一个原生账户:当用户生成密钥对时,账户即存在(余额为 0)
- 简单操作:
- SOL 转账
- 支付交易费用
- 质押参与网络共识
4、代币账户
广义上(代币账户体系)
- 代币账户分为:铸币账户 和 代币持有账户
- 由 SPL Token 程序(Tokenkeg…)拥有
狭义上(代币持有账户,Token Account)
- 代币持有账户 存储和管理 特定用户对某种 SPL 代币(如 USDC 这类自定义代币)的余额
- 代币持有账户 必须关联一个 铸币账户(多对一)
- 关联代币账户(ATA)是特殊的 Token Account
5、关联代币账户(Associated Token Account)
- 关联代币账户(ATA)是 Token Account 的一种特殊类型,简化了 SPL Token 的账户管理
- ATA 会自动与一个钱包地址绑定,每个代币账户(Token Account)和每个铸币账户(Mint Account)对应一个唯一的 ATA
- 首次接收代币时,系统会自动生成 ATA 并支付租金(存储费用)
- 钱包/交易所可通过算法推导用户的所有 ATA 地址,统一管理资产
5、铸币账户(Mint Account)
- 铸币账户定义一种特定 SPL 代币的基本属性和全局信息
- 一个铸币账户可以关联多个代币账户(代币持有账户)
数据结构:
1 | pub struct Mint { |
6、状态账户(State Account)
- 状态账户存储应用程序特定的状态数据
- 由自定义程序拥有(既不是系统程序,也不是 SPL Token 程序)
- 是 Solana 账户系统中最灵活的数据存储形式
常见 owner:
- 自定义程序(最常见)
- 由开发者部署的智能合约
- 比如:投票程序、游戏程序、DeFi 协议
- 中间件程序
- DAO 治理程序
核心组件
- 铸币账户 (Mint Account)
- 代币账户 (Token Account)
- 关联令牌账户 (Associated Token Account, ATA)
创建代币(Create Token / Create Mint Account)的流程
底层流程
- 创建账户容器:在区块链上分配空间
- 设置所有权:将新账户的所有权赋予 SPL Token 程序
- 初始化代币参数:写入代币的元数据
完整代码
1 | use solana_client::nonblocking::rpc_client::RpcClient; |
铸造代币(Mint)到 关联令牌账户(ATA)的流程
核心概念
- 铸造(Mint):创建新的代币单位并添加到流通中
- 代币分配:将新创建的代币分配给特定用户
完整代码
1 | use solana_client::nonblocking::rpc_client::RpcClient; |
Solana 项目结构
核心文件:
- processor.rs:核心业务逻辑,处理指令
- state.rs:定义账户的状态和扩展字段
- instruction.rs:定义各种代币操作的指令
- error.rs:定义了程序可能抛出的错误
- lib.rs:程序入口点,汇总各个模块
实现 Token 交互合约
项目初始化
新建项目
新建合约项目 contract 和 调用合约的项目 cli
项目配置
contract 依赖添加:
1 | cargo add solana-program |
contract Cargo.toml 文件:
1 | [package] |
cli 依赖添加:
1 | cargo add spl-token borsh spl-associated-token-account solana-program solana-sdk solana-client |
编译部署
编译:
1 | cargo build-sbf |
部署:
1 | solana program deploy ./target/sbpf-solana-solana/release/token.so |
- Title: IB-Solana-SPLToken合约创建
- Author: Gabrielle
- Created at : 2025-06-26 16:17:13
- Updated at : 2025-07-04 16:37:05
- Link: https://zoella-w.github.io/2025/06/26/89-IB-Solana-SPLToken合约创建/
- License: This work is licensed under CC BY-NC-SA 4.0.