Cross Program Invocation

Tässä osiossa edellisen PDA-osion CRUD-ohjelmaa päivitetään lisäämällä Cross Program Invocation (CPI) -kutsuja, ominaisuus joka mahdollistaa Solana-ohjelmien kutsumisen toistensa välillä.

Tämä opas näyttää myös, miten ohjelmat voivat "allekirjoittaa" Program Derived Address (PDA) -osoitteiden puolesta tehdessään Cross Program Invocation -kutsuja.

update- ja delete-ohjeita on muokattava käsittelemään SOL-siirtoja tilien välillä kutsumalla System Program -ohjelmaa.

Tämän osion tarkoituksena on käydä läpi CPI-kutsujen toteuttaminen Solana-ohjelmassa Anchor-kehyksen avulla, rakentaen edellisessä osiossa tutkittujen PDA-konseptien päälle. Lisätietoja löytyy Cross Program Invocation -sivulta.

Viitteeksi, tämä linkki sisältää lopullisen koodin sekä PDA- että CPI-osioiden suorittamisen jälkeen.

Tämän osion aloituskoodi sisältää vain valmiiksi tehdyn PDA-osion.

Päivitä Update-ohje

Ensin ohjelmaan tarvitaan yksinkertainen "maksa päivittääksesi" -mekanismi muuttamalla Update -rakennetta ja update-funktiota.

Aloita päivittämällä lib.rs-tiedosto tuodaksesi näkyviin kohteet system_program-moduulista.

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

Päivitä seuraavaksi Update -rakenne sisältämään uusi tili nimeltä vault_account. Tämä ohjelman hallitsema tili vastaanottaa SOL:n käyttäjältä, kun tämä päivittää viestinsä tilin.

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

Lisää seuraavaksi CPI-logiikka update-ohjeeseen siirtääksesi 0,001 SOL:n käyttäjän tililtä holvitilille.

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)?;

Rakenna ohjelma uudelleen.

Terminal
$
build

Päivitä poisto-ohje

Lisää nyt "palautus poistettaessa" -mekanismi muuttamalla Delete -rakennetta ja delete -funktiota.

Päivitä ensin Delete -rakenne sisältämään vault_account. Tämä mahdollistaa holvissa olevien SOL:ien siirtämisen takaisin käyttäjälle, kun tämä sulkee viestinsä tilin.

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

Lisää myös system_program, koska CPI siirtoa varten vaatii System Program -ohjelman kutsumisen.

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

Seuraavaksi lisää CPI-logiikka delete-ohjeeseen siirtääksesi SOL:ia holvitililtä takaisin käyttäjän tilille.

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())?;

Huomaa, että _ctx: Context<Delete> muuttuu ctx: Context<Delete> -muotoon, jotta kontekstia voidaan käyttää funktion rungossa.

Rakenna ohjelma uudelleen.

Terminal
$
build

Ohjelman uudelleenjakelu

Tehtyäsi nämä muutokset, jaa päivitetty ohjelma uudelleen. Tämä varmistaa, että muokattu ohjelma on käytettävissä testausta varten. Solanassa ohjelman päivittäminen vaatii yksinkertaisesti ohjelman jakamisen samalla ohjelmatunnuksella.

Varmista, että Playground-lompakossasi on devnet SOLia. Hanki devnet SOLia Solana Faucetista.

Terminal
$
deploy

Testitiedoston päivittäminen

Seuraavaksi päivitä anchor.test.ts-tiedosto sisällyttämään uusi holvitili ohjeisiin. Tämä vaatii holvi-PDA:n johdannaisemisen ja sen sisällyttämisen update- ja delete-ohjekutsuihin.

Johda holvin PDA

Ensin, lisää holvin PDA-johdanto:

anchor.test.ts
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync(
[Buffer.from("vault"), wallet.publicKey.toBuffer()],
program.programId
);

Muuta päivitystestiä

Päivitä sitten päivitysohje sisältämään vaultAccount

anchor.test.ts
const transactionSignature = await program.methods
.update(message)
.accounts({
messageAccount: messagePda,
vaultAccount: vaultPda
})
.rpc({ commitment: "confirmed" });

Muuta poistotestiä

Päivitä sitten poisto-ohje sisältämään vaultAccount

anchor.test.ts
const transactionSignature = await program.methods
.delete()
.accounts({
messageAccount: messagePda,
vaultAccount: vaultPda
})
.rpc({ commitment: "confirmed" });

Suorita testi uudelleen

Kun olet tehnyt nämä muutokset, suorita testit varmistaaksesi, että kaikki toimii odotetusti:

Terminal
$
test

Voit sitten tarkastella SolanaFM-linkkejä nähdäksesi tapahtuman tiedot, joista löydät siirtokomentojen CPIt päivitys- ja poistokomentojen sisällä.

Päivitys CPIPäivitys CPI

Poisto CPIPoisto CPI

Jos kohtaat virheitä, voit tarkistaa lopullisen koodin.

Seuraavat vaiheet

Onnittelut Solana Quickstart -oppaan suorittamisesta. Olet saanut käytännön kokemusta keskeisistä Solana-konsepteista, kuten:

  • Tietojen hakeminen ja lukeminen tileiltä
  • Tapahtumien rakentaminen ja lähettäminen
  • Solana-ohjelmien käyttöönotto ja päivittäminen
  • Program Derived Address (PDA) -osoitteiden käyttö
  • Cross-Program Invocation (CPI) -kutsujen tekeminen

Syventääksesi ymmärrystäsi näistä konsepteista, tutustu ydinkäsitteiden dokumentaatioon, joka tarjoaa yksityiskohtaisia selityksiä tässä oppaassa käsitellyistä aiheista.

Tutustu lisäesimerkkeihin

Jos opit mieluummin esimerkkien kautta, tutustu ohjelmaesimerkkien repositoryyn, joka sisältää erilaisia esimerkkiohjelmia.

Solana Playground tarjoaa kätevän ominaisuuden, jonka avulla voit tuoda tai tarkastella projekteja niiden GitHub-linkkien avulla. Esimerkiksi avaa tämä Solana Playground -linkki nähdäksesi Anchor-projektin tästä Github-repositorystä.

Napsauta Import -painiketta ja syötä projektin nimi lisätäksesi sen projektiluetteloosi Solana Playgroundissa. Kun projekti on tuotu, kaikki muutokset tallennetaan ja säilyvät automaattisesti.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä