Solana'da Tokenler
Tokenler, çeşitli varlık kategorileri üzerindeki sahipliği temsil eden dijital varlıklardır. Tokenleştirme, mülkiyet haklarının dijitalleştirilmesini sağlar. Solana'daki tokenler SPL (Solana Program Library) Tokenleri olarak adlandırılır.
Bu bölüm, tokenlerin Solana'da nasıl temsil edildiğine dair temel kavramları kapsar. Kod örnekleri için SPL Token Temelleri bölümüne bakın.
Önemli Noktalar
-
Token Program, ağdaki tokenlerle (hem değiştirilebilir hem de değiştirilemez) etkileşim için tüm talimat mantığını içerir.
-
Bir Mint Account belirli bir tokeni temsil eder ve toplam arz ve mint yetkisi (bir tokenin yeni birimlerini oluşturmaya yetkili adres) gibi token hakkındaki global meta verileri saklar.
-
Bir Token Account belirli bir mint hesabı için belirli bir sahibin token sahipliğini takip eder.
-
Bir Associated Token Account, sahibin ve mint hesabının adreslerinden türetilen bir adresle oluşturulan bir Token Hesabıdır.
Token Programs
Solana ekosisteminde iki ana Token Program vardır. Her iki programın kaynak kodu aşağıdadır.
Token Program (Orijinal)
- Temel token özellikleri (mint, transfer, vb.)
- Değiştirilemez ve yaygın olarak kullanılır
Token Extension Program (Token 2022)
- Orijinal Token Program'ın tüm özelliklerini içerir
- "Uzantılar" aracılığıyla özellikler ekler
Token Program, ağdaki tokenlerle (hem değiştirilebilir hem de değiştirilemez) etkileşim için tüm talimat mantığını içerir. Solana'daki tüm tokenler, etkili bir şekilde Token Program'ın sahip olduğu veri hesaplarıdır.
Token Program
Mint Account
Solana'daki tokenler, Token Program'ın sahip olduğu bir Mint Account adresi ile benzersiz şekilde tanımlanır. Bu hesap, belirli bir token için global bir sayaç görevi görür ve şunlar gibi verileri saklar:
- Arz: Token'ın toplam arzı
- Ondalık: Token'ın ondalık hassasiyeti
- Mint yetkisi: Token'ın yeni birimlerini oluşturmaya yetkili hesap, arzı artırır
- Dondurma yetkisi: Bir token account içindeki token'ları dondurmaya yetkili hesap, transfer edilmelerini veya yakılmalarını engeller
Mint Account
Her Mint Account'ta saklanan tam detaylar şunları içerir:
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>,}
Referans olarak, işte Solana Explorer'da bir USDC Mint Account bağlantısı.
Token Account
Token Program, her token biriminin bireysel sahipliğini takip etmek için Token Account'ları oluşturur. Bir token account şu gibi verileri saklar:
- Mint: Token account'ın tuttuğu token birimleri
- Sahip: Token account'tan token transfer etmeye yetkili hesap
- Miktar: Token account'ın şu anda tuttuğu token sayısı
Token Account
Her token account'ta saklanan tam detaylar şunları içerir:
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>,}
Bir cüzdan, tutmak istediği her token (mint) için, cüzdan adresi token account sahibi olarak ayarlanmış bir token account'a ihtiyaç duyar. Her cüzdan aynı token (mint) için birden fazla token account'a sahip olabilir, ancak bir token account yalnızca bir sahibi olabilir ve yalnızca bir token'ın (mint) birimlerini tutabilir.
Hesap İlişkisi
Her token account'ın verilerinin, token account üzerinde kimin yetkisi olduğunu
belirten bir owner
alanı içerdiğini unutmayın. Bu, temel
Account türünde belirtilen program
sahibinden farklıdır, ki bu tüm token account'lar için Token Program'dır.
Associated Token Account
Associated token account'lar, belirli bir mint ve sahip için token account adresini bulma sürecini basitleştirir. Associated token account'ı belirli bir mint ve sahip için "varsayılan" token account olarak düşünebilirsiniz.
Associated Token Account, sahibin adresi ve mint account adresinden türetilen bir adresle oluşturulur. Associated Token Account'un sadece belirli bir adrese sahip bir token account olduğunu anlamak önemlidir.
Bu, Solana geliştirmede önemli bir kavramı ortaya koyar: Program Derived Address (PDA). Bir PDA, önceden tanımlanmış girdileri kullanarak adresi deterministik olarak türetir, böylece bir hesabın adresini bulmayı kolaylaştırır.
Associated Token Account
Her cüzdanın aynı mint'ten token tutabilmesi için kendi token hesabına ihtiyacı olduğunu unutmayın.
Genişletilmiş Hesap İlişkileri
Token CLI örnekleri
spl-token
CLI, SPL token'larıyla deney yapmanıza yardımcı olur. Aşağıdaki
örnekler, CLI komutlarını yerel kurulum olmadan doğrudan tarayıcıda çalıştırmak
için Solana Playground terminalini kullanır.
Token ve hesap oluşturmak, hesap rent depozitoları ve işlem ücretleri için SOL
gerektirir. Solana Playground'u ilk kez kullananlar için, bir Playground cüzdanı
oluşturun ve Playground terminalinde solana airdrop
komutunu çalıştırın.
Ayrıca devnet SOL'u herkese açık web faucet
adresinden de alabilirsiniz.
$solana airdrop 2
Mevcut tüm komutları görmek için spl-token --help
komutunu çalıştırın.
$spl-token --help
spl-token
CLI'yi yerel olarak kurmak için şunu çalıştırın:
$cargo install spl-token-cli
spl-token
belgelerinde daha
fazla örnek bulabilirsiniz.
Terminal çıktınızda gösterilen hesap adresleri aşağıdaki örneklerden farklıdır.
Takip ederken Playground terminalinizdeki adresleri kullanın. Örneğin,
create-token
komutu, Playground cüzdanınızı mint yetkilisi olarak içeren
bir mint account adresi çıktısı verir.
Yeni bir token oluşturma
Yeni bir token (mint account) oluşturmak için şunu çalıştırın:
$spl-token create-token
Çıktı şuna benzer:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Yeni bir mint account sıfır arz ile başlar. Mevcut arzı şu şekilde kontrol edin:
$spl-token supply <TOKEN_ADDRESS>
Yeni bir token için supply
komutu 0
döndürür:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Yeni bir Mint Account oluşturmak, iki talimat içeren bir işlem gerektirir. İşte Solana Playground üzerinde bir Javascript örneği.
-
System Program, Mint Account verisi için alan içeren yeni bir hesap oluşturur ve sahipliği Token Program'a aktarır.
-
Token Program, yeni hesabın verisini bir Mint Account olarak başlatır
Token Account oluşturma
Belirli bir mint'in tokenlarını tutmak için bir token account oluşturun:
$spl-token create-account <TOKEN_ADDRESS>
Örnek komut:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Çıktı:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
create-account
komutu, cüzdan adresinizi sahibi olarak belirleyerek bir
associated token account oluşturur.
Farklı bir sahibi olan bir token account oluşturmak için:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Not: <TOKEN_ADDRESS>
token account için mint account'u belirtir.
Örnek komut:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Çıktı:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Associated Token Account oluşturmak, Associated Token Program'ı çağıran bir talimat gerektirir. İşte Solana Playground üzerinde bir Javascript örneği.
Associated Token Program, Çapraz Program Çağrıları kullanarak şunları yapar:
- Sağlanan PDA'yı adres olarak kullanarak yeni bir hesap oluşturmak için System Program'ı çağırır
- Token Account verisini başlatmak için Token Program'ı çağırır
Associated Token Account adresi yerine yeni bir keypair ile yeni bir Token Account oluşturmak için, iki talimat içeren bir işlem gönderin. İşte Solana Playground üzerinde bir Javascript örneği.
-
System Program, Token Account verisi için alan içeren yeni bir hesap oluşturur ve sahipliği Token Program'a aktarır.
-
Token Program, verileri bir Token Account olarak başlatır
Token'ları Mint Et
Bir token'ın yeni birimlerini oluşturmak için, bir Token Account'a token'ları mint edin:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Örnek komut:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Çıktı:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Farklı bir token hesabına token mint etmek için:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Çıktı:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Token Program üzerindeki MintTo
talimatı yeni token'lar oluşturur. Mint
yetkilisinin işlemi imzalaması gerekir. Bu talimat, bir Token Account'a
token'ları mint eder ve Mint Account üzerindeki toplam arzı artırır. İşte
Solana Playground üzerinde bir
Javascript örneği.
Token Transferi
Token hesapları arasında token transferi yapmak için:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Örnek komut:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Çıktı:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
Token Program üzerindeki Transfer
talimatı token transferlerini yönetir.
Gönderenin Token Account'unun sahibinin işlemi imzalaması gerekir. Bu talimat,
Token Account'lar arasında token'ları taşır. İşte
Solana Playground üzerinde bir
Javascript örneği.
Hem gönderen hem de alıcının belirli token (mint) için token hesaplarına ihtiyacı vardır. Gönderen, aynı işlemde alıcının token hesabını oluşturmak için talimatlar ekleyebilir.
Token Metadatası Oluşturma
Token Extensions Program, meta verileri (isim, sembol, görsel bağlantısı) doğrudan Mint Account üzerinde saklamanıza olanak tanır.
Metadata uzantısı ile bir token oluşturmak için:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Çıktı:
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
Meta verileri başlatmak için:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
Token URI, zincir dışı meta verilere bağlantı sağlar. Örnek JSON formatını burada görebilirsiniz.
Örnek komut:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Meta verileri Solana Explorer üzerinde görüntüleyin.
Metadata Extension Kılavuzu içinde daha fazla bilgi edinin. Token Extensions hakkında ayrıntılı bilgi için Token Extensions Başlangıç Kılavuzu ve SPL dokümantasyonu bölümlerine bakın.
Is this page helpful?