Ohjelmien kehittäminen Rustilla
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
Ensin, luo uusi Rust-projekti käyttäen standardia 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ä Cargo.toml
tiedostossa arvoon 2021
. Muuten saatat
kohdata virheen ohjelmaa rakentaessa.
Lisää solana-program riippuvuus
Seuraavaksi lisää solana-program
riippuvuus. Tämä on vähimmäisriippuvuus, joka
vaaditaan Solana-ohjelman rakentamiseen.
$cargo add solana-program@2.2.0
Lisää crate-type
Seuraavaksi lisää alla oleva koodi tiedostoon Cargo.toml
.
[lib]crate-type = ["cdylib", "lib"]
Jos et sisällytä tätä konfiguraatiota, target/deploy
hakemistoa ei luoda,
kun rakennat ohjelman.
Sinun Cargo.toml
tiedoston 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
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.
msg!
makroa 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(())}
Rakenna ohjelma
Seuraavaksi rakenna ohjelma käyttäen 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 tullaan ottamaan käyttöön verkossa "älysopimuksena".- Keypair-tiedosto (esim.
hello_world-keypair.json
): Tämän keypair:in 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:in julkisen avaimen:
$solana address -k ./target/deploy/hello_world-keypair.json
Esimerkki tulostuksesta:
Tämä on yksinkertainen "Hello, world!" -ohjelma Solana-lohkoketjulle. Ohjelma kirjoittaa viestin "Hello, world!" ohjelman lokiin, kun se suoritetaan.
Tässä on ohjelman koodi:
Tämä ohjelma ottaa vastaan yhden tilin, joka on ohjelman kutsuja. Kun ohjelma suoritetaan, se kirjoittaa viestin "Hello, world!" ohjelman lokiin.
Lisää testiriippuvuudet
Seuraavaksi, testaa ohjelma käyttäen litesvm
-pakettia. Lisää seuraavat
riippuvuudet tiedostoon Cargo.toml
.
Tämä lisää tarvittavat riippuvuudet ohjelman testaamiseen.
Tämä määrittää testiriippuvuudet, jotka tarvitaan Solana-ohjelman testaamiseen.
Testaa ohjelma
Lisää seuraava testi tiedostoon src/lib.rs
, ohjelmakoodin alapuolelle. Tämä on
testi moduuli, joka kutsuu hello world -ohjelmaa.
Tämä testi luo uuden testiympäristön, kutsuu hello world -ohjelmaa ja tarkistaa, että ohjelma suoritetaan onnistuneesti.
Suorita testi käyttäen cargo test
-komentoa. Ohjelman lokissa näkyy "Hello,
world!".
$cargo test -- --no-capture
Esimerkki tulostuksesta:
Testi suoritetaan onnistuneesti ja ohjelman lokissa näkyy "Hello, world!".
Ota ohjelma käyttöön
Seuraavaksi, ota ohjelma käyttöön. Kun kehitämme paikallisesti, voimme käyttää
solana-test-validator
.
Ensin, määritä Solana CLI käyttämään paikallista Solana-klusteria.
$solana config set -ul
Esimerkki tulostuksesta:
Solana CLI on nyt määritetty käyttämään paikallista Solana-klusteria.
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 tapahtuman allekirjoitusta Solana Explorerissa.
Huomaa, että Solana Explorerissa klusterin on oltava myös localhost. "Custom
RPC URL" -vaihtoehto Solana Explorerissa 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 sisältö 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-asiakaskoodi,
joka rahoittaa uuden keypair-avaimen tapahtumamaksujen 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
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(())}
Suorita komento cargo build-sbf
luodaksesi päivitetyn .so
tiedoston.
$cargo build-sbf
Testaa päivitettyä ohjelmaa suorittamalla komento cargo test
.
$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 samalla solana program deploy
komennolla.
$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.
Sulkeaksesi ohjelman käytä komentoa solana program close <PROGRAM_ID>
.
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, joka luo uuden keypair-tiedoston.
Is this page helpful?