普通视图

发现新文章,点击刷新页面。
今天 — 2026年4月7日首页

Solana开发(1)- 核心概念扫盲篇&&扫雷篇

作者 Amos_Web
2026年4月7日 13:35

本篇文章针对的人群是有一些Rust基础,同时想要了解Solana开发的同学。如果您对这些没有任何了解的话,建议您直接点赞、收藏、评论即可,无需往下阅读~ Solana中文开发教程 Solana Rust相关教程

1. 前言

最近在学习Solana开发(别问为什么,问就是前端已死...),以为自己有一些Rust的基础学起来会比较简单,结果没想到阅读上面的教程看的云里雾里,看完了之后就看完了,完全串不起来,各种概念,账户,token、私钥、公钥、合约傻傻分不清楚。

我自己的学习思路是学一个大的概念,也就是把对这个东西的大的框架搭建起来,然后在尝试一点点的去填空。所以这篇内容的话也算是自己理解的整个Solana大框架内容,细节的话感觉上面的教程已经说的很清楚了,推荐如果想学的话先把这篇内容消化一下 然后再看上面的教程会好理解很多。

我把这几天的“填坑日记”整理出来,尽可能的使用大白话的方式来给大家讲清楚Solana的相关基础知识以及其背后的设计理念,尽可能避免一些专有名词的干扰,让你看完了能大概明白是怎么回事。

建议点赞、收藏、评论之后慢慢细品🤣🤣😄😄~~~

2. 核心概念

2.1 账户(Account)

2.1.1 是什么

在 Solana 中,一切皆账户。无论是你的钱包余额、你的代码、还是你发行的 Token 数据,甚至是你创建的智能合约,以及官方代币程序Token Program,全都是保存在一个个“账户”里的。 账户是Solana用于存储状态的基本数据单元。网络将所以状态存储在一个键值对数据库中,每个键是一个32字节的地址,每个值就是一个账户。 image.png

2.1.2 关键信息

  1. 结构:每个账户都包含相同的五个字段:lamports、data、owner、executable、rent_epoch。
  2. 地址:每个账户由唯一的 32 字节地址标识(可以是 Ed25519 公钥或 PDA)。
  3. 所有权:只有账户的 owner 程序可以修改其数据或扣除 lamports。任何程序都可以向任何可写账户充值 lamports。
  4. rent:每个账户都必须持有与其数据大小成比例的最低 lamport 余额,才能保持链上状态。

2.1.3 账户分类

  1. 可执行账户 (Executable Accounts/Program Accounts): 也就是我们常说的 Program (程序/合约)。这类账户里存放的是编译后的 BPF 字节码。它就像一个“只读可执行文件”,只能被调用

    • Program Account用于存储可执行的代码。每个Program Account都由Loader Program拥有。当Program部署时,运行时会创建一个Program Account来存放其字节码。
      image.png
  2. 非可执行账户 (Non-Executable Accounts): 也就是 数据账户 (Data Account)。它是专门用来存状态的(比如余额、游戏积分)。它通过一个 Owner 字段指明哪个程序有权操作它。

    • 程序状态账户:程序会将其状态存储在数据账户中,创建程序状态账户需要两个步骤:

      • 调用 System Program 创建账户。System Program 会将账户所有权转移给指定的程序。
      • 拥有该账户的程序根据其 instructions 初始化账户的 data 字段。 image.png
    • 系统状态账户:创建后仍由 System Program 拥有的账户称为 system account。首次向新地址发送 SOL 时,会在该地址创建一个由 System Program 拥有的新账户。

      • 所有的钱包账户都是System Account。交易的手续费支付者必须是System Account。因为只有System Program拥有的账户才能支付交易手续费 image.png

2.1.4 关键点:程序(Program)是无状态的!

你的 Rust 代码上链后,它只是个“只读的函数库”。它不存你的分数、不存你的余额。数据存哪?存在专门开辟的 Account(账户) 里。 说人话就是每个账户只能是可执行账户、或者是非可执行账户,不可以又包含数据,又包含状态,这就是Solana的设计哲学:数据和状态分离代码和可变状态的分离意味着程序只需部署一次,即可管理任意数量的数据账户。

