Solana-dokumentaatioOhjelmien kehittäminen

Ohjelmien kehittäminen Rustilla

Solana-ohjelmat kehitetään pääasiassa Rust-ohjelmointikielellä. Tämä sivu keskittyy Solana-ohjelmien kirjoittamiseen Rustilla ilman Anchor- kehystä, lähestymistapaa jota usein kutsutaan "natiivi Rust" -ohjelmoinniksi.

Natiivi Rust-kehitys tarjoaa kehittäjille suoran hallinnan Solana- ohjelmiinsa. Tämä lähestymistapa vaatii kuitenkin enemmän manuaalista asetusta ja perusrakenteen koodia verrattuna Anchor-kehyksen käyttöön. Tätä menetelmää suositellaan kehittäjille, jotka:

  • Haluavat yksityiskohtaista hallintaa ohjelmalogiikkaan ja optimointeihin
  • Haluavat oppia peruskäsitteet ennen siirtymistä korkeamman tason kehyksiin

Aloittelijoille suosittelemme aloittamista Anchor-kehyksellä. Katso Anchor -osio saadaksesi lisätietoja.

Edellytykset

Yksityiskohtaiset asennusohjeet löytyvät asennus -sivulta.

Ennen kuin aloitat, varmista että sinulla on seuraavat asennettuna:

  • Rust: Ohjelmointikieli Solana-ohjelmien rakentamiseen.
  • Solana CLI: Komentorivityökalu Solana-kehitykseen.

Aloittaminen

Alla oleva esimerkki kattaa perusvaiheet ensimmäisen Rustilla kirjoitetun Solana-ohjelmasi luomiseen. Luomme minimaalisen ohjelman, joka tulostaa "Hello, world!" ohjelmalokiin.

Luo uusi ohjelma

Ensin luo uusi Rust-projekti käyttäen standardia cargo init komentoa --lib lipulla.

Terminal
cargo init hello_world --lib

Siirry projektihakemistoon. Sinun pitäisi nähdä oletusarvoiset src/lib.rs ja Cargo.toml tiedostot

Terminal
cd hello_world

Seuraavaksi lisää solana-program riippuvuus. Tämä on vähimmäisriippuvuus, joka vaaditaan Solana-ohjelman rakentamiseen.

Terminal
cargo add solana-program@1.18.26

Seuraavaksi lisää tämä koodinpätkä tiedostoon Cargo.toml. Jos et sisällytä tätä asetusta, hakemistoa target/deploy ei luoda, kun rakennat ohjelman.

Cargo.toml
[lib]
crate-type = ["cdylib", "lib"]

Tiedoston Cargo.toml tulisi näyttää seuraavalta:

Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "lib"]
[dependencies]
solana-program = "1.18.26"

Seuraavaksi korvaa tiedoston src/lib.rs sisältö seuraavalla koodilla. Tämä on minimaalinen Solana-ohjelma, joka tulostaa "Hello, world!" ohjelman lokiin, kun ohjelma suoritetaan.

Makroa msg! käytetään Solana-ohjelmissa viestin tulostamiseen ohjelman lokiin.

lib.rs
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
msg!("Hello, world!");
Ok(())
}

Ohjelman rakentaminen

Seuraavaksi rakenna ohjelma käyttämällä komentoa cargo build-sbf.

Terminal
cargo build-sbf

Tämä komento luo hakemiston target/deploy, joka sisältää kaksi tärkeää tiedostoa:

  1. Tiedosto .so (esim. hello_world.so): Tämä on käännetty Solana-ohjelma, joka tullaan ottamaan käyttöön verkossa "älysopimuksena".
  2. Keypair-tiedosto (esim. hello_world-keypair.json): Tämän keypair-tiedoston julkista avainta käytetään ohjelmatunnuksena (program ID) ohjelmaa käyttöönotettaessa.

Nähdäksesi ohjelmatunnuksen, suorita seuraava komento päätteessäsi. Tämä komento tulostaa määritetyssä tiedostopolussa olevan keypair-tiedoston julkisen avaimen:

Terminal
solana address -k ./target/deploy/hello_world-keypair.json

Esimerkki tulostuksesta:

4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz

Ohjelman testaaminen

Seuraavaksi testaa ohjelma käyttämällä solana-program-test -pakettia. Lisää seuraavat riippuvuudet tiedostoon Cargo.toml.

Terminal
cargo add solana-program-test@1.18.26 --dev
cargo add solana-sdk@1.18.26 --dev
cargo add tokio --dev

Lisää seuraava testi tiedostoon src/lib.rs ohjelmakoodin alapuolelle. Tämä on testi moduuli, joka kutsuu hello world -ohjelmaa.

lib.rs
#[cfg(test)]
mod test {
use solana_program_test::*;
use solana_sdk::{
instruction::Instruction, pubkey::Pubkey, signature::Signer, transaction::Transaction,
};
#[tokio::test]
async fn test_hello_world() {
let program_id = Pubkey::new_unique();
let mut program_test = ProgramTest::default();
program_test.add_program("hello_world", program_id, None);
let (mut banks_client, payer, recent_blockhash) = program_test.start().await;
// Create instruction
let instruction = Instruction {
program_id,
accounts: vec![],
data: vec![],
};
// Create transaction with instruction
let mut transaction = Transaction::new_with_payer(&[instruction], Some(&payer.pubkey()));
// Sign transaction
transaction.sign(&[&payer], recent_blockhash);
let transaction_result = banks_client.process_transaction(transaction).await;
assert!(transaction_result.is_ok());
}
}

Suorita testi käyttämällä komentoa cargo test-sbf. Ohjelman loki näyttää "Hello, world!".

Terminal
cargo test-sbf

Esimerkki tulostuksesta:

Terminal
running 1 test
[2024-10-18T21:24:54.889570000Z INFO solana_program_test] "hello_world" SBF program from /hello_world/target/deploy/hello_world.so, modified 35 seconds, 828 ms, 268 µs and 398 ns ago
[2024-10-18T21:24:54.974294000Z DEBUG solana_runtime::message_processor::stable_log] Program 1111111QLbz7JHiBTspS962RLKV8GndWFwiEaqKM invoke [1]
[2024-10-18T21:24:54.974814000Z DEBUG solana_runtime::message_processor::stable_log] Program log: Hello, world!
[2024-10-18T21:24:54.976848000Z DEBUG solana_runtime::message_processor::stable_log] Program 1111111QLbz7JHiBTspS962RLKV8GndWFwiEaqKM consumed 140 of 200000 compute units
[2024-10-18T21:24:54.976868000Z DEBUG solana_runtime::message_processor::stable_log] Program 1111111QLbz7JHiBTspS962RLKV8GndWFwiEaqKM success
test test::test_hello_world ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s

Ohjelman käyttöönotto

Seuraavaksi ota ohjelma käyttöön. Paikallisessa kehityksessä voimme käyttää solana-test-validator.

Ensin määritä Solana CLI käyttämään paikallista Solana-klusteria.

Terminal
solana config set -ul

Esimerkki tulostuksesta:

Config File: /.config/solana/cli/config.yml
RPC URL: http://localhost:8899
WebSocket URL: ws://localhost:8900/ (computed)
Keypair Path: /.config/solana/id.json
Commitment: confirmed

Avaa uusi terminaali ja suorita solana-test-validators komento käynnistääksesi paikallisen validaattorin.

Terminal
solana-test-validator

Kun testivalidaattori on käynnissä, suorita solana program deploy komento erillisessä terminaalissa ottaaksesi ohjelman käyttöön paikallisessa validaattorissa.

Terminal
solana program deploy ./target/deploy/hello_world.so

Esimerkki tulostuksesta:

Program Id: 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz
Signature:
5osMiNMiDZGM7L1e2tPHxU8wdB8gwG8fDnXLg5G7SbhwFz4dHshYgAijk4wSQL5cXiu8z1MMou5kLadAQuHp7ybH

Voit tarkastella ohjelmatunnusta ja transaktioallekirjoitusta Solana Explorerissa. Huomaa, että Solana Explorerissa klusterin on myös oltava localhost. "Custom RPC URL" -vaihtoehto Solana Explorerissa on oletuksena http://localhost:8899.

Ohjelman kutsuminen

Seuraavaksi näytämme, miten ohjelmaa kutsutaan Rust-asiakassovelluksella.

Luo ensin examples hakemisto ja client.rs tiedosto.

Terminal
mkdir -p examples
touch examples/client.rs

Lisää seuraava sisältö tiedostoon Cargo.toml.

Cargo.toml
[[example]]
name = "client"
path = "examples/client.rs"

Lisää solana-client riippuvuus.

Terminal
cargo add solana-client@1.18.26 --dev

Lisää seuraava koodi tiedostoon examples/client.rs. Tämä on Rust-asiakasohjelma, joka rahoittaa uuden keypair-avaimen transaktiomaksujen maksamiseen ja kutsuu sitten hello world -ohjelmaa.

example/client.rs
use solana_client::rpc_client::RpcClient;
use solana_sdk::{
commitment_config::CommitmentConfig,
instruction::Instruction,
pubkey::Pubkey,
signature::{Keypair, Signer},
transaction::Transaction,
};
use std::str::FromStr;
#[tokio::main]
async fn main() {
// Program ID (replace with your actual program ID)
let program_id = Pubkey::from_str("4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz").unwrap();
// Connect to the Solana devnet
let rpc_url = String::from("http://127.0.0.1:8899");
let client = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
// Generate a new keypair for the payer
let payer = Keypair::new();
// Request airdrop
let airdrop_amount = 1_000_000_000; // 1 SOL
let signature = client
.request_airdrop(&payer.pubkey(), airdrop_amount)
.expect("Failed to request airdrop");
// Wait for airdrop confirmation
loop {
let confirmed = client.confirm_transaction(&signature).unwrap();
if confirmed {
break;
}
}
// Create the instruction
let instruction = Instruction::new_with_borsh(
program_id,
&(), // Empty instruction data
vec![], // No accounts needed
);
// Add the instruction to new transaction
let mut transaction = Transaction::new_with_payer(&[instruction], Some(&payer.pubkey()));
transaction.sign(&[&payer], client.get_latest_blockhash().unwrap());
// Send and confirm the transaction
match client.send_and_confirm_transaction(&transaction) {
Ok(signature) => println!("Transaction Signature: {}", signature),
Err(err) => eprintln!("Error sending transaction: {}", err),
}
}

