Cross Program Invocation
Bu bölümde, önceki PDA bölümündeki CRUD programı, Solana programlarının birbirini çağırmasını sağlayan bir özellik olan Cross Program Invocation (CPI) eklenerek güncelleniyor.
Bu öğretici aynı zamanda programların Cross Program Invocation yaparken Program Derived Address (PDA) için nasıl "imzalayabileceklerini" de gösteriyor.
update
ve delete
talimatları, System Program'ı çağırarak hesaplar arasında
SOL transferini gerçekleştirmek için değişiklik gerektiriyor.
Bu bölümün amacı, önceki bölümde incelenen PDA kavramları üzerine kurularak, Anchor framework kullanarak bir Solana programında CPI'ları uygulama sürecini adım adım göstermektir. Daha fazla ayrıntı için Cross Program Invocation sayfasına bakın.
Referans olarak, bu bağlantı hem PDA hem de CPI bölümlerini tamamladıktan sonraki nihai kodu içerir.
Bu bölüm için başlangıç kodu sadece tamamlanmış PDA bölümünü içerir.
Güncelleme Talimatını Güncelle
İlk olarak, program Update
yapısını ve update
fonksiyonunu değiştirerek
basit bir "güncelleme için ödeme" mekanizmasına ihtiyaç duyar.
lib.rs
dosyasını güncelleyerek system_program
modülünden öğeleri kapsama
alanına getirerek başlayın.
use anchor_lang::system_program::{transfer, Transfer};
Sonra, Update
yapısını vault_account
adlı yeni bir hesap ekleyerek
güncelleyin. Bu hesap, program tarafından kontrol edilir ve kullanıcılar mesaj
hesaplarını güncellediklerinde onlardan SOL alır.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
Şimdi, kullanıcının hesabından kasa hesabına 0.001 SOL aktarmak için update
talimatına CPI mantığını ekleyin.
let transfer_accounts = Transfer {from: ctx.accounts.user.to_account_info(),to: ctx.accounts.vault_account.to_account_info(),};let cpi_context = CpiContext::new(ctx.accounts.system_program.to_account_info(),transfer_accounts,);transfer(cpi_context, 1_000_000)?;
Programı yeniden derleyin.
$build
Silme Talimatını Güncelleme
Şimdi Delete
yapısını ve delete
fonksiyonunu değiştirerek "silme
işleminde geri ödeme" mekanizması ekleyin.
Öncelikle, Delete
yapısını vault_account
içerecek şekilde güncelleyin.
Bu, kullanıcılar mesaj hesaplarını kapattıklarında kasadaki SOL'un kullanıcıya
geri aktarılmasını sağlar.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
Ayrıca, transfer için CPI System Program'ı çağırmayı gerektirdiğinden
system_program
ekleyin.
pub system_program: Program<'info, System>,
Şimdi, kasa hesabından kullanıcının hesabına SOL aktarmak için delete
talimatına CPI mantığını ekleyin.
let user_key = ctx.accounts.user.key();let signer_seeds: &[&[&[u8]]] =&[&[b"vault", user_key.as_ref(), &[ctx.bumps.vault_account]]];let transfer_accounts = Transfer {from: ctx.accounts.vault_account.to_account_info(),to: ctx.accounts.user.to_account_info(),};let cpi_context = CpiContext::new(ctx.accounts.system_program.to_account_info(),transfer_accounts,).with_signer(signer_seeds);transfer(cpi_context, ctx.accounts.vault_account.lamports())?;
_ctx: Context<Delete>
ifadesinin, fonksiyonun gövdesinde bağlamı kullanmak
için ctx: Context<Delete>
olarak değiştiğini unutmayın.
Programı yeniden derleyin.
$build
Programı yeniden dağıtın
Bu değişiklikleri yaptıktan sonra, güncellenmiş programı yeniden dağıtın. Bu, değiştirilmiş programın test için kullanılabilir olmasını sağlar. Solana'da bir programı güncellemek, programı aynı program kimliğiyle dağıtmayı gerektirir.
Playground cüzdanınızda devnet SOL olduğundan emin olun. Solana Faucet adresinden devnet SOL alabilirsiniz.
$deploy
Test dosyasını güncelleyin
Sonraki adımda, talimatlara yeni vault hesabını dahil etmek için
anchor.test.ts
dosyasını güncelleyin. Bu, vault PDA'sını türetmeyi ve
güncelleme ve silme talimat çağrılarına dahil etmeyi gerektirir.
Kasa PDA'sını Türetme
İlk olarak, kasa PDA türetimini ekleyin:
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync([Buffer.from("vault"), wallet.publicKey.toBuffer()],program.programId);
Güncelleme Testini Değiştirme
Ardından, güncelleme talimatını vaultAccount
içerecek şekilde
güncelleyin
const transactionSignature = await program.methods.update(message).accounts({messageAccount: messagePda,vaultAccount: vaultPda}).rpc({ commitment: "confirmed" });
Silme Testini Değiştirme
Ardından, silme talimatını vaultAccount
içerecek şekilde
güncelleyin
const transactionSignature = await program.methods.delete().accounts({messageAccount: messagePda,vaultAccount: vaultPda}).rpc({ commitment: "confirmed" });
Testi Yeniden Çalıştırma
Bu değişiklikleri yaptıktan sonra, her şeyin beklendiği gibi çalıştığından emin olmak için testleri çalıştırın:
$test
Daha sonra işlem detaylarını görüntülemek için SolanaFM bağlantılarını inceleyebilirsiniz; burada güncelleme ve silme talimatları içindeki transfer talimatları için CPI'ları bulacaksınız.
Güncelleme CPI
Silme CPI
Herhangi bir hatayla karşılaşırsanız, son koda başvurabilirsiniz.
Sonraki adımlar
Solana Hızlı Başlangıç kılavuzunu tamamladığınız için tebrikler. Aşağıdakiler dahil olmak üzere temel Solana kavramlarıyla pratik deneyim kazandınız:
- Hesaplardan veri alma ve okuma
- İşlem oluşturma ve gönderme
- Solana programlarını dağıtma ve güncelleme
- Program Derived Address (PDA) ile çalışma
- Cross-Program Invocation (CPI) yapma
Bu kavramları daha derinlemesine anlamak için, bu kılavuzda ele alınan konuların ayrıntılı açıklamalarını içeren Temel Kavramlar belgelerine göz atın.
Daha fazla örnek keşfedin
Örneklerle öğrenmeyi tercih ediyorsanız, çeşitli örnek programlar için Program Örnekleri Deposu'nu inceleyin.
Solana Playground, GitHub bağlantılarını kullanarak projeleri içe aktarmanıza veya görüntülemenize olanak tanıyan kullanışlı bir özellik sunar. Örneğin, bu GitHub repo'dan Anchor projesini görüntülemek için bu Solana Playground bağlantısı'nı açın.
Import
düğmesine tıklayın ve Solana Playground'daki projeler listenize eklemek
için bir proje adı girin. Bir proje içe aktarıldıktan sonra, tüm değişiklikler
otomatik olarak kaydedilir ve korunur.
Is this page helpful?