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.
cargo init hello_world --lib
Siirry projektihakemistoon. Sinun pitäisi nähdä oletusarvoiset src/lib.rs
ja
Cargo.toml
tiedostot
cd hello_world
Seuraavaksi lisää solana-program
riippuvuus. Tämä on vähimmäisriippuvuus, joka
vaaditaan Solana-ohjelman rakentamiseen.
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.
[lib]crate-type = ["cdylib", "lib"]
Tiedoston Cargo.toml
tulisi näyttää seuraavalta:
[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.
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
.
cargo build-sbf
Tämä komento luo hakemiston target/deploy
, joka sisältää kaksi tärkeää
tiedostoa:
- Tiedosto
.so
(esim.hello_world.so
): Tämä on käännetty Solana-ohjelma, joka tullaan ottamaan käyttöön verkossa "älysopimuksena". - 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:
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
.
cargo add solana-program-test@1.18.26 --devcargo add solana-sdk@1.18.26 --devcargo add tokio --dev
Lisää seuraava testi tiedostoon src/lib.rs
ohjelmakoodin alapuolelle. Tämä on
testi moduuli, joka kutsuu hello world -ohjelmaa.
#[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 instructionlet instruction = Instruction {program_id,accounts: vec![],data: vec![],};// Create transaction with instructionlet mut transaction = Transaction::new_with_payer(&[instruction], Some(&payer.pubkey()));// Sign transactiontransaction.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!".
cargo test-sbf
Esimerkki tulostuksesta:
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 successtest test::test_hello_world ... oktest 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.
solana config set -ul
Esimerkki tulostuksesta:
Config File: /.config/solana/cli/config.ymlRPC URL: http://localhost:8899WebSocket URL: ws://localhost:8900/ (computed)Keypair Path: /.config/solana/id.jsonCommitment: confirmed
Avaa uusi terminaali ja suorita solana-test-validators
komento käynnistääksesi
paikallisen validaattorin.
solana-test-validator
Kun testivalidaattori on käynnissä, suorita solana program deploy
komento
erillisessä terminaalissa ottaaksesi ohjelman käyttöön paikallisessa
validaattorissa.
solana program deploy ./target/deploy/hello_world.so
Esimerkki tulostuksesta:
Program Id: 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMzSignature: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.
mkdir -p examplestouch examples/client.rs
Lisää seuraava sisältö tiedostoon Cargo.toml
.
[[example]]name = "client"path = "examples/client.rs"
Lisää solana-client
riippuvuus.
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.
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 devnetlet 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 payerlet payer = Keypair::new();// Request airdroplet airdrop_amount = 1_000_000_000; // 1 SOLlet signature = client.request_airdrop(&payer.pubkey(), airdrop_amount).expect("Failed to request airdrop");// Wait for airdrop confirmationloop {let confirmed = client.confirm_transaction(&signature).unwrap();if confirmed {break;}}// Create the instructionlet instruction = Instruction::new_with_borsh(program_id,&(), // Empty instruction datavec![], // No accounts needed);// Add the instruction to new transactionlet mut transaction = Transaction::new_with_payer(&[instruction], Some(&payer.pubkey()));transaction.sign(&[&payer], client.get_latest_blockhash().unwrap());// Send and confirm the transactionmatch 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.
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.
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.
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
.
cargo test-sbf
Ohjelman lokissa pitäisi näkyä "Hello, Solana!".
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 successtest test::test_hello_world ... oktest 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.
cargo build-sbf
Ota ohjelma uudelleen käyttöön käyttämällä komentoa solana program deploy
.
solana program deploy ./target/deploy/hello_world.so
Suorita asiakaskoodi uudelleen ja tarkastele transaktion allekirjoitusta Solana Explorerissa nähdäksesi "Hello, Solana!" ohjelman lokissa.
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:
solana program close 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz--bypass-warning
Esimerkki tulostuksesta:
Closed Program Id 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz, 0.1350588 SOLreclaimed
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, usea 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:
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?