Ennen ohjelman suorittamista korvaa yllä olevassa koodinpätkässä oleva ohjelmatunnus omasi ohjelman tunnuksella.

Voit saada ohjelmatunnuksesi suorittamalla seuraavan komennon.

Terminal
solana address -k ./target/deploy/hello_world-keypair.json
#[tokio::main]
async fn main() {
- let program_id = Pubkey::from_str("4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz").unwrap();
+ let program_id = Pubkey::from_str("YOUR_PROGRAM_ID).unwrap();
}
}

Suorita asiakasohjelma seuraavalla komennolla.

Terminal
cargo run --example client

Esimerkki tulostuksesta:

Transaction Signature: 54TWxKi3Jsi3UTeZbhLGUFX6JQH7TspRJjRRFZ8NFnwG5BXM9udxiX77bAACjKAS9fGnVeEazrXL4SfKrW7xZFYV

Voit tarkastella transaktion allekirjoitusta Solana Explorerissa (paikallinen klusteri) nähdäksesi "Hello, world!" ohjelman lokissa.

Päivitä ohjelma

Solana-ohjelmia voidaan päivittää ottamalla ne uudelleen käyttöön samalla ohjelmatunnuksella. Päivitä ohjelma tiedostossa src/lib.rs tulostamaan "Hello, Solana!" "Hello, world!" sijaan.

lib.rs
pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
- msg!("Hello, world!");
+ msg!("Hello, Solana!");
Ok(())
}

Testaa päivitetty ohjelma suorittamalla komento cargo test-sbf.

Terminal
cargo test-sbf

Ohjelman lokissa pitäisi näkyä "Hello, Solana!".

Terminal
running 1 test
[2024-10-23T19:28:28.842639000Z INFO solana_program_test] "hello_world" SBF program from /code/misc/delete/hello_world/target/deploy/hello_world.so, modified 4 minutes, 31 seconds, 435 ms, 566 µs and 766 ns ago
[2024-10-23T19:28:28.934854000Z DEBUG solana_runtime::message_processor::stable_log] Program 1111111QLbz7JHiBTspS962RLKV8GndWFwiEaqKM invoke [1]
[2024-10-23T19:28:28.936735000Z DEBUG solana_runtime::message_processor::stable_log] Program log: Hello, Solana!
[2024-10-23T19:28:28.938774000Z DEBUG solana_runtime::message_processor::stable_log] Program 1111111QLbz7JHiBTspS962RLKV8GndWFwiEaqKM consumed 140 of 200000 compute units
[2024-10-23T19:28:28.938793000Z DEBUG solana_runtime::message_processor::stable_log] Program 1111111QLbz7JHiBTspS962RLKV8GndWFwiEaqKM success
test test::test_hello_world ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.14s

Suorita komento cargo build-sbf luodaksesi päivitetyn .so tiedoston.

Terminal
cargo build-sbf

Ota ohjelma uudelleen käyttöön käyttämällä komentoa solana program deploy.

Terminal
solana program deploy ./target/deploy/hello_world.so

Suorita asiakaskoodi uudelleen ja tarkastele transaktion allekirjoitusta Solana Explorerissa nähdäksesi "Hello, Solana!" ohjelman lokissa.

Terminal
cargo run --example client

Ohjelman sulkeminen

Voit sulkea Solana-ohjelmasi saadaksesi takaisin tilille allokoidun SOL-määrän. Ohjelman sulkeminen on peruuttamatonta, joten se tulisi tehdä varoen.

Sulkeaksesi ohjelman, käytä solana program close <PROGRAM_ID> komentoa. Esimerkiksi:

Terminal
solana program close 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz
--bypass-warning

Esimerkki tulostuksesta:

Closed Program Id 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz, 0.1350588 SOL
reclaimed

Huomaa, että kun ohjelma on suljettu, sen ohjelmatunnusta ei voi käyttää uudelleen. Yritys käyttöönottaa ohjelma aiemmin suljetulla ohjelmatunnuksella johtaa virheeseen.

Error: Program 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz has been closed, use
a new Program Id

Jos haluat ottaa käyttöön ohjelman samalla lähdekoodilla ohjelman sulkemisen jälkeen, sinun täytyy luoda uusi ohjelmatunnus. Luodaksesi uuden keypair-tiedoston ohjelmalle, suorita seuraava komento:

Terminal
solana-keygen new -o ./target/deploy/hello_world-keypair.json --force

Vaihtoehtoisesti voit poistaa olemassa olevan keypair-tiedoston (esim. ./target/deploy/hello_world-keypair.json) ja suorittaa cargo build-sbf uudelleen, joka luo uuden keypair-tiedoston.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua