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 täytyy muokata 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äivityksestä" -mekanismi
muuttamalla Update
-rakennetta ja update
-funktiota.
Aloita päivittämällä lib.rs
-tiedosto tuodaksesi käyttöön kohteita
system_program
-moduulista.
use anchor_lang::system_program::{transfer, Transfer};
Seuraavaksi päivitä Update
-rakenne sisältämään uusi tili nimeltä
vault_account
. Tämä tili, jota ohjelma hallinnoi, vastaanottaa SOL-tokeneita
käyttäjältä, kun he päivittävät viestinsä tilin.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
Seuraavaksi lisää CPI-logiikka update
-ohjeeseen siirtääksesi 0,001 SOL
käyttäjän tililtä holvitilille.
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.
$build
Päivitä poisto-ohje
Lisää nyt "hyvitys poistettaessa" -mekanismi muuttamalla Delete
-rakennetta ja delete
-funktiota.
Päivitä ensin Delete
-rakenne sisältämään vault_account
. Tämä
mahdollistaa holvissa olevan SOL:n siirtämisen takaisin käyttäjälle, kun he
sulkevat viestinsä tilin.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
Lisää myös system_program
, koska siirron CPI vaatii System Programin
kutsumista.
pub system_program: Program<'info, System>,
Seuraavaksi lisää CPI-logiikka delete
-ohjeeseen SOL:n siirtämiseksi
holvitililtä takaisin käyttäjän tilille.
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 muotoon
ctx: Context<Delete>
kontekstin käyttämiseksi funktion rungossa.
Rakenna ohjelma uudelleen.
$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.
$deploy
Testitiedoston päivittäminen
Seuraavaksi päivitä anchor.test.ts
-tiedosto sisältämään uusi vault-tili
ohjeissa. Tämä vaatii vault PDA:n johtamisen ja sen sisällyttämisen update- ja
delete-ohjekutsuihin.
Johda holvin PDA
Ensin, lisää holvin PDA-johdanto:
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync([Buffer.from("vault"), wallet.publicKey.toBuffer()],program.programId);
Muuta päivitystestiä
Sitten päivitä päivitysohje sisältämään vaultAccount
const transactionSignature = await program.methods.update(message).accounts({messageAccount: messagePda,vaultAccount: vaultPda}).rpc({ commitment: "confirmed" });
Muuta poistotestiä
Sitten päivitä poisto-ohje sisältämään vaultAccount
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:
$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 CPI
Poisto 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 anna projektin nimi lisätäksesi sen Solana
Playgroundin projektilistaasi. Kun projekti on tuotu, kaikki muutokset
tallennetaan ja säilytetään automaattisesti.
Is this page helpful?