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.

Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]
pub struct Account {
/// lamports in the account
pub 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 rent
pub rent_epoch: Epoch,
}

HesaplarHesaplar

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:

  1. Yeni bir keypair (genel/özel anahtar çifti) oluşturma.
  2. Yeni adresi fonlamak için SOL airdrop'u talep etme.
  3. 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.

Fetch Account
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 account
const 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));
Console
Click to execute the code.

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.

Example Output
{
"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.

Example Output
{
"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.

Example Output
{
"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.

Example Output
{
"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.

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 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.

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.

lamports alanı, hesabın lamport cinsinden SOL bakiyesini içerir.

Lamport, SOL'un en küçük birimidir. 1 SOL = 1.000.000.000 lamport.

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.

Example Output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

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.

Fetch Program Account
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);
Console
Click to execute the code.

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.

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.

Token Program Account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

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.

Fetch Program Account
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);
Console
Click to execute the code.

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.

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 Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

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.

Deserialize Mint Account Data
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");
Console
Click to execute the code.
Mint Account Type
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 initialized
pub 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.

Mint Account
{
"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.

Deserialized Mint Data
{
"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.

Deserialized Mint Data
{
"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.

Deserialized Mint Data
{
"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.

Deserialized Mint Data
{
"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.

Deserialized Mint Data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

getMint() fonksiyonu, bir mint hesabının data alanını Token Program tarafından tanımlanan Mint veri tipine dönüştürür.

Mint Account
{
"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.

decimals alanı, token için ondalık basamak sayısını gösterir.

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.

freezeAuthority alanı, token account'ları dondurma yetkisine sahip otoriteyi gösterir.

Dondurulmuş bir token account, hesaptaki tokeni transfer edemez veya yakamaz.

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.

Deserialized Mint Data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

İçindekiler

Sayfayı Düzenle