Solana账户模型与ETH有很大不同

账户属性:owner、executable、data、rent、lamports,还有一个特殊的属性signer,表示transaction时能将该账户标记为signed的账户

lamports是SOL原生代币余额

rent是租金余额,理论上是每n个区块会收取一次,余额不足时会被清理,但余额若超过某个数额就直接不收取,成为永久账户

标记了executable的账户是program,owner将为BPF loader,data中存储BPF bytecode

存在三个原生Program:System ProgramBPF Loader ProgramVote program

账户owner总是一个program,所有账户默认owner都是System Program,例如用户的账户(由一对公私钥控制,公钥就为账户地址),只有owner才能修改账户data。

自行部署的程序也可以创建账户,这些账户被称为PDA,调用System Program提供的create_account创建。

账户的owner只能被owner改变,且要求此时账户的data size为0或内容全0

对于一对公私钥控制控制的账户,signer就是掌握私钥的用户,对于PDA,signer就是派生出该地址的账户,注意,由于owner可以被修改,PDA的owner不一定就是signer

大小限制

每个account的最大空间都是10MiB,同时,一个transaction最多能增减20MiB的空间(所有操作/账户的和),一个instruction中每个account最多增加10KiB的空间

分配大账户方法:

  1. 10KiB似乎只针对CPI,用户直接拿一对公私钥去调用***SystemProgram::CreateAccount***不受限制,可以直接分配10MiB,不过这样就不是PDA了,还需要调用额外指令将owner转移给需要使用该Account的Program
  2. 初始化10KiB的PDA,不停realloc,每次增长10KiB

参考:

  1. An Introduction to the Solana Account Model | QuickNode