这次一定好好学 Solana (2) : 账户模型-不懂就砍我

  • dgu
  • 发布于 15小时前
  • 阅读 182

接上篇这次一定好好学Solana(1):PoH共识简介同样这次还是自己做笔记,然后让Grok帮我整理我不会画各种账户分类的脑图,因为我发现这种死记硬背没啥用,我也不会拿以太坊举例,因为我压根没开发过,因此,通过研究我试图从本质上去解释我也不会研究太深入的东西,现阶

接上篇 这次一定好好学 Solana (1) : PoH 共识简介 同样这次还是自己做笔记, 然后让 Grok 帮我整理

我不会画各种账户分类的脑图, 因为我发现这种死记硬背没啥用, 我也不会拿以太坊举例, 因为我压根没开发过, 因此, 通过研究我试图从本质上去解释

我也不会研究太深入的东西, 现阶段没啥用, 因为我的目的是开发合约, 看懂链上数据, 进而赚钱

你的笔记已经非常生动有趣了,用 Web2 的经验类比 Solana 的账户体系,确实能让很多人更容易理解。我帮你整理一下,优化结构、语言流畅度和逻辑清晰度,同时保留你的幽默风格,方便你发到博客上。以下是整理后的版本:


Solana 账户体系:从 Web2 码农视角彻底搞懂

网上都说 Solana 的账户体系复杂,我之前也这么觉得,学了好几次都没搞明白。这次我终于弄懂了,而且我保证也能让你懂!

Solana 的账户体系设计很“奇葩”,用我 10 多年 Web2 码农的经验来看,如果我老板看到这种设计,估计会立马开除我 —— “你告诉我,整个系统就 tm 一张表?”

但仔细琢磨,Solana 这套“一切都是 Account”的逻辑其实挺聪明。下面我用一个 SaaS 系统的类比,带你从 Web2 到 Web3,彻底搞懂它。


用 Web2 类比 Solana

想象一下,你的公司运营一个 SaaS 系统(Solana),用户可以通过各种小程序(智能合约)实现不同的业务需求。如果让设计数据库,估计会这么设计:

  • 用户表:存用户信息,对应 Solana 的用户钱包。
  • 小程序表:存各种小程序代码,比如官方的转账程序或某个开发者的自定义合约。
  • 小程序用户关系表:存某个用户在某个小程序下的数据,用户的 ID 类似微信的 OpenID,对应 Solana 的 PDA 账户。

这套设计是不是每个程序员都能看懂?Solana 其实也是类似的逻辑,只不过它把所有东西塞进了“Account”这个概念,通过分类实现上面这套功能。


Solana 的三种基础账户

Solana 的账户体系核心就三种类型,简单明了:

  1. 用户账户(Native Account / Wallet Account)

    • 作用:就是我们钱包里的账户,用来存 SOL。
    • 类比:Web2 的用户表,存你的现金余额。
  2. 程序账户(Program Account)

    • 作用:存代码,可以是官方内置的程序(比如 System Program),也可以是我们自己写的合约。
    • 类比:Web2 的小程序表,存业务逻辑。
  3. 数据账户(Data Account)

    • 作用:程序用来存状态。比如 SPL-Token 用它存你的代币余额,JUP 的投票程序用它存你的投票数,想存啥存啥,全看程序逻辑。
    • 类比:Web2 的小程序用户关系表,存用户在某个应用下的数据。

Account 的关键属性

Solana 用几个关键属性区分账户类型,分别是:

  • executable: bool:是否可执行。
  • lamports: u64:SOL 的最小单位,1 SOL = 10^9 Lamports。
  • data: Vec<u8>:存数据的字节数组。
  • owner: Pubkey:谁能操作这个账户。

属性详解

executable

  • 用户账户false(不能执行)。
  • 程序账户true(存代码,可执行)。
  • 数据账户false(存数据,不能执行)。

lamports

  • 用户账户:你的 SOL 余额,可以拿来转账或付交易费。
  • 程序账户:存代码所需的租金(Rent),锁住不能用。
  • 数据账户:保证账户存在的租金,同样锁住。

data

  • 用户账户:空([]),余额在 lamports 里,不需要额外数据。
  • 程序账户:程序字节码本身(BPF 格式)。
  • 数据账户:存程序定义的状态,想存啥存啥,但得按程序逻辑来。

Owner 是啥?谁能操作账户

owner 表示哪个程序能操作这个账户, 而且只有程序能操作账户。举个例子:

用户账户的 Owner

  • Owner:System Program(11111111111111111111111111111111)。
  • 伪代码
    class SystemProgram {
      void transfer() {
          验证签名;      // 检查你的私钥签名
          验证 SOL 余额;  // 够不够转账
          转账 SOL;       // 更新 lamports
      }
    }
  • 只有 System Program 能操作用户账户,你自己写的程序没法直接动它。

USDC 转账的 Owner

  • Owner:SPL Token Program(TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)。
  • 伪代码
    class SPLTokenProgram {
      void transfer() {
          验证签名;           // 检查你的私钥签名
          验证 PDA 账户;      // 你在这个程序下有记录吗
          验证 Token 余额;    // 够不够转账
          转账 Token;         // 更新 PDA 的 data
      }
    }
  • SPL Token Program 管理你的代币账户(PDA),只有它能改余额。

SPL-Token 相关的账户

Solana 的账户模型简单,但 SPL-Token 引入了更具体的概念。你想发个 token,不用自己写合约,直接用 SPL-Token Program 就行。创建 token 后,会生成两个账户:

Mint Account

  • 作用:定义 token 怎么用。
  • 数据
    • decimals:小数位数(比如 USDC 是 6)。
    • Authority:权限控制:
    • Mint:谁能增发。
    • Freeze:谁能冻结。
    • Update:谁能改名字等信息(属于 Metadata)。
  • Owner:SPL Token Program。

Metadata Account

  • 作用:定义 token 长啥样。
  • 数据
    • name:名字(比如 “USDC”)。
    • symbol:符号(比如 “$”)。
    • uri:图片或描述文件的地址。
  • Owner:Token Metadata Program(metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s)。

关联方式

  • Metadata Account 的 mint 字段指向 Mint Account 的地址,单向绑定。

两个例子

  1. USDC
    • Mint AddressEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
    • Owner:SPL Token Program
    • Mint Authority:Circle(可以增发 USDC)
    • Freeze Authority:N/A(不能冻结)
    • Metadata:名称 “USDC”,符号 “$”。

token account.jpg

  1. $TRUMP
    • Mint Address:(假设某地址)
    • Mint Authority:N/A(不能增发,俗称“丢权限”)
    • Freeze Authority:N/A(不能冻结)
    • 炒币放心:供应量固定,没人能偷偷加印。

trump auth.jpg

PDA 账户:Web3 的 OpenID

PDA(Program Derived Address)是数据账户的一种,类似 Web2 的 OpenID,用来标识用户在某个程序下的身份。它没有私钥,由程序控制。

如何生成?

以你的 USDC 账户为例,伪代码:

PDA = find_program_address(
    [YourPubkey, TokenProgramID, MintAddress],
    TokenProgramID
);
  • YourPubkey:确定是你。
  • TokenProgramID:确定是 SPL-Token Program。
  • MintAddress:确定是 USDC(而不是其他代币)。

为什么加 Mint Address?

  • 只用 YourPubkey + TokenProgramID 只能生成一个 PDA,但你可能有 USDC、USDT 等多个代币。
  • 加上 Mint Address,确保每种代币一个独立 PDA,互不干扰。

其实, find_program_address 方法的参数都是你自己定义的, 这是这个场景下是这几个, 你自己的合约中还可以传别的, 总之目的就是确定用户身份

Solana 的并行逻辑

Solana 高吞吐量的秘密在于并行处理,逻辑很简单:

  • 并行:交易不涉及同一个账户,可以同时执行,没竞争。
    • 例子:A 转账给 B,C 转账给 D,可以并行。
  • 串行:交易涉及同一个账户,必须按顺序执行,有竞争。
    • 例子:A 转账给 B,B 转账给 C,得排队。

总结

Solana 的账户体系并不复杂:

  • 三种基础账户:用户账户存 SOL,程序账户存代码,数据账户存状态。
  • 属性区分executablelamportsdataowner 定义账户角色。
  • SPL-Token 扩展:Mint Account 定义代币,Metadata Account 描述外观。
  • PDA:程序控制的用户身份,靠种子派生。
  • 并行:没竞争就一起跑。

从 Web2 看,Solana 就像把数据库表的功能塞进了 Account,设计巧妙又高效。看懂了吧?快去试试 Solana,炒个 Meme 币也行!


点赞 2
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
dgu
dgu
江湖只有他的大名,没有他的介绍。