趣味学Solana(启航)
欢迎来到 Solana 的奇妙世界!无论你是编程老手,还是第一次听说“区块链”这个词,都没关系——本指南将带你像玩游戏一样,亲手在 Solana 上构建属于你的第一个项目!
你会学到什么?
准备好开启一段科技探险了吗?在这趟旅程中,你将掌握:
- Solana 账户:搞懂数据是怎么“住”在区块链上的,就像给数字世界建房子。
- 发送交易:学会如何向网络“发消息”,比如转账或触发智能合约。
- 构建和部署程序:亲手写出你的第一个“智能合约”(我们叫它程序),然后把它上传到区块链!
- 程序派生地址(PDAs):一种神奇的“隐形地址”,没有私钥也能安全使用,超酷!
- 跨程序调用(CPIs):让你的程序去“呼叫”别的程序,实现像乐高积木一样的组合玩法!
最棒的是?不用装任何软件!(合法上网推荐:这个T子试试,一直稳定。免费使用5天:https://rushlmo.org/s/ywtc01/pvijpzy)
一切都在浏览器里完成。我们将使用 Solana Playground —— 一个专为开发者打造的“沙盒游乐场”,代码写完立马就能运行,效果立竿见影!
准备好了吗?让我们开始吧!
进入 Solana 游乐场:Solpg.io
打开你的浏览器,新开一个标签页,访问这个网址: https://beta.solpg.io/
欢迎来到 Solana Playground —— 你的区块链实验基地!在这里,你可以写代码、部署程序、测试交易,全都不用担心花真钱。
一:创建你的“测试钱包”
每次进游乐场,都得先有个“入场手环”——也就是你的 开发钱包。
第1步:点击“未连接”
在页面左下角,你会看到一个写着 “Not connected” 的按钮,点它!
小提示:这就像是在游戏里点击“开始新游戏”。
第2步:创建钱包
系统会提示你生成一个“密钥对”(别怕,就是一串加密密码)。准备好后,点击 “Continue”。
你的私钥会安全地保存在浏览器里(仅限本地!),所以不要清空缓存,否则钱包就“消失”啦!
创建成功后,你会看到页面底部显示:
- 你的钱包地址(一串酷炫的字母数字组合)
- 当前余额(现在是 0 SOL)
- 连接的网络:默认是
devnet
(开发者测试网)
恭喜!你现在正式“上线”了!
温馨提醒:这个钱包只用于测试!不要往里面存主网(mainnet)的真实 SOL,否则会丢哦!
小知识时间:钱包和网络是啥?
钱包地址是什么?
它就像你在区块链世界的“身份证号码”或“银行账号”。
由一对密钥(公钥 + 私钥)生成,通常是这样的:
7MNj7pL1y7XpPnN7ZeuaE4ctwg3WeufbX5o85sA91J1
- 公钥 = 地址(别人可以给你打钱)
- 私钥 = 开门钥匙(签名交易用,千万不能泄露!)
在 Solana 上,所有东西都是账户:用户钱包、智能合约、存储数据的地方……统统都是!
什么是“连接的网络”?
前面的章节我们也提到过,Solana 有好几个“平行宇宙”:
网络 | 用途 |
---|---|
devnet | 开发者专用测试网,SOL 是“假”的,随便玩 |
testnet | 验证节点测试用,普通开发者别碰 |
mainnet-beta | 主网!真金白银交易的地方 💸 |
我们现在用的是 devnet,放心大胆地试错吧!
获取免费的 Devnet SOL(虚拟币)
想在链上做事?不管是建账户还是发交易,都要烧点“燃料”——也就是 SOL。
但在 devnet
上,SOL 可以白嫖!
你需要 SOL 来:
- 创建新账户(比如存数据)
- 支付交易手续费(非常便宜,几分钱都够用)
方法一:用 Playground 终端一键空投(推荐)
在 Playground 的终端里输入这行命令,然后回车:
solana airdrop 5
Boom!5 个 devnet SOL 直接送进你钱包!
“空投”就像从天而降的礼物包,开发者福利!
如果提示“速率限制”或失败,别急,还有备选方案
方法二:网页空投机(Web Faucet)
- 打开 https://solfaucet.com(或其他 Solana devnet 空投网站)
- 把你的钱包地址复制粘贴进去
- 选择金额(比如 1 或 2 SOL)
- 点击 “Request Airdrop” 或 “确认空投”
几秒钟后,SOL 就到账啦!
小贴士:空投有限额,别一口气要太多,省着点花~
从 Solana 网络“偷看”数据
整个 Solana 区块链就像一个巨大的、公开的 表格,里面存着所有人和程序的数据。但这个表格有个规则:所有数据都存在“账户”里,而且每个账户长得都差不多,就像统一规格的“数据盒子”。今天,我们就来当一回“区块链侦探”,学会如何打开这些盒子,看看里面到底装了啥!
所有东西都是“账户”
在 Solana 上,一切皆是账户。钱包、代币、智能合约……全都是“账户”。它们的底层结构长这样(别怕,我们用人话解释):
#[derive(PartialEq, Eq, Clone, Default)]
pub struct Account {pub lamports: u64, // 这个盒子有多少钱(以“小铜板”为单位)#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))] pub data: Vec<u8>, // 盒子里装的数据(可能是状态,也可能是代码)pub owner: Pubkey, // 谁拥有这个盒子?pub executable: bool, // 这个盒子是不是“可执行程序”?(比如智能合约)pub rent_epoch: Epoch, // 已废弃的字段,现在只是个“纪念品”
}
你可以把每个账户想象成一个带锁的抽屉:
- 谁拥有它? →
owner
- 里面有多少钱? →
lamports
- 装的是代码还是数据? → 看
executable
和data
- 能不能运行? → 看
executable
是不是true
场景一:查看一个“钱包”账户
我们先来打开一个最简单的盒子——钱包。
实验步骤:
- 生成一个新钱包(密钥对)
- 给它“空投”一些测试币(SOL)
- 查看它的账户信息
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";// 1. 生成新钱包
const keypair = Keypair.generate();
console.log(`新钱包地址: ${keypair.publicKey}`);// 2. 连接网络(比如本地测试网)
const connection = new Connection("http://localhost:8899", "confirmed");// 3. 空投 1 个 SOL(测试币)
const signature = await connection.requestAirdrop(keypair.publicKey,LAMPORTS_PER_SOL // 1 SOL = 10^9 lamports
);
await connection.confirmTransaction(signature, "confirmed");// 4. 查看这个钱包的账户信息
const accountInfo = await connection.getAccountInfo(keypair.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));
打开盒子后,看到什么?
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0
}
🔍 解读一下:
字段 | 含义 |
---|---|
data | 空的!钱包不存复杂数据,只存钱 |
executable | false → 不是程序,不能运行 |
lamports | 10亿 = 1 SOL,有钱! |
owner | 111...111 → 系统程序(System Program)拥有它,它是“原生钱包” |
space | 0 字节 → 因为 data 是空的 |
小结:钱包 = 一个由系统程序拥有的、只存钱的空盒子。
场景二:查看“程序”账户 —— Token Program
接下来,我们去看看一个“智能合约”长啥样。我们以 Solana 的 Token Program(代币程序)为例。
它的地址是:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
const connection = new Connection("https://api.mainnet-beta.solana.com");
const programAddress = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
const accountInfo = await connection.getAccountInfo(programAddress);
console.log(accountInfo);
打开后,看到:
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080
}
🔍 解读:
字段 | 含义 |
---|---|
data | 超长字节!这是编译后的程序代码(.so 文件) |
executable | true → 这是个可运行的程序! |
owner | BPFLoader2... → 由“加载器程序”拥有,这是部署程序的规则 |
space | 134,080 字节 → 程序代码挺大 |
小结:程序账户 = 一个存了代码的盒子,可以被调用执行。
场景三:查看“代币信息” —— Mint 账户
现在我们来看一个更有趣的盒子:USDC 的 Mint 账户。
地址:
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
const mintAddress = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await connection.getAccountInfo(mintAddress);
console.log(accountInfo);
打开后:
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82
}
解读:
字段 | 含义 |
---|---|
data | 82 字节的原始数据 → 是“USDC 的配置信息” |
executable | false → 不是程序,不能运行 |
owner | Tokenkeg... → 是 Token Program 拥有它 |
lamports | 存了约 407 SOL → 用来“租”这 82 字节的空间 |
问题来了:
data
是一串看不懂的字节,怎么知道它代表什么?
把“乱码”变“人话”——反序列化
data
字段存的是二进制数据,就像加密文件。要读懂它,必须用正确的“解码器”——也就是 反序列化(Deserialize)。
幸运的是,Solana 社区提供了现成的工具包,比如:
import { getMint } from "@solana/spl-token";const mintData = await getMint(connection, mintAddress);
console.log(mintData);
输出结果(终于看懂了!):
{"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG","supply": "8985397351591790","decimals": 6,"isInitialized": true,"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar","tlvData": {"type": "Buffer","data": []}
}
解读 USDC 的“身份证”:
字段 | 含义 |
---|---|
supply | 总供应量:约 89.85 亿 USDC |
decimals | 小数位:6 位 → 所以 8985397351591790 ÷ 10^6 = 8,985,397,351.591790 USDC |
mintAuthority | 谁能印新币?Circle 公司的钱包地址 |
freezeAuthority | 谁能冻结账户?也是 Circle → 合规性设计 |
小结:Mint 账户 = 一个由 Token Program 拥有的“代币配置文件”盒子。
三种账户大对比
类型 | 示例 | executable | data 内容 | owner |
---|---|---|---|---|
钱包账户 | 你的钱包 | N | 空 | System Program |
程序账户 | Token Program | Y | 编译代码 | BPFLoader |
Mint 账户 | USDC 信息 | N | 代币配置 | Token Program |
关键知识点
- 所有数据都在账户里,账户是 Solana 的基本存储单元。
- 程序和状态分离:代码存在程序账户,数据存在状态账户(比如 Mint)。
data
是二进制,要读懂必须反序列化。owner
决定谁能改数据:只有拥有者程序才能修改其账户。- 工具库帮你省事:用
@solana/spl-token
这类包,轻松解析常见数据。