Cross Program Invocation

In dit gedeelte wordt het CRUD-programma uit het vorige PDA-gedeelte bijgewerkt door Cross Program Invocations (CPIs) toe te voegen, een functie die Solana-programma's in staat stelt om elkaar aan te roepen.

Deze tutorial laat ook zien hoe programma's kunnen "tekenen" voor Program Derived Addresses (PDAs) bij het maken van Cross Program Invocations.

De update en delete instructies moeten worden aangepast om SOL-overdrachten tussen accounts af te handelen door het System Program aan te roepen.

Het doel van dit gedeelte is om het proces van het implementeren van CPIs in een Solana-programma met behulp van het Anchor-framework te doorlopen, voortbouwend op de PDA- concepten die in het vorige gedeelte zijn verkend. Voor meer details, raadpleeg de Cross Program Invocation pagina.

Ter referentie bevat deze link de uiteindelijke code na het voltooien van zowel de PDA- als CPI-gedeelten.

De starterscode voor dit gedeelte bevat alleen het voltooide PDA-gedeelte.

Update de update-instructie

Eerst heeft het programma een eenvoudig "betalen-om-te-updaten" mechanisme nodig door de Update struct en update functie aan te passen.

Begin met het bijwerken van het lib.rs bestand om items uit de system_program module in scope te brengen.

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

Werk vervolgens de Update struct bij om een nieuw account genaamd vault_account toe te voegen. Dit account, beheerd door het programma, ontvangt SOL van een gebruiker wanneer ze hun berichtaccount bijwerken.

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

Voeg vervolgens de CPI-logica toe in de update instructie om 0,001 SOL over te maken van het account van de gebruiker naar het kluis-account.

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

Herbouw het programma.

Terminal
$
build

Update de delete-instructie

Voeg nu een "restitutie bij verwijdering"-mechanisme toe door de Delete struct en delete functie te wijzigen.

Update eerst de Delete struct om de vault_account op te nemen. Dit maakt het mogelijk om SOL in de vault terug te storten naar de gebruiker wanneer ze hun berichtaccount sluiten.

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

Voeg ook de system_program toe, aangezien de CPI voor de overdracht het aanroepen van het System Program vereist.

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

Voeg vervolgens de CPI-logica toe in de delete instructie om SOL over te maken van de kluis-account terug naar de account van de gebruiker.

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

Merk op dat _ctx: Context<Delete> verandert in ctx: Context<Delete> om de context in de hoofdtekst van de functie te gebruiken.

Herbouw het programma.

Terminal
$
build

Programma opnieuw implementeren

Na het aanbrengen van deze wijzigingen, implementeer het bijgewerkte programma opnieuw. Dit zorgt ervoor dat het gewijzigde programma beschikbaar wordt voor testen. Op Solana vereist het bijwerken van een programma eenvoudigweg het implementeren van het programma op dezelfde programma-ID.

Zorg ervoor dat je Playground wallet devnet SOL heeft. Verkrijg devnet SOL van de Solana Faucet.

Terminal
$
deploy

Testbestand bijwerken

Werk vervolgens het anchor.test.ts bestand bij om het nieuwe vault account op te nemen in de instructies. Dit vereist het afleiden van de vault PDA en het opnemen ervan in de update- en delete-instructie-aanroepen.

Afleiden van Vault PDA

Voeg eerst de vault PDA-afleiding toe:

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

Wijzig Update Test

Werk vervolgens de update-instructie bij om de vaultAccount op te nemen

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

Wijzig Delete Test

Werk vervolgens de delete-instructie bij om de vaultAccount op te nemen

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

Test opnieuw uitvoeren

Voer na het aanbrengen van deze wijzigingen de tests uit om te controleren of alles werkt zoals verwacht:

Terminal
$
test

Je kunt vervolgens de SolanaFM-links bekijken om de transactiedetails te zien, waar je de CPIs voor de transfer-instructies binnen de update- en delete-instructies zult vinden.

Update CPIUpdate CPI

Delete CPIDelete CPI

Als je fouten tegenkomt, kun je de uiteindelijke code raadplegen.

Volgende stappen

Gefeliciteerd met het voltooien van de Solana Quickstart-gids. Je hebt praktische ervaring opgedaan met belangrijke Solana-concepten, waaronder:

  • Ophalen en lezen van gegevens uit accounts
  • Bouwen en verzenden van transacties
  • Implementeren en updaten van Solana-programma's
  • Werken met Program Derived Addresses (PDAs)
  • Cross Program Invocations (CPIs) maken

Om je begrip van deze concepten te verdiepen, bekijk de Core Concepts documentatie die gedetailleerde uitleg geeft over de onderwerpen die in deze gids worden behandeld.

Meer voorbeelden verkennen

Als je liever leert aan de hand van voorbeelden, bekijk dan de Program Examples Repository voor verschillende voorbeeldprogramma's.

Solana Playground biedt een handige functie waarmee je projecten kunt importeren of bekijken via hun GitHub-links. Open bijvoorbeeld deze Solana Playground-link om het Anchor-project te bekijken van deze Github-repo.

Klik op de Import knop en voer een projectnaam in om het toe te voegen aan je lijst met projecten in Solana Playground. Zodra een project is geïmporteerd, worden alle wijzigingen automatisch opgeslagen en bewaard.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken