代币 SPL
在以太坊中,我们可以通过 ERC20
协议发行代币,这种代币统称 ERC20
代币。
那么 Solana
里的 ERC20
代币是什么呢?答案就是 SPL
代币。
The Solana Program Library (SPL) is a collection of on-chain programs targeting the Sealevel parallel runtime.
SPL Token
是 "Solana Program Library" 中的一个组成部分,叫做 "Token Program"。
所有代币都由这个合约来管理,合约代码位于 https://github.com/solana-labs/solana-program-library/tree/master/token。
代币信息
在以太坊中,一个代币就是一个 ERC20
合,而 Solana
则不同。
Solana
的 SPL Token
中,一个代币仅仅是一个归 Token 合约管理的普通的 Account
对象。
在这个对象里面的二进制数据定义了代币的基本属性:
结构如下:
pub struct Mint { /// Optional authority used to mint new tokens. The mint authority may only be provided during /// mint creation. If no mint authority is present then the mint has a fixed supply and no /// further tokens may be minted. pub mint_authority: COption, /// Total supply of tokens. pub supply: u64, /// Number of base 10 digits to the right of the decimal place. pub decimals: u8, /// Is `true` if this structure has been initialized pub is_initialized: bool, /// Optional authority to freeze token accounts. pub freeze_authority: COption, }
其中 supply 表示总供应量,decimals 表示精度信息。
SPL Token Account
那么每个用户的拥有的代币数量信息存在哪里呢?
这个合约又定义了一个账号结构,用来表示某个地址拥有代币的数量:
pub struct Account { /// The mint associated with this account pub mint: Pubkey, /// The owner of this account. pub owner: Pubkey, /// The amount of tokens this account holds. pub amount: u64, /// If `delegate` is `Some` then `delegated_amount` represents /// the amount authorized by the delegate pub delegate: COption, /// The account's state pub state: AccountState, /// If is_native.is_some, this is a native token, and the value logs the rent-exempt reserve. An /// Account is required to be rent-exempt, so the value is used by the Processor to ensure that /// wrapped SOL accounts do not drop below this threshold. pub is_native: COption, /// The amount delegated pub delegated_amount: u64, /// Optional authority to close the account. pub close_authority: COption, }
其中 owner 表示谁的代币,amount 表示代币的数量。
Account 关系
整体结构如下:
这两个结构体都是 SPL Token Program 管理的 Account
对象,其自身所携带的数据,分别为代币信息和存储哪个代币的信息。
这样当需要进行代币的交易时,只需要相应用户的相应代币账号里面的 amount 即可。