Ağdan okuma
Bu bölüm, farklı hesapları alarak Solana ağından veri okumayı ve bir Solana hesabının yapısını anlamayı inceliyor.
Solana'da tüm veriler "hesaplar" içinde bulunur. Solana'daki verileri, her girişin aynı temel Hesap türüne sahip bir hesap olduğu tek bir "Hesaplar" tablosu içeren genel bir veritabanı olarak düşünebilirsiniz.
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub lamports: u64,/// data held in this account#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]pub data: Vec<u8>,/// 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 rentpub rent_epoch: Epoch,}
Hesaplar
Solana'daki hesaplar "durum" veya "çalıştırılabilir" programlar saklayabilir. Her hesabın, ilgili zincir üstü verisini bulmak için kullanılan benzersiz kimliği görevi gören bir "adresi" (genel anahtar) vardır.
Solana hesapları şunları içerir:
- Durum: Okunması ve kalıcı olması amaçlanan veriler. Örneğin, tokenlar hakkında bilgiler, kullanıcı verileri veya bir program içinde tanımlanan diğer veriler.
- Çalıştırılabilir Programlar: Solana programlarının gerçek kodunu içeren hesaplar. Bu hesaplar, kullanıcıların çağırabileceği talimatları saklar.
Program kodu ve program durumunun bu şekilde ayrılması, Solana'nın Hesap Modelinin önemli bir özelliğidir. Daha fazla ayrıntı için Solana Hesap Modeli sayfasına bakın.
Cüzdan hesabını alma
Bu örnek şunları nasıl yapacağınızı gösterir:
- Yeni bir keypair (genel/özel anahtar çifti) oluşturma.
- Yeni adresi fonlamak için SOL airdrop'u talep etme.
- Fonlanan adres için hesap verilerini alma.
Solana'da, yeni bir adresi SOL ile fonlamak otomatik olarak System Program tarafından sahip olunan bir hesap oluşturur. Tüm "cüzdan" hesapları, basitçe SOL tutan ve işlemleri imzalayabilen System Program'a ait hesaplardır.
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";const keypair = Keypair.generate();console.log(`Public Key: ${keypair.publicKey}`);const connection = new Connection("http://localhost:8899", "confirmed");// Funding an address with SOL automatically creates an accountconst signature = await connection.requestAirdrop(keypair.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const accountInfo = await connection.getAccountInfo(keypair.publicKey);console.log(JSON.stringify(accountInfo, null, 2));
Solana'da bir "cüzdan", Solana'nın yerleşik programlarından biri olan
Sistem Programı
tarafından sahiplenilen bir hesaptır. Cüzdan hesapları öncelikle SOL tutmak
(lamports
alanında izlenir) ve işlemleri imzalamak için kullanılır.
Bir cüzdan hesabını sorguladığınızda, yanıt örnek çıktıda gösterilen alanları içerir.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
data
alanı, hesabın bayt olarak depolanan verilerini içerir.
Cüzdan hesapları için bu alan boştur (0 bayt). Diğer hesaplar bu alanı program durumunu veya çalıştırılabilir program kodunu depolamak için kullanır.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
executable
alanı, hesabın data
alanının çalıştırılabilir program kodu içerip
içermediğini gösterir.
Cüzdan ve program durumu depolayan hesaplar için bu alan false
olarak
ayarlanmıştır.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
lamports
alanı, hesabın lamport cinsinden SOL bakiyesini içerir.
Lamport, SOL'un en küçük birimidir. 1 SOL = 1.000.000.000 lamport.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
owner
alanı, hesaba sahip olan programı gösterir.
Cüzdanlar için, sahip her zaman şu adrese sahip olan System Program'dır:
11111111111111111111111111111111
.
rentEpoch
alanı, hesapların ağda verilerini tutmak için "rent" (lamport
cinsinden) ödemesi gereken kullanımdan kaldırılmış bir mekanizmadan kalan eski
bir alandır.
Bu alan şu anda kullanılmamaktadır, ancak geriye dönük uyumluluk için dahil edilmiştir.
space
alanı, data
alanındaki bayt sayısını gösterir. Bu, Account
tipinin
kendisinde bir alan değildir, ancak yanıtta yer alır.
Bu örnekte, space
alanı 0'dır çünkü data
alanı 0 bayt veri içermektedir.
Token Program'ı getir
Bu örnek, cüzdan ve program hesapları arasındaki farkı göstermek için Token Program'ı getirir.
Program hesabı, Token Program'ın kaynak kodu için derlenmiş bayt kodunu saklar. Bu program hesabını Solana Explorer üzerinde görüntüleyebilirsiniz.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await connection.getAccountInfo(address);
Token Program, Solana üzerinde çalıştırılabilir bir program hesabıdır. Cüzdan hesapları gibi, programlar da aynı temel Account veri yapısına sahiptir, ancak alanlarında önemli farklılıklar vardır.
executable
alanı true
olarak ayarlanmıştır, bu da bu hesabın data
alanının
çalıştırılabilir program kodunu içerdiğini gösterir.
Program hesapları için, data
alanı programın çalıştırılabilir kodunu saklar.
Buna karşılık, cüzdan hesaplarının veri alanı boştur.
Bir Solana programını dağıttığınızda, programın çalıştırılabilir kodu bir
hesabın data
alanında saklanır.
Çalıştırılabilir program hesaplarının ayrıca hesabın owner
olarak belirlenmiş
bir programı vardır.
Tüm program hesapları, Solana'daki çalıştırılabilir program hesaplarına sahip olan yerleşik programların bir kategorisi olan Loader programı tarafından sahiplenilir.
Token Program için, owner
BPFLoader2 programıdır.
Mint hesabını getir
Bu örnek, Solana'daki programların durumu ayrı hesaplarda nasıl sakladığını göstermek için USD Coin (USDC) Mint hesabını getirir.
Bir Mint hesabı, Token Program tarafından sahiplenilen bir hesaptır. Toplam arz, ondalık sayı ve token basma veya dondurma yetkisi olan hesaplar dahil olmak üzere belirli bir token için global meta verileri saklar. Mint hesabının adresi, Solana ağında bir tokeni benzersiz şekilde tanımlar.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await connection.getAccountInfo(address);
Bu örnekte dikkat edilmesi gereken önemli nokta, Mint hesabının çalıştırılabilir kod değil, durum bilgisi saklamasıdır.
Mint hesapları Token Program tarafından sahiplenilir ve bu program, Mint hesaplarının nasıl oluşturulacağını ve güncelleneceğini tanımlayan talimatları içerir.
executable
alanı false
olarak işaretlenmiştir çünkü mint hesabının data
alanı çalıştırılabilir kod değil, durum bilgisi saklar.
Token Program, mint hesabının data
alanında saklanan Mint
veri tipini
tanımlar.
data
alanı, mint yetkisi, toplam arz, ondalık sayı gibi serileştirilmiş Mint
hesap durumunu içerir.
Bir Mint hesabından okuma yapmak için, data
alanını Mint
veri tipine
dönüştürmeniz gerekir. Bu konu bir sonraki adımda ele alınacaktır.
Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
) mint hesabının
sahibidir.
Bu, mint hesabının data
alanının yalnızca Token Program'da tanımlanan
talimatlar tarafından değiştirilebileceği anlamına gelir.
Mint Hesabını Dönüştürme
Bir Solana hesabının data
alanı ham baytlar içerir. Bu veriyi anlamlı bir
şekilde yorumlamak için, hesabın sahibi olan program tarafından tanımlanan uygun
veri tipine dönüştürmeniz gerekir.
Çoğu Solana programı, dönüştürme işlemini soyutlayan yardımcı fonksiyonlar içeren istemci kütüphaneleri sağlar. Bu fonksiyonlar, ham hesap baytlarını yapılandırılmış veri tiplerine dönüştürerek hesap verisiyle çalışmayı kolaylaştırır.
Örneğin, @solana/spl-token
bir Mint hesabının data
alanını
Mint
veri tipine dönüştürmeye yardımcı olan getMint()
fonksiyonunu içerir.
import { PublicKey, Connection } from "@solana/web3.js";import { getMint } from "@solana/spl-token";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const mintData = await getMint(connection, address, "confirmed");
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>,}
getMint()
fonksiyonu, bir mint hesabının data
alanını Token Program
tarafından tanımlanan
Mint
veri tipine dönüştürür.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Tamamen çözümlenmiş Mint Hesabı verisini Solana Explorer'da görüntüleyebilirsiniz.
address
alanı, Mint hesabının adresini içerir.
Mint hesabının adresi, Solana ağında tokeni tanımlamak için kullanılır.
mintAuthority
alanı, yeni token basma yetkisine sahip hesabı gösterir.
Bu, tokenin yeni birimlerini oluşturabilen tek hesaptır.
supply
alanı, basılmış olan toplam token sayısını gösterir.
Bu değer, tokenin en küçük birimi cinsindendir. Standart birimlerdeki toplam
arzı elde etmek için, supply
alanının değerini decimals
ile ayarlayın.
{"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG","supply": "8985397351591790","decimals": 6,"isInitialized": true,"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar","tlvData": {"type": "Buffer","data": []}}
decimals
alanı, token için ondalık basamak sayısını gösterir.
{"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG","supply": "8985397351591790","decimals": 6,"isInitialized": true,"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar","tlvData": {"type": "Buffer","data": []}}
isInitialized
alanı, mint account'un başlatılıp başlatılmadığını gösterir. Bu
alan, Token Program'da bir güvenlik kontrolü olarak kullanılır.
{"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG","supply": "8985397351591790","decimals": 6,"isInitialized": true,"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar","tlvData": {"type": "Buffer","data": []}}
freezeAuthority
alanı, token account'ları dondurma yetkisine sahip otoriteyi
gösterir.
Dondurulmuş bir token account, hesaptaki tokeni transfer edemez veya yakamaz.
{"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG","supply": "8985397351591790","decimals": 6,"isInitialized": true,"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar","tlvData": {"type": "Buffer","data": []}}
tlvData
alanı, Token Extensions için ekstra veri içerir (daha fazla
deserializasyon gerektirir).
Bu alan yalnızca Token Extension Program (Token2022) tarafından oluşturulan hesaplar için geçerlidir.
{"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG","supply": "8985397351591790","decimals": 6,"isInitialized": true,"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar","tlvData": {"type": "Buffer","data": []}}
Is this page helpful?