Token trên Solana
Token là tài sản kỹ thuật số đại diện cho quyền sở hữu đối với nhiều loại tài sản khác nhau. Tokenization cho phép số hóa quyền sở hữu tài sản. Token trên Solana được gọi là SPL (Solana Program Library) Token.
Phần này bao gồm các khái niệm cơ bản về cách token được biểu diễn trên Solana. Tham khảo phần SPL Token Basics để xem các ví dụ mã.
Điểm chính
-
Token Programs chứa tất cả logic hướng dẫn để tương tác với token trên mạng (cả token có thể thay thế và không thể thay thế).
-
Mint Account đại diện cho một token cụ thể và lưu trữ metadata toàn cục về token như tổng cung và mint authority (địa chỉ được ủy quyền để tạo ra các đơn vị mới của token).
-
Token Account theo dõi quyền sở hữu cá nhân đối với token cho một mint account cụ thể cho một chủ sở hữu cụ thể.
-
Associated Token Account là một Token Account được tạo với địa chỉ được lấy từ địa chỉ chủ sở hữu và mint account.
Token Programs
Hệ sinh thái Solana có hai Token Programs chính. Mã nguồn cho cả hai chương trình bên dưới.
Token Program (Nguyên bản)
- Khả năng token cơ bản (mint, chuyển khoản, v.v.)
- Bất biến và được sử dụng rộng rãi
Token Extension Program (Token 2022)
- Bao gồm tất cả tính năng của Token Program nguyên bản
- Thêm tính năng thông qua "extensions"
Token Programs chứa tất cả logic hướng dẫn để tương tác với token trên mạng (cả token có thể thay thế và không thể thay thế). Tất cả token trên Solana về cơ bản là tài khoản dữ liệu thuộc sở hữu của Token Program.
Token Program
Mint Account
Token trên Solana được xác định duy nhất bởi địa chỉ của Mint Account thuộc sở hữu của Token Program. Tài khoản này hoạt động như một bộ đếm toàn cục cho một token cụ thể và lưu trữ dữ liệu như:
- Supply: Tổng cung của token
- Decimals: Độ chính xác thập phân của token
- Mint authority: Tài khoản được ủy quyền để tạo ra các đơn vị mới của token, làm tăng tổng cung
- Freeze authority: Tài khoản được ủy quyền để đóng băng token trong một Token Account, ngăn chặn việc chuyển hoặc đốt token
Mint Account
Chi tiết đầy đủ được lưu trữ trên mỗi Mint Account bao gồm những thông tin sau:
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<Pubkey>,/// 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 initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Để tham khảo, đây là liên kết Solana Explorer đến USDC Mint Account.
Token Account
Token Program tạo ra Token Accounts để theo dõi quyền sở hữu cá nhân của từng đơn vị token. Một Token Account lưu trữ dữ liệu như:
- Mint: Token mà Token Account nắm giữ các đơn vị của nó
- Owner: Tài khoản được ủy quyền để chuyển token từ Token Account
- Amount: Số lượng token mà Token Account hiện đang nắm giữ
Token Account
Chi tiết đầy đủ được lưu trữ trên mỗi Token Account bao gồm những thông tin sau:
pub struct Account {/// The mint associated with this accountpub 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 delegatepub delegate: COption<Pubkey>,/// The account's statepub 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<u64>,/// The amount delegatedpub delegated_amount: u64,/// Optional authority to close the account.pub close_authority: COption<Pubkey>,}
Một ví cần một token account cho mỗi token (mint) mà nó muốn nắm giữ, với địa chỉ ví được đặt làm chủ sở hữu token account. Mỗi ví có thể sở hữu nhiều token account cho cùng một token (mint), nhưng một token account chỉ có thể có một chủ sở hữu và nắm giữ các đơn vị của một token (mint).
Account Relationship
Lưu ý rằng dữ liệu của mỗi Token Account bao gồm trường owner
xác định ai có
quyền đối với Token Account. Điều này khác với chủ sở hữu chương trình được chỉ
định trong loại Account cơ bản, đó là Token
Program cho tất cả các Token Account.
Associated Token Account
Associated Token Accounts đơn giản hóa quá trình tìm địa chỉ token account cho một mint và chủ sở hữu cụ thể. Hãy coi Associated Token Account như "token account mặc định" cho một mint và chủ sở hữu cụ thể.
Tài khoản Token Liên kết được tạo với địa chỉ được lấy từ địa chỉ của chủ sở hữu và địa chỉ của tài khoản mint. Điều quan trọng cần hiểu là một Associated Token Account chỉ đơn giản là một token account với một địa chỉ cụ thể.
Điều này giới thiệu một khái niệm quan trọng trong phát triển Solana: Program Derived Address (PDA). Một PDA tạo ra một địa chỉ một cách xác định bằng cách sử dụng các đầu vào được xác định trước, giúp dễ dàng tìm địa chỉ của một tài khoản.
Associated Token Account
Lưu ý rằng mỗi ví cần có token account riêng để lưu giữ token từ cùng một mint.
Mối quan hệ tài khoản mở rộng
Ví dụ về Token CLI
CLI spl-token
giúp bạn thử nghiệm với SPL token. Các ví dụ dưới đây sử
dụng terminal của Solana Playground để chạy các lệnh
CLI trực tiếp trong trình duyệt mà không cần cài đặt cục bộ.
Việc tạo token và tài khoản yêu cầu SOL cho tiền đặt cọc thuê tài khoản và phí
giao dịch. Đối với người dùng Solana Playground lần đầu, hãy tạo một ví
Playground và chạy lệnh solana airdrop
trong terminal Playground. Bạn cũng
có thể nhận SOL devnet từ web faucet công khai.
$solana airdrop 2
Chạy spl-token --help
để xem tất cả các lệnh có sẵn.
$spl-token --help
Để cài đặt CLI spl-token
cục bộ, hãy chạy:
$cargo install spl-token-cli
Tìm thêm ví dụ trong tài liệu spl-token
documentation.
Các địa chỉ tài khoản hiển thị trong đầu ra terminal của bạn khác với các ví dụ
bên dưới. Sử dụng các địa chỉ từ terminal Playground của bạn khi làm theo. Ví
dụ, lệnh create-token
xuất ra địa chỉ tài khoản mint với ví Playground của
bạn là mint authority.
Tạo một Token mới
Để tạo một token mới (tài khoản mint), hãy chạy:
$spl-token create-token
Đầu ra sẽ trông như sau:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Một mint account mới bắt đầu với lượng cung bằng không. Kiểm tra lượng cung hiện tại với:
$spl-token supply <TOKEN_ADDRESS>
Lệnh supply
cho một token mới trả về 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Tạo một mint account mới yêu cầu một giao dịch với hai chỉ thị. Đây là ví dụ bằng Javascript trên Solana Playground.
-
System Program tạo một tài khoản mới với không gian cho dữ liệu mint account và chuyển quyền sở hữu cho Token Program.
-
Token Program khởi tạo dữ liệu của tài khoản mới dưới dạng mint account
Tạo token account
Để lưu trữ token của một mint cụ thể, hãy tạo một token account:
$spl-token create-account <TOKEN_ADDRESS>
Ví dụ lệnh:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Kết quả:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Lệnh create-account
tạo một associated token account với địa chỉ ví của
bạn là chủ sở hữu.
Để tạo một token account với chủ sở hữu khác:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Lưu ý: <TOKEN_ADDRESS>
chỉ định mint account cho token account.
Ví dụ lệnh:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Kết quả:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Tạo một associated token account yêu cầu một chỉ thị gọi Associated Token Program. Đây là ví dụ bằng Javascript trên Solana Playground.
Associated Token Program sử dụng Cross Program Invocations để:
- Gọi System Program để tạo một tài khoản mới sử dụng PDA đã cung cấp làm địa chỉ
- Gọi Token Program để khởi tạo dữ liệu token account
Để tạo một Token Account mới với một keypair mới thay vì địa chỉ Associated Token Account, hãy gửi một giao dịch với hai chỉ thị. Đây là một ví dụ bằng Javascript trên Solana Playground.
-
System Program tạo một tài khoản mới với không gian cho dữ liệu Token Account và chuyển quyền sở hữu cho Token Program.
-
Token Program khởi tạo dữ liệu dưới dạng Token Account
Phát hành Token
Để tạo các đơn vị mới của một token, hãy phát hành token vào một Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Lệnh ví dụ:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Kết quả:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Để phát hành token vào một token account khác:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Kết quả:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Chỉ thị MintTo
trên Token Program tạo ra các token mới. Mint authority
phải ký giao dịch. Chỉ thị này phát hành token vào một Token Account và tăng
tổng cung cấp trên Mint Account. Đây là một ví dụ bằng Javascript trên
Solana Playground.
Chuyển Token
Để chuyển token giữa các token account:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Lệnh ví dụ:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Kết quả:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
Chỉ thị Transfer
trên Token Program xử lý việc chuyển token. Chủ sở hữu
của Token Account người gửi phải ký giao dịch. Chỉ thị này di chuyển token giữa
các Token Account. Đây là một ví dụ bằng Javascript trên
Solana Playground.
Cả người gửi và người nhận đều cần token account cho token cụ thể (mint). Người gửi có thể bao gồm các chỉ thị để tạo token account của người nhận trong cùng một giao dịch.
Tạo Token Metadata
Chương trình Token Extensions cho phép bạn lưu trữ metadata (tên, ký hiệu, liên kết hình ảnh) trực tiếp trên Mint Account.
Để tạo token với phần mở rộng metadata:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Kết quả:
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbTo initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczPDecimals: 9Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai
Để khởi tạo metadata:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
Token URI liên kết đến metadata ngoài chuỗi. Xem ví dụ về định dạng JSON tại đây.
Lệnh ví dụ:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Xem metadata trên Solana Explorer.
Tìm hiểu thêm trong Hướng dẫn Metadata Extension. Để biết chi tiết về Token Extensions, xem Token Extensions Hướng dẫn bắt đầu và Tài liệu SPL.
Is this page helpful?