账户
在Solana中,账户是用来存储状态的。账户是Solana开发中非常重要的构成要素。
info
tip 要点
- 账户是用来存放数据的
- 每个账户都有一个独一无二的地址
- 每个账户大小不能超过10MB
- 程序派生账户(PDA accounts)大小不能超过10KB
- 程序派生账户(PDA accounts)可以用其对应程序进行签名
- 账户大小在创建时固定,但可以使用realloc进行调整
- 账户数据存储需要付租金
- 默认的账户所有者是"系统程序"
深入
账户模型
在Solana中有三类账户:
- 数据账户,用来存储数据
- 程序账户,用来存储可执行程序
- 原生账户,指Solana上的原生程序,例如"System","Stake",以及"Vote"。
数据账户又分为两类:
- 系统所有账户
- 程序派生账户(PDA)
每个数据账户都有一个地址(一般情况下是一个公钥)以及一个所有者(程序账户的地址)。 下面详细列出一个账户存储的完整字段列表。
字段 | 描述 |
---|---|
lamports | 这个账户拥有的lamport(兰波特)数量 |
owner | 这个账户的所有者程序 |
executable | 这个账户成是否可以处理指令 |
data | 这个账户存储的数据的字节码 |
rent_epoch | 下一个需要付租金的epoch(代) |
关于所有权,有几条重要的规则:
- 只有账户的所有者才能改变账户中的数据,提取lamport
- 任何人都可以向数据账户中存入lamport
- 当账户中的数据被抹除之后,账户的所有者可以指定新的所有者
程序账户不储存状态。
例如,假设有一个计数程序,这个程序用来为一个计数器加数,你需要创建两个账户,一个用于存储程序的代码, 另一个用于存储计数器本身。
为了避免账户被删除,必须付租金。
租金
在账户中存储数据需要花费SOL来维持,这部分花费的SOL被称作租金。如果你在一个账户中存入大于两年租金的SOL, 这个账户就可以被豁免付租。租金可以通过关闭账户的方式来取回。lamport会被返还回你的钱包。
租金在这两个不同的时间点被支取:
- 被一个交易引用的时候
- epoch更迭时
收取的租金,一定百分比会被销毁,另一部分会在每个slot(插槽)结束时被分配给投票账户。
当一个账户没有足够的余额支付租金时,这个账户会被释放,数据会被清除。
其他资料
致谢
这些核心概念来源于Pencilflip. 在Twitter上关注他.