账号 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 相关联,账号通过公钥来标识所有权和操作权限,交易中通过公钥指定要操作的账号,从而实现账号与公钥之间的关联。