从 'Just Data' 到 'A Global Database':我学习 Solana 的第二周
Source: Dev.to
请提供您想要翻译的文章正文(除代码块和 URL 之外的文字),我将把它翻译成简体中文并保持原有的 Markdown 格式。谢谢!
期望 vs. 现实
在我动手写代码之前,我想象区块链数据是这样的:
- 交易存放在某个数据库里。
- 我需要特殊权限才能读取它们。
- 数据默认是孤立的、私有的。
- 也许我需要自己运行一个完整节点。
我实际发现的情况:
我可以在互联网上查询一个随机的程序地址,立刻看到它的余额、所有者、可执行标志以及交易历史。无需 API 密钥。无需权限。无需凭证。只有:
const account = await connection.getAccountInfo(publicKey);
console.log(account.lamports); // 2,500,000,000
那一刻,当我运行 npm run inspect 并立即看到我的账户详情出现时?那就是顿悟。
The Moment It Clicked: “Public By Default”
在第 11 天,我制作了一张传统数据库与 Solana 账户的对比表。最让我震撼的一行是:
| Feature | Database | Solana |
|---|---|---|
| Visibility | Private by default; you choose what to expose | Public by default; anyone can read any account’s data |
在 Web 2 中,我习惯把数据库视作堡垒:先筑墙,然后决定谁能进入。而在 Solana 上,每个账户在创建的那一刻就是一本公开的账本。安全模型被彻底颠倒。这不是 bug——而是特性。
当我在第 12 天分别查询 devnet 和 mainnet 上的同一地址时,看到:
- Devnet – 0.001159846 SOL,最近的交易,新的账户
- Mainnet – 0.069875097 SOL,不同的交易历史,独立的状态
同一个地址。相同的区块链。不同的网络。不同的数据。
这才终于说得通:这不是单一数据库,而是 多个分布式账本,它们都可以以同样的方式查询,且天生公开。
最令人惊讶的事情:没有 JOIN
当我得知 Solana 程序之间不能相互查询——没有 JOIN、没有服务器端过滤、没有 SQL——时,我起初以为这是一个限制。事实并非如此。这是一种完全不同的思维模型。
在传统 API 中,我会请求 /users/123/posts,服务器会把 users 表和 posts 表进行 JOIN。Solana 的工作方式并非如此。程序把账户作为输入。如果我想“查询”相关数据,需要在客户端获取并自行组装。
起初这感觉有点笨拙。随后我意识到:这正是 Solana 如此快速的原因。没有服务器决定如何优化我的查询。我得到的是原始数据,随后可以按需组合使用。
RPC 调用 vs. 传统 API
我多年来一直在使用 REST API。这个模式很熟悉:
- 发起请求
- 等待服务器思考
- 收到 JSON 响应
- 希望其中包含你需要的内容
RPC 调用的感觉不同——更快、更简洁。
const signatures = await connection.getSignaturesForAddress(publicKey, {
limit: 5,
});
这会返回交易签名。不是一个漂亮的仪表盘,也不是一个摘要——只有数据本身。API 的表面很薄;结果是原始的。它迫使我思考我真正需要的是什么,而不是 API 决定给我什么。
Source: …
租金模型:真实货币成本的存储
在 Solana 上,存储费用是明确的,并且与您的账户绑定。
在第 11 天,我编写了一个租金计算器:
| 账户大小 | 大约租金(lamports) |
|---|---|
| 0 字节 | ~890,880 |
| 1,000 字节 | ~1,874,880 |
在 Web 2 中,存储是抽象的——您在电子表格中支付每月的 AWS 账单。 在 Solana 上,您按 每字节 支付。 每一个字节都由您自行管理。
这既激进、令人恐惧,又很聪明。它让您思考数据效率,对膨胀产生后果,并将存储转变为一种功能,而非外部性。
仍然让我困惑的事
- ✗ 程序派生地址 (PDAs) – 我经常看到它们被提及,但还没有构建过。
- ✗ 跨程序调用 (CPIs) – 程序如何安全地调用其他程序?
- ✗ 账户与钱包的区别 – 我了解技术层面的区别,但在概念上仍然模糊。
- ✗ 租金退款 – 当我关闭账户时,lamports 会返回……到哪里?
本周要点
- ✅ 账户是对象 – 不是表中的记录,也不是数据库中的文档。对象包含数据、所有者和权限。
- ✅ 公开数据是默认的 – 不是需要你去启用的东西,而是需要你有意隐藏的东西。
- ✅ 相同地址 ≠ 跨网络相同账户 – devnet、testnet、mainnet 是完全独立的区块链。你的地址看起来相同,但状态不同。
- ✅ “读取链上数据”只是获取 – 没有联接、没有事务、没有超出最终性之外的一致性保证。只需要:“把这个账户的数据给我”。
下周计划
我已经花了两周时间阅读。下周我想要 写。
不是交易。不是消息。我想用自己的程序向区块链写入数据。我想了解创建账户、在其中存储东西,然后修改它时会发生什么。
我想亲身感受运行时所强制的含义:“只有你的程序可以修改你的数据。”
大局
两周前,我认为区块链是账本。现在我认为它是数据库——按 Web 2 标准来说有点怪,但仍然是数据库。
规则不同:
- 没有模式
- 没有服务器
- 默认没有私有数据
- 没有连接操作
- 存储成本是显式的
感觉很奇怪。感觉在某些我还没有命名的方面有点破碎。但它也感觉真实、透明且分布式——这值得我们去构建。
当你开始学习 Solana 时,最让你惊讶的是什么?留下评论——我很想知道。
公开构建。公开学习。第 1‑13 天,共 100 天。