Je eerste Solana-programma implementeren

In dit gedeelte ga je een eenvoudig Solana-programma (smart contract) bouwen, implementeren en testen met behulp van het Anchor-framework. Aan het einde heb je je eerste programma op de Solana-blockchain geïmplementeerd.

Het doel van dit gedeelte is om je vertrouwd te maken met de Solana Playground. De gids behandelt een gedetailleerder voorbeeld in de secties over Program Derived Address (PDA) en Cross-Program Invocation (CPI). Voor meer details, raadpleeg de pagina Programma's op Solana.

Anchor-project aanmaken

Open eerst https://beta.solpg.io in een nieuw browsertabblad.

  • Klik op de knop "Create a new project" in het linkerpaneel.

  • Voer een projectnaam in, selecteer Anchor als framework en klik vervolgens op de knop "Create".

Nieuw projectNieuw project

Je ziet dat er een nieuw project is aangemaakt met de programmacode in het bestand src/lib.rs.

Dit basale Solana-programma maakt een nieuw account aan en slaat er een getal in op. Het programma bevat één instructie (initialize) die:

  • Een data: u64 parameter als invoer vereist
  • Een nieuw account aanmaakt
  • De waarde van de data: u64 parameter opslaat in de gegevens van het account
  • Een bericht logt naar de programmalogs van de transactie
lib.rs
use anchor_lang::prelude::*;
// This is your program's public key and it will update
// automatically when you build the project.
declare_id!("11111111111111111111111111111111");
#[program]
mod hello_anchor {
use super::*;
pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {
ctx.accounts.new_account.data = data;
msg!("Changed data to: {}!", data); // Message will show up in the tx logs
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
// We must specify the space in order to initialize an account.
// First 8 bytes are default account discriminator,
// next 8 bytes come from NewAccount.data being type u64.
// (u64 = 64 bits unsigned integer = 8 bytes)
#[account(
init,
payer = signer,
space = 8 + 8
)]
pub new_account: Account<'info, NewAccount>,
#[account(mut)]
pub signer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct NewAccount {
data: u64
}

Programma bouwen en implementeren

Om het programma te bouwen, voer je eenvoudig build uit in de terminal. Het build commando compileert het programma. De programma bytecode wordt vervolgens opgeslagen in een uitvoerbaar programma-account wanneer het wordt geïmplementeerd.

Terminal
$
build

Solana Playground werkt het adres bij in declare_id!(). Dit adres vertegenwoordigt het on-chain adres van je programma (program ID).

Na het bouwen van het programma, voer deploy uit in de terminal om het programma naar het netwerk te deployen (standaard naar devnet). Voor programma-deployment is het nodig om SOL toe te wijzen aan het on-chain account dat het programma opslaat.

Zorg voor voldoende SOL vóór deployment. Je kunt devnet SOL krijgen door solana airdrop 5 uit te voeren in de Playground terminal of door de Web Faucet te gebruiken.

Terminal
$
deploy

Je kunt ook de knoppen Build en Deploy gebruiken in het linkerzijpaneel.

Build and DeployBuild and Deploy

Na het deployen van het programma kun je de instructies ervan aanroepen.

Programma testen

De starterscode bevat een testbestand in tests/anchor.test.ts. Dit bestand laat zien hoe je de initialize instructie van het programma kunt aanroepen vanaf de client.

anchor.test.ts
// No imports needed: web3, anchor, pg and more are globally available
describe("Test", () => {
it("initialize", async () => {
// Generate keypair for the new account
const newAccountKp = new web3.Keypair();
// Send transaction
const data = new BN(42);
const txHash = await pg.program.methods
.initialize(data)
.accounts({
newAccount: newAccountKp.publicKey,
signer: pg.wallet.publicKey,
systemProgram: web3.SystemProgram.programId
})
.signers([newAccountKp])
.rpc();
console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
// Confirm transaction
await pg.connection.confirmTransaction(txHash);
// Fetch the created account
const newAccount = await pg.program.account.newAccount.fetch(
newAccountKp.publicKey
);
console.log("On-chain data is:", newAccount.data.toString());
// Check whether the data on-chain is equal to local 'data'
assert(data.eq(newAccount.data));
});
});

Om het testbestand uit te voeren na het deployen van het programma, voer test uit in de terminal.

Terminal
$
test

Zoek naar output die bevestigt dat de test succesvol is geslaagd.

Je kunt ook de knop Test gebruiken in het linkerzijpaneel.

Run TestRun Test

Je kunt vervolgens de transactielogs bekijken door het commando solana confirm -v uit te voeren en de transactiehash (handtekening) uit de testoutput op te geven:

Terminal
$
solana confirm -v [TxHash]

Bijvoorbeeld:

Terminal
$
solana confirm -v 3TewJtiUz1EgtT88pLJHvKFzqrzDNuHVi8CfD2mWmHEBAaMfC5NAaHdmr19qQYfTiBace6XUmADvR4Qrhe8gH5uc

Je kunt de transactiedetails ook bekijken op SolanaFM of Solana Explorer door te zoeken naar de transactiehandtekening (hash).

Vergeet niet om de cluster (netwerk) verbinding op de Explorer die je gebruikt aan te passen zodat deze overeenkomt met Solana Playground. Solana Playground gebruikt standaard de devnet cluster.

Programma sluiten

Ten slotte maakt het sluiten van het programma volledige terugwinning mogelijk van de SOL die is toegewezen aan het on-chain programma.

Je kunt een programma sluiten door het volgende commando uit te voeren en het programma-adres op te geven dat je vindt in declare_id!():

Terminal
$
solana program close [ProgramID]

Bijvoorbeeld:

Terminal
$
solana program close 2VvQ11q8xrn5tkPNyeraRsPaATdiPx8weLAD8aD4dn2r

Gefeliciteerd. Je hebt zojuist je eerste Solana-programma gebouwd en gedeployed met behulp van het Anchor-framework.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken