账号 Account
在 Solana
中,一切都是账号(Everything is an Account),这与 Linux
系统将所有资源抽象为 "文件" 非常相似。
作为一个分布式区块链系统,Solana
将所有信息存储在账号 Account
对象中。
象合约、账户信息以及合约中存储的内容等等,它们都是以账号对象的形式进行存储的。
1. 账号的数据结构
账号 Account
的定义:
pub struct Account { /// lamports in the account pub lamports: u64, /// data held in this account #[serde(with = "serde_bytes")] pub data: Vec, /// the program that owns this account. If executable, the program that loads this account. 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, }
其中:
pub lamports: u64
lamports
字段表示账户中持有的 lamports
数量(Solana
中最小的货币单位)。Lamports
用于支付交易费用、租金以及 Solana
区块链上的其他操作。
pub data: Vec<u8>
data
字段存储与账户关联的数据。它以字节向量(Vec<u8>
)的形式表示,允许存储任意类型的数据在账户中。
pub owner: Pubkey
owner
字段指定了拥有或管理此账户的程序的公钥。如果账户是可执行的,那么这个程序可以加载到该账户中。
-
pub executable: bool
executable
段表示账户是否可执行。如果设置为true
,表示账户包含一个已加载的程序,且现在为只读状态。
-
pub rent_epoch: Epoch
rent_epoch
字段指定了此账户下次需要缴纳租金的时期。在 Solana
中,账户必须支付租金才能继续留在区块链上,这个字段跟踪了下次租金支付的时间。
2. 密钥对
公钥和私钥是一对密钥,通过某种密码学算法生成,称为 密钥对 KeyPair
,私钥用于签名,公钥用于验签。
在 Solana
中,使用 Ed25519
算法来生成 密钥对。数据签名也都使用 Ed25519
算法,而比特币、以太坊则使用椭圆曲线算法 ECC
。
Ed25519
是一种计算快、安全性高,且生成的签名内容小的非对称加密算法,新一代公链几乎都支持这个算法。
Solana
钱包中的账号实际上就是 Ed25519
的私钥。钱包的助记词,会被转换成随机数种子,用来生成一个私钥,所以助记词最终也是转换成私钥。
所以,钱包用户账号的本质就是私钥,而用户账号的地址则是私钥对应的公钥。
由于公钥是二进制的,为了具有可读性,就对其进行了 Base58
编码,从而形成了账号的地址。
例如:HawRVHh7t4d3H3bitWHFt25WhhoDmbJMCfWdESQQoYEy。
3. 账号和公钥的关系
Solana
账号数据结构 Account
与密钥对有什么关系呢?
Solana
账号 Account
是由公钥 Public Key
来标识和管理的。
- 账号所有权
在 Solana
中,每个账号都有一个对应的公钥作为标识,这个公钥决定了谁有权对这个账号进行操作。
Account
结构中的 owner
字段存储着这个账号的所有者公钥。
- 交易操作
在进行交易时,需要指定操作的账号。这个账号就是由公钥来确定的,通过公钥找到对应的账号结构 Account
,然后对账号进行操作,比如转账、更新数据等。
交易中会指定要操作的账号和相应的公钥,Solana
网络根据公钥找到对应的账号来执行交易操作。
总之,Solana
中的账号 Account
结构与公钥 Public Key
相关联,账号通过公钥来标识所有权和操作权限,交易中通过公钥指定要操作的账号,从而实现账号与公钥之间的关联。