2.2 指令

指令是对Solana程序执行特定功能的请求。指令是链上操作的基本构建块。 每条指令只指定一个要调用的程序、所需的账户、以及由程序解析的字节数组数据。 每条指令的执行逻辑都存储在程序中,每个程序定义了自己的指令集。要与Solana网络交互,需要将一条或多条指令添加到交易中,并发送到网络进行处理。

image.png

2.2.1 关键点

  1. **单一程序:**每条指令只针对一个程序,通过program_id
  2. 账户元数据: accounts 数组为指令读取或写入的每个账户提供账户元数据。
  3. 不透明数据: data字段是一个字节数组,其格式由目标程序定义。

2.2.2 指令结构

  1. program_id: 被调用的程序的ID 指令的program_id是包含该指令执行逻辑的程序的公钥地址。运行时会使用此字段将指令路由到正确的程序进行处理。
  2. accounts: 一个账户元数据数组 指令的accounts数组是一个有序的Account Meta 结构体列表。每个指令交互的账户都必须提供元数据。validator会利用这些元数据判断哪些交易可以并行运行。写入不同账户的交易可以并行执行。
    image.png
  3. data: 包含额外 数据 的字节数组,供指令使用。 指令的 data 字段是一个字节数组。用于告知程序要调用哪个函数,并为该函数提供参数。数据通常以一个判别符或索引字节开头,用于标识目标函数,后面跟着序列化的参数。 常见的编码约定:
    • 核心程序(System、Stake、Vote): 使用Bincode序列化的枚举变体索引,后跟序列化参数。
    • Anchor程序:使用8字节判别符,后跟Borsh序列化参数。

2.3 交易

按照上面的图片中的标识,一笔交易实际就是多个指令的集合。任何指令失败,整个交易失败,所有的状态更改都会被回滚。

2.3.1 如何界定交易包含多少指令

  • 原子性绑定: 如果指令A 失败,指令B就不能做,那就打包到一起;
  • 容量限制:单个交易包不能超过1232字节(约等于能塞下十几个账户地址);
  • 计算限制:逻辑太复杂会爆CU(计算单元),需要拆分或申请提高预算;

2.4 SPL(Solana Program Library)代币

代币是代表不同类别资产所有权的数字资产。代币化使财产权利的数字化成为可能。

2.4.1 是什么:

Solana 上的所有代币本质上都是由 Token Program 拥有的 数据账户。 基于数据账户这个说明,其实代币有两个核心”概念性“的账户:

  1. 铸币账户 (Mint Account) —— 代表“币”的本体 代表这种 Token 的本质。比如你今天发了一个 "USDT",这个 USDT 的总量、精度(Decimals)、管理员是谁,存在 Mint 账户里
  2. 代币账户 (Token Account) —— 代表“某人的口袋” 用来装这种 Token 的“口袋”。你的主钱包地址(Wallet)不能直接装 Token,必须名下挂一个专属的 "口袋(Token Account)" 才能装 USDT。 代币中的账户
    • Mint: 该token account持有的代币
    • Owner: 有权从该token account转移代币的账户
    • Amount: 该token account当前持有的代币数量

2.5 私钥、公钥、签名

2.5.1 是什么

代表着你在区块链世界的身份凭证和密码

2.5.2 关联

  • 公钥 (PublicKey) :就是我们口头说的“钱包地址”或“账户地址”,它是向外界展示的门牌号。
  • 私钥 (Secret Key) :能对这扇门发号施令的唯一钥匙,常以 id.json 文件的形式存在。
  • 签名 (Signature) :每次转账或修改账户数据时,用你的私钥“盖的章”。节点一验章,就知道“这确实是他本人操作的”,也就是授权。

2.6 RPC (远程过程调用节点)

2.6.1 是什么

区块链外围的服务亭(比如你刚试过的 https://api.devnet.solana.com 或 Helius 的节点)。

2.6.2 作用

不论你是要在网页上查询你的 SOL 余额(Query),还是通过 Web3 SDK 把签名好的交易(Transaction)丢上链,统统得通过 HTTP(甚至是 WebSocket 实时订阅)发给 RPC 节点。节点负责将这些包裹进一步分发到区块链主干网上的那些验证器进行执行打包。

2.7 DApp (去中心化应用前端)

2.7.1 是什么

为了不让用户对着命令行或者代码界面发呆而写的图形化网页系统。

2.7.2 典型框架

像目前 Solana 官方推崇的 @solana/wallet-adapter 组件。它能在网页上悬浮一个类似于 Phantom、Solflare 的插件图标,让用户在可视化的界面里点击一键登录,并对后端的转账交易弹出授权框。

3. 避坑第一条:别跟“代理”较劲!

刚开始跑 solana airdrop 就给我吃了一记闭门羹:connection closed via error

真相大白: Solana CLI 底层用的 Rust reqwest 库,在处理 macOS 代理时简直是“洁癖”。curl 都能通,它就是不通。咱也不知道为啥,但是查了很多资料之后直接放弃死磕到底,走捷径还是很轻松的。

  • 基础知识点: Solana 节点通信走的是 JSON-RPC 协议
  • 代码补充: 只要 RPC 节点配置对,其实一行代码就能查余额。
    // Web3.js 基础:连接节点并查询
    const connection = new Connection("https://api.devnet.solana.com");
    const balance = await connection.getBalance(myPublicKey);
    
  • 解决方案: 别死磕官方 RPC 了。换个 QuickNodeHelius 的免费专用节点,关掉代理直连,瞬间丝滑。

4. SPL Token:为什么我发个币要建一堆“口袋”?

在 Solana 上发币,全网只有一个主程序(Token Program)。你发币其实只是在“填表格”:

  1. Mint Account(铸币账户):这就是币的“身份证”,定义了谁能印钱。
  2. Token Account(代币账户):你的主钱包不能直接装币!想接某种币,必须在名下挂一个专属的“口袋账户”。
    • 核心逻辑: 所有的转账,本质上是 Token Program 这个“大管家”在帮你修改 A 口袋 and B 口袋里的数字。

5. 钱包、签名、公钥:三位一体的“印章”逻辑

  • 钱包(Phantom/CLI):它是你的印章保管员。私钥永远不出钱包,只负责在交易包上盖个戳(签名)。
  • 公钥(Public Key):你的收款码/身份证照,全网公开。
  • 签名验证(Ed25519):节点不需要你的私钥,它通过你的“签名结果”+“公钥照片”+“交易内容”进行数学推导,一眼就能看出这戳是不是印章盖的。

6. 终极奥义:Solana 凭什么这么快?

这绝对是面试必考题。Solana 的“多核并发”不是吹的。

1. 强制“提前报备”(Sealevel 引擎)

在以太坊,你不知道交易会动谁。而在 Solana,每个交易必须明确声明:我要读写哪些账户

  • 专业解释: 调度器一旦发现两笔交易操作的账户互不干扰,就会把它们分给不同的 CPU 核心并行处理

2. Rust 的天生优势

Solana 选 Rust 是有原因的。Rust 的**所有权(Ownership)**和内存安全机制,让它在多核高并发读写内存时,依然能保证不发生数据竞争(Data Race)。

3. PoH(历史证明)

给全网加了个“精准节拍器”。节点之间不用再在那儿磨叽“现在几点了”,大家看时间戳就能排好队,CPU 闷头猛算就行。

总结:Solana 的工程哲学

如果你习惯了 Web2 或者以太坊,初见 Solana 可能会觉得它设计得太繁琐。但一旦你接受了 “数据与代码分离”、“声明式读写” 这种设定,你会发现这是一个极致追求性能的分布式操作系统

❌
❌