1_Solana账户模型

深入理解 Solana 账户模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
pub struct Account {
/// 账户余额
/// lamports in the account
pub lamports: u64,


// 合约数据
/// data held in this account
#[serde(with = "serde_bytes")]
pub data: Vec<u8>,

// 所有者:
// on-chain program
// 可以写入
// 可花费lanport
/// the program that owns this account. If executable, the program that loads this account.
// This field stores the address of an on-chain program and represents which on-chain program is allowed to write to the account’s data and subtract from its lamport balance.
pub owner: Pubkey,

// 是否可执行
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,


/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}

程序账户(Program Account)

简化版如下:

数据账户(Data Account)

为自定义程序创建一个数据账户(Data Account),可以分为2步:

  • 1, 调用 System Program 创建一个账户,然后将权限转移给自定义程序
  • 2, 调用自定义程序(此时是账户的owner)初始化该账户的数据

Solana账户规则:

https://solana.wiki/docs/solidity-guide/accounts/#solana-runtime-account-rules

  • 不可变性:

    • 可执行账户完全不可变
  • 数据分配

    • System Program 可以更改账户数据大小
    • 新分配的账户数据总是归零的
    • 账户数据大小不可缩小

      在写入期间,程序不能增加其拥有的账户数据大小, 如果需要更多数据,必须将数据拷贝到更大账户中,因此,程序不会在账户中存储动态大小的maps和数组,而是,将数据存储在多个账户中

  • 数据

    • 每个账户最多 10MB 数据(代码 或 状态)
    • 只有账户的owner才可以修改数据
    • 账户只有处于数据归零状态下才可以分配新的owner
  • 余额

    • 只有账户的owner可以减少余额
    • 任何程序账户都可以账户增加余额(转移)

      如果一个账户的owner是程序,那么,不能通过私钥操作该账户的余额,因为,私钥账户(普通账户)的owner是System Program, 而System Program 不是该账户的owner, 因此就不能操作该账户的余额

  • 所有权

    • 只有账户owner可以制定新的账户owner
  • 租金

    • 租金每2天(1个epoch)更新一次,由账户大小决定
    • 如果账户的余额大于2年的租金(预存), 那么,该账户可以免除租金(不用交房租)
  • 余额为0的账户

    • 余额为0的账户,在交易执行后会被系统删除
    • 一个交易中可以创建临时余额为0的账户
  • 新的执行账户

    • 只有制定的loader program可以修改账户的可执行状态
  • Copyrights © 2021-2024 youngqqcn

请我喝杯咖啡吧~