Solana账户模型与ETH有很大不同
账户属性:owner、executable、data、rent、lamports,还有一个特殊的属性signer,表示transaction时能将该账户标记为signed的账户
lamports是SOL原生代币余额
rent是租金余额,理论上是每n个区块会收取一次,余额不足时会被清理,但余额若超过某个数额就直接不收取,成为永久账户
标记了executable的账户是program,owner将为BPF loader,data中存储BPF bytecode
存在三个原生Program:System Program、BPF Loader Program、Vote 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的空间
分配大账户方法:
*SystemProgram::CreateAccount*
**不受限制,可以直接分配10MiB,不过这样就不是PDA了,还需要调用额外指令将owner转移给需要使用该Account的Program参考: