Çapraz program çağrısı

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 Çapraz Program Çağrıları (CPI'lar) eklenerek güncelleniyor.

Bu öğretici aynı zamanda programların Çapraz Program Çağrıları yaparken Program Türetilmiş Adresler (PDA'lar) için nasıl "imzalayabileceklerini" de göstermektedir.

update ve delete talimatlarının, System Program'ı çağırarak hesaplar arasında SOL transferlerini yönetmek için değiştirilmesi gerekir.

Bu bölümün amacı, Anchor framework kullanarak bir Solana programında CPI'ları uygulama sürecini, önceki bölümde incelenen PDA kavramları üzerine inşa ederek anlatmaktır. Daha fazla ayrıntı için Çapraz Program Çağrısı sayfasına bakın.

Referans olarak, bu bağlantı hem PDA hem de CPI bölümlerini tamamladıktan sonra 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ın Update yapısını ve update fonksiyonunu değiştirerek basit bir "güncelleme için ödeme" mekanizmasına ihtiyacı vardır.

lib.rs dosyasını güncelleyerek system_program modülündeki öğeleri kapsama alarak başlayın.

lib.rs
use anchor_lang::system_program::{transfer, Transfer};

Ardından, Update yapısını vault_account adlı yeni bir hesap içerecek şekilde güncelleyin. Program tarafından kontrol edilen bu hesap, kullanıcılar mesaj hesaplarını güncellediklerinde onlardan SOL alır.

lib.rs
#[account(
mut,
seeds = [b"vault", user.key().as_ref()],
bump,
)]
pub vault_account: SystemAccount<'info>,

Ardından, kullanıcının hesabından kasa hesabına 0.001 SOL aktarmak için update talimatına CPI mantığını ekleyin.

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

Terminal
$
build

Silme Talimatını Güncelleme

Şimdi Delete yapısını ve delete fonksiyonunu değiştirerek bir "silme sırasında iade" mekanizması ekleyin.

İlk olarak, Delete yapısını vault_account içerecek şekilde güncelleyin. Bu, kullanıcılar mesaj hesaplarını kapattıklarında kasadaki herhangi bir SOL'un kullanıcıya geri aktarılmasını sağlar.

lib.rs
#[account(
mut,
seeds = [b"vault", user.key().as_ref()],
bump,
)]
pub vault_account: SystemAccount<'info>,

Ayrıca system_program ekleyin çünkü transfer için CPI, System Program'ın çağrılmasını gerektirir.

lib.rs
pub system_program: Program<'info, System>,

Ardından, kasa hesabından kullanıcının hesabına SOL transfer etmek için delete talimatına CPI mantığını ekleyin.

lib.rs
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> öğesinin, fonksiyonun gövdesinde bağlamı kullanmak için ctx: Context<Delete> olarak değiştiğini unutmayın.

Programı yeniden derleyin.

Terminal
$
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ğinde dağıtmayı gerektirir.

Playground cüzdanınızın devnet SOL'a sahip olduğundan emin olun. Solana Faucet adresinden devnet SOL alabilirsiniz.

Terminal
$
deploy

Test dosyasını güncelleyin

Ardından, talimatlara yeni kasa hesabını dahil etmek için anchor.test.ts dosyasını güncelleyin. Bu, kasa PDA'sını türetmeyi ve onu güncelleme ve silme talimat çağrılarına dahil etmeyi gerektirir.

Kasa PDA'sını Türetme

Öncelikle, kasa PDA türetimini ekleyin:

anchor.test.ts
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

anchor.test.ts
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

anchor.test.ts
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:

Terminal
$
test

Daha sonra SolanaFM bağlantılarını inceleyerek işlem ayrıntılarını görüntüleyebilirsiniz; burada güncelleme ve silme talimatları içindeki transfer talimatları için CPIs'leri bulacaksınız.

Güncelleme CPIGüncelleme CPI

Silme CPISilme 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ı sunan 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 proje 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 kalıcı hale gelir.

Is this page helpful?

Yönetici

© 2026 Solana Vakfı.
Tüm hakları saklıdır.
Bağlanın