{"content":{"title":"Solana账户模型介绍","body":"## 概述\r\n\r\n[Solana](https://solana.com/) 账户模型是 Solana 生态系统的关键部分，对于开发者来说，尤其是从其他区块链转型过来的开发者，理解它可能是最困难的概念之一。为了在 Solana 区块链上高效工作，深入理解账户模型非常重要。让我们首先定义什么是账户，并探索不同类型的账户以及如何创建和与它们交互。\r\n\r\n## 什么是账户？\r\n\r\n账户是 Solana 区块链上存储数据的任何地方。Solana 区块链与其他区块链（如以太坊）相比的独特之处在于数据是如何存储和管理的。以下是不同的账户类别：\r\n\r\n- **程序账户** - 这些账户存储可执行代码，相当于以太坊的智能合约。\r\n\r\n- **存储账户** - 这些账户存储与程序相关的数据。\r\n\r\n- **代币账户** - 这些账户跟踪账户的代币余额，并允许在账户之间转移或接收代币。\r\n\r\n在 Solana 区块链中，程序与程序的数据/状态是分离的。两者被分配了独立的账户，但它们是相互关联的。与此相比，在以太坊中，智能合约及其数据位于区块链上的一个位置。如果你要创建一个计算程序进行代币转移次数的程序，你需要创建用于进行转移的程序，以及另一个账户来存储转移次数。\r\n\r\n![两幅图，一幅标题为“程序账户”，另一幅标题为“数据账户”，从“数据账户”指向“程序账户”有一箭头。](https://img.learnblockchain.cn/2025/02/25/0-769417a502e1675a4ba31cca4075e6d4.png)\r\n\r\n[图片来源](https://solanacookbook.com/assets/account_example.5b70d95a.jpeg)\r\n\r\n举个传统金融世界的例子，你可以将程序看作借记卡，将银行看作存储账户，将账户余额看作代币账户。虽然它们相互关联，但它们位于不同的地方。如果你丢失了借记卡，你并不会丢失银行账户（但可能会丢失账户中的资金）。你的卡也是唯一一张可以通过购买东西来改变账户余额的卡。同样，与存储账户关联的程序是唯一可以改变数据状态的程序。\r\n\r\n## 账户类型\r\n\r\nSolana 区块链上有两种类型的账户：**可执行**和**不可执行**。程序是可执行账户，存储程序的不可变代码。程序代码首先用 Rust 或 C/C++ 编写，然后通过 [LLVM 编译基础设施](https://llvm.org/)编译成字节码。\r\n\r\n数据存储和代币余额存储在不可执行账户中，因为它们的数据可以被更改。为了控制谁可以更改这些数据，不可执行账户会分配一个所有者的程序地址。其他程序可以读取另一个账户的数据，但如果它们试图修改该数据，交易将失败。\r\n\r\n## 租金\r\n\r\n不幸的是，将所有数据存储到单独的账户中并不是免费的，而是会产生一些成本。对开发者来说，幸运的是，这些成本以 **租金**([**rent**](https://docs.solana.com/implemented-proposals/rent)) 形式支付，以 lamports 为单位。Lamports 是 Solana 代币 SOL 的分数单位，用于在 Solana 区块链上进行微支付。租金费用是根据账户的存储大小计算的。存储的数据越多，租金费用越高。\r\n\r\n租金费用在 Solana 区块链的每个 epoch 结束时收取。Epoch 是当前验证者仍然有效以生成交易区块的时间。你可以在 [Solana Explorer](https://explorer.solana.com/) 上查看当前和过去 epoch 的数据。\r\n\r\n在撰写本文时，一个 epoch 大约持续 2 天。就像在现实生活中一样，如果账户余额为零且无法支付租金费用，它将被从区块链中移除。\r\n\r\n账户可以通过在其代币余额中持有至少 2 年的租金来免租金。估计租金成本的一个简单方法是通过 Solana CLI 使用 [solana rent](https://docs.solana.com/cli/usage#solana-rent) 命令。通过提供账户的大小（以字节为单位），你将看到每字节、每个 epoch 的租金以及账户免租金所需的最低金额：\r\n\r\n![显示 Solana rent 命令在终端中运行的终端窗口](https://img.learnblockchain.cn/2025/02/25/1-976dc6adb75f1d8f3faaca4bb93843d0.png)\r\n\r\n## 如何创建账户\r\n\r\n要在 Solana 上创建账户，客户端需要生成一个公钥和私钥对。然后，客户端使用 [SystemProgram::CreateAccount](https://docs.solana.com/developing/programming-model/accounts#creating) 调用注册公钥并为此账户分配需要设置的数据存储大小。目前，这个大小之后无法更改，大小限制为 10 MB。如果需要更多大小，程序可以将数据从一个账户复制到容量更大的另一个账户。\r\n\r\n在创建账户时，需要为该账户分配一个所有者。只有账户的所有者才能修改存储在账户中的数据。创建账户后的默认所有者称为“系统程序”。系统程序是 Solana 上的一个 [原生程序](https://docs.solana.com/developing/runtime-facilities/programs)，负责创建账户、分配账户数据并将账户的所有权分配给连接的程序。原生程序是 Solana 上所有验证者都需要运行的程序。\r\n\r\n系统程序还负责为其拥有所有权的账户进行 lamport 转移。如果用户创建一个账户用于存储代币余额，则该代币的转移由系统程序处理。用户将使用他们的私钥签署转移指令，系统程序将负责从发送方扣除代币并将代币贷记到接收方账户。\r\n\r\n## 与账户交互\r\n\r\n由于程序代码和程序存储的数据是独立的账户，任何程序都可以读取另一个账户的数据。任何程序也可以向账户添加 lamport，但只有所有者才能减少它们。这在构建可能需要与不拥有的账户交互的程序时非常有用。\r\n\r\n在读取账户时，你将看到返回的以下数据：\r\n\r\n![在终端中运行的 Solana account 命令](https://img.learnblockchain.cn/2025/02/25/2-8f036bd92bb272d4b3e8fd76969362a9.png)\r\n\r\n[图片来源](https://medium.com/@jorge.londono_31005/understanding-solanas-mint-account-and-token-accounts-546c0590e8e)\r\n\r\n以下是这些数据的详细说明：\r\n\r\n- **公钥** - 分配给该账户的公钥\r\n\r\n- **余额** - 该账户拥有的 SOL 数量\r\n\r\n- **所有者** - 拥有该账户所有权的程序地址\r\n\r\n- **可执行** - 该账户是否为可执行账户\r\n\r\n- **rent_epoch** - 该账户下一次支付租金的 epoch\r\n\r\n- **长度** - 账户的大小\r\n\r\n## 结论\r\n\r\n在 Solana 上，创建和与账户交互是实现任何事情的关键。程序与其使用的数据的分离是代码和状态管理的独特方法。理解所有权规则以及程序在这些规则中的工作方式对于在 Solana 上成功开发非常重要。为了将这些概念付诸实践，请查看我们的一些 [其他 Solana 教程](https://www.quicknode.com/guides/)。\r\n\r\n订阅我们的 [新闻通讯](https://go.quicknode.com/newsletter) 获取更多文章和指南。如果你有任何反馈，请通过 [Twitter](https://twitter.com/QuickNode) 与我们联系。你还可以在我们的 [Discord](https://discord.gg/quicknode) 社区服务器上与一些非常酷的开发者聊天 :)\r\n\r\n>- 原文链接： [quicknode.com/guides/sol...](https://www.quicknode.com/guides/solana-development/getting-started/an-introduction-to-the-solana-account-model)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/25306","address":null},"history":null,"timestamp":1740449232,"version":1}