Solana-ohjelmat kehitetään pääasiassa Rust-ohjelmointikielellä. Tämä sivu keskittyy Solana-ohjelmien kirjoittamiseen Rustilla ilman Anchor- viitekehystä, lähestymistapaa jota usein kutsutaan "natiivi Rust" -ohjelmien kirjoittamiseksi.
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-viitekehyksen käyttöön. Tätä menetelmää suositellaan kehittäjille, jotka:
- Haluavat yksityiskohtaista hallintaa ohjelmalogiikkaan ja optimointeihin
- Haluavat oppia peruskäsitteet ennen siirtymistä korkeamman tason viitekehyksiin
Aloittelijoille suosittelemme aloittamista Anchor-viitekehyksellä. 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-ohjelman luomiseen. Luomme minimaalisen ohjelman, joka tulostaa "Hello, world!" ohjelman lokiin.
Luo uusi ohjelma
Luo ensin uusi Rust-projekti käyttämällä tavallista cargo new -komentoa
--lib -lipulla.
$cargo new hello_world --lib
Siirry projektin hakemistoon. Sinun pitäisi nähdä oletusarvoiset src/lib.rs ja
Cargo.toml -tiedostot
$cd hello_world
Päivitä edition -kenttä tiedostossa Cargo.toml arvoon 2021. Muuten
saatat kohdata virheen ohjelmaa rakentaessasi.
Lisää solana-program riippuvuus
Lisää seuraavaksi solana-program -riippuvuus. Tämä on vähimmäisriippuvuus,
joka vaaditaan Solana-ohjelman rakentamiseen.
$cargo add solana-program@2.2.0
Lisää crate-type
Lisää seuraavaksi seuraava pätkä tiedostoon Cargo.toml.
[lib]crate-type = ["cdylib", "lib"]
Jos et sisällytä tätä konfiguraatiota, target/deploy -hakemistoa ei luoda,
kun rakennat ohjelman.
Cargo.toml -tiedostosi pitäisi näyttää seuraavalta:
[package]name = "hello_world"version = "0.1.0"edition = "2021"[lib]crate-type = ["cdylib", "lib"][dependencies]solana-program = "2.2.0"
Lisää ohjelmakoodi
Korvaa seuraavaksi src/lib.rs -tiedoston sisältö seuraavalla koodilla. Tämä on
minimaalinen Solana-ohjelma, joka tulostaa "Hello, world!" ohjelman lokiin, kun
ohjelmaa kutsutaan.
msg! -makroa käytetään Solana-ohjelmissa tulostamaan viesti 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(())}
Rakenna ohjelma
Rakenna seuraavaksi ohjelma käyttämällä cargo build-sbf -komentoa.
$cargo build-sbf
Tämä komento luo target/deploy -hakemiston, joka sisältää kaksi tärkeää
tiedostoa:
.so-tiedosto (esim.hello_world.so): Tämä on käännetty Solana-ohjelma, joka otetaan käyttöön verkkoon "älysopimuksena".- Keypair-tiedosto (esim.
hello_world-keypair.json): Tämän keypair-parin julkista avainta käytetään ohjelman ID:nä ohjelmaa otettaessa käyttöön.
Nähdäksesi ohjelmatunnuksen, suorita seuraava komento päätteessäsi. Tämä komento tulostaa määritetyssä tiedostopolussa olevan keypair:in julkisen avaimen:
$solana address -k ./target/deploy/hello_world-keypair.json
Esimerkki tulostuksesta:
4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz
Lisää testiriippuvuudet
Testaa seuraavaksi ohjelma käyttämällä litesvm -cratea. Lisää seuraavat
riippuvuudet tiedostoon Cargo.toml.
$cargo add litesvm@0.6.1 --dev$cargo add solana-sdk@2.2.0 --dev
Testaa ohjelma
Lisää seuraava testi tiedostoon src/lib.rs, ohjelmakoodin alle. Tämä on
testimoduuli, joka kutsuu hello world -ohjelmaa.
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(())}#[cfg(test)]mod test {use litesvm::LiteSVM;use solana_sdk::{instruction::Instruction,message::Message,signature::{Keypair, Signer},transaction::Transaction,};#[test]fn test_hello_world() {// Create a new LiteSVM instancelet mut svm = LiteSVM::new();// Create a keypair for the transaction payerlet payer = Keypair::new();// Airdrop some lamports to the payersvm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap();// Load our programlet program_keypair = Keypair::new();let program_id = program_keypair.pubkey();svm.add_program_from_file(program_id, "target/deploy/hello_world.so").unwrap();// Create instruction with no accounts and no datalet instruction = Instruction {program_id,accounts: vec![],data: vec![],};// Create transactionlet message = Message::new(&[instruction], Some(&payer.pubkey()));let transaction = Transaction::new(&[&payer], message, svm.latest_blockhash());// Send transaction and verify it succeedslet result = svm.send_transaction(transaction);assert!(result.is_ok(), "Transaction should succeed");let logs = result.unwrap().logs;println!("Logs: {logs:#?}");}}
Suorita testi käyttämällä cargo test -komentoa. Ohjelman loki näyttää tekstin
"Hello, world!".
$cargo test -- --no-capture
Esimerkki tulostuksesta:
running 1 testLogs: ["Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk invoke [1]","Program log: Hello, world!","Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk consumed 211 of 200000 compute units","Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk success",]test test::test_hello_world ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
Ota ohjelma käyttöön
Seuraavaksi julkaise ohjelma. Paikallisessa kehityksessä voimme käyttää
solana-test-validator -komentoa.
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 validatorin.
$solana-test-validator
Kun testivalidatori on käynnissä, suorita solana program deploy -komento
erillisessä terminaalissa julkaistaksesi ohjelman paikalliseen validatoriin.
$solana program deploy ./target/deploy/hello_world.so
Esimerkki tulostuksesta:
Program Id: 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMzSignature:5osMiNMiDZGM7L1e2tPHxU8wdB8gwG8fDnXLg5G7SbhwFz4dHshYgAijk4wSQL5cXiu8z1MMou5kLadAQuHp7ybH
Voit tarkastella ohjelmatunnusta ja tapahtuman allekirjoitusta Solana Explorerissa.
Huomaa, että Solana Explorerin klusterin on myös oltava localhost. Solana
Explorerin "Custom RPC URL" -vaihtoehto on oletuksena http://localhost:8899.
Luo esimerkkiasiakas
Seuraavaksi näytämme, miten ohjelmaa kutsutaan Rust-asiakkaalla.
Luo ensin examples -hakemisto ja client.rs -tiedosto.
$mkdir -p examples && touch examples/client.rs
Lisää seuraava tiedostoon Cargo.toml.
[[example]]name = "client"path = "examples/client.rs"
Lisää solana-client- ja tokio-riippuvuudet.
$cargo add solana-client@2.2.0 --dev$cargo add tokio --dev
Lisää asiakas
Lisää seuraava koodi tiedostoon examples/client.rs. Tämä on
Rust-asiakasohjelma, joka rahoittaa uuden keypair-avaimen transaktiomaksujen
maksamiseksi 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://localhost: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),}}
Korvaa ohjelmatunnus
Ennen asiakaskoodin suorittamista korvaa koodinpätkässä oleva ohjelmatunnus ohjelmasi tunnuksella.
Saat ohjelmatunnuksesi suorittamalla seuraavan komennon.
$solana address -k ./target/deploy/hello_world-keypair.json
Kutsu ohjelmaa
Suorita asiakaskoodi seuraavalla komennolla.
$cargo run --example client
Esimerkki tulostuksesta:
Transaction Signature: 54TWxKi3Jsi3UTeZbhLGUFX6JQH7TspRJjRRFZ8NFnwG5BXM9udxiX77bAACjKAS9fGnVeEazrXL4SfKrW7xZFYV
Voit tarkastella transaktiosignatuuria 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
ohjelmatunnisteella. Päivitä ohjelma tiedostossa src/lib.rs tulostamaan
"Hello, Solana!" tekstin "Hello, world!" sijaan.
pub fn process_instruction(_program_id: &Pubkey,_accounts: &[AccountInfo],_instruction_data: &[u8],) -> ProgramResult {-msg!("Hello, world!");+msg!("Hello, Solana!");Ok(())}
Suorita cargo build-sbf-komento luodaksesi päivitetyn .so-tiedoston.
$cargo build-sbf
Testaa päivitetty ohjelma suorittamalla cargo test-komento.
$cargo test -- --no-capture
Ohjelman lokissa pitäisi näkyä "Hello, Solana!".
running 1 testLogs: ["Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV invoke [1]","Program log: Hello, Solana!","Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV consumed 211 of 200000 compute units","Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV success",]test test::test_hello_world ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s
Ota ohjelma uudelleen käyttöön
Ota ohjelma uudelleen käyttöön käyttämällä samaa
solana program deploy-komentoa.
$solana program deploy ./target/deploy/hello_world.so
Suorita asiakaskoodi uudelleen ja tarkastele transaktiosignatuuria Solana Explorerissa nähdäksesi "Hello, Solana!" ohjelman lokissa.
$cargo run --example client
Sulje ohjelma
Voit sulkea Solana-ohjelmasi saadaksesi takaisin tilille allokoidun SOL:n. Ohjelman sulkeminen on peruuttamatonta, joten se tulisi tehdä varoen.
Sulje ohjelma käyttämällä 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
Suljetun ohjelman uudelleenkäyttöönotto
Jos haluat ottaa uudelleen käyttöön ohjelman samalla lähdekoodilla sulkemisen jälkeen, sinun on luotava uusi ohjelmatunnus. Luodaksesi uuden keypair-parin 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, jolloin luodaan uusi keypair-tiedosto.
Is this page helpful?