Ανάπτυξη προγραμμάτων σε Rust
Τα προγράμματα Solana αναπτύσσονται κυρίως χρησιμοποιώντας τη γλώσσα προγραμματισμού Rust. Αυτή η σελίδα επικεντρώνεται στη συγγραφή προγραμμάτων Solana σε Rust χωρίς τη χρήση του πλαισίου Anchor, μια προσέγγιση που συχνά αναφέρεται ως συγγραφή προγραμμάτων "native Rust".
Η ανάπτυξη σε native Rust παρέχει στους προγραμματιστές άμεσο έλεγχο των προγραμμάτων Solana τους. Ωστόσο, αυτή η προσέγγιση απαιτεί περισσότερη χειροκίνητη ρύθμιση και επαναλαμβανόμενο κώδικα σε σύγκριση με τη χρήση του πλαισίου Anchor. Αυτή η μέθοδος συνιστάται για προγραμματιστές που:
- Αναζητούν λεπτομερή έλεγχο της λογικής του προγράμματος και βελτιστοποιήσεις
- Θέλουν να μάθουν τις βασικές έννοιες πριν προχωρήσουν σε πλαίσια υψηλότερου επιπέδου
Για αρχάριους, συνιστούμε να ξεκινήσετε με το πλαίσιο Anchor. Δείτε την ενότητα Anchor για περισσότερες πληροφορίες.
Προαπαιτούμενα
Για λεπτομερείς οδηγίες εγκατάστασης, επισκεφθείτε τη σελίδα εγκατάστασης.
Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε εγκαταστήσει τα εξής:
- Rust: Η γλώσσα προγραμματισμού για την ανάπτυξη προγραμμάτων Solana.
- Solana CLI: Εργαλείο γραμμής εντολών για την ανάπτυξη Solana.
Ξεκινώντας
Το παρακάτω παράδειγμα καλύπτει τα βασικά βήματα για τη δημιουργία του πρώτου σας προγράμματος Solana γραμμένο σε Rust. Θα δημιουργήσουμε ένα ελάχιστο πρόγραμμα που εκτυπώνει "Hello, world!" στο αρχείο καταγραφής του προγράμματος.
Δημιουργία νέου προγράμματος
Πρώτα, δημιουργήστε ένα νέο project Rust χρησιμοποιώντας την τυπική εντολή
cargo new
με τη σημαία --lib
.
$cargo new hello_world --lib
Μεταβείτε στον κατάλογο του project. Θα πρέπει να δείτε τα προεπιλεγμένα αρχεία
src/lib.rs
και Cargo.toml
$cd hello_world
Ενημερώστε το πεδίο edition
στο Cargo.toml
σε 2021
. Διαφορετικά, μπορεί
να αντιμετωπίσετε σφάλμα κατά την κατασκευή του προγράμματος.
Προσθέστε την εξάρτηση solana-program
Στη συνέχεια, προσθέστε την εξάρτηση solana-program
. Αυτή είναι η ελάχιστη
εξάρτηση που απαιτείται για τη δημιουργία ενός προγράμματος Solana.
$cargo add solana-program@2.2.0
Προσθέστε το crate-type
Στη συνέχεια, προσθέστε το ακόλουθο απόσπασμα στο Cargo.toml
.
[lib]crate-type = ["cdylib", "lib"]
Αν δεν συμπεριλάβετε αυτή τη ρύθμιση, ο κατάλογος target/deploy
δεν θα
δημιουργηθεί όταν κάνετε build το πρόγραμμα.
Το αρχείο σας Cargo.toml
θα πρέπει να μοιάζει με το ακόλουθο:
[package]name = "hello_world"version = "0.1.0"edition = "2021"[lib]crate-type = ["cdylib", "lib"][dependencies]solana-program = "2.2.0"
Προσθέστε τον κώδικα του προγράμματος
Στη συνέχεια, αντικαταστήστε τα περιεχόμενα του src/lib.rs
με τον ακόλουθο
κώδικα. Αυτό είναι ένα ελάχιστο πρόγραμμα Solana που εκτυπώνει "Hello, world!"
στο αρχείο καταγραφής του προγράμματος όταν γίνεται επίκληση του προγράμματος.
Η μακροεντολή msg!
χρησιμοποιείται στα προγράμματα Solana για την εκτύπωση
ενός μηνύματος στο αρχείο καταγραφής του προγράμματος.
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(())}
Κάντε build το πρόγραμμα
Στη συνέχεια, κάντε build το πρόγραμμα χρησιμοποιώντας την εντολή
cargo build-sbf
.
$cargo build-sbf
Αυτή η εντολή δημιουργεί έναν κατάλογο target/deploy
που περιέχει δύο
σημαντικά αρχεία:
- Ένα αρχείο
.so
(π.χ.,hello_world.so
): Αυτό είναι το μεταγλωττισμένο πρόγραμμα Solana που θα αναπτυχθεί στο δίκτυο ως "έξυπνο συμβόλαιο". - Ένα αρχείο keypair (π.χ.,
hello_world-keypair.json
): Το δημόσιο κλειδί αυτού του keypair χρησιμοποιείται ως αναγνωριστικό προγράμματος κατά την ανάπτυξη του προγράμματος.
Για να δείτε το αναγνωριστικό του προγράμματος, εκτελέστε την ακόλουθη εντολή στο τερματικό σας. Αυτή η εντολή εκτυπώνει το δημόσιο κλειδί του keypair στη συγκεκριμένη διαδρομή αρχείου:
$solana address -k ./target/deploy/hello_world-keypair.json
Παράδειγμα εξόδου:
4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz
Προσθήκη εξαρτήσεων δοκιμών
Στη συνέχεια, δοκιμάστε το πρόγραμμα χρησιμοποιώντας το πακέτο litesvm
.
Προσθέστε τις ακόλουθες εξαρτήσεις στο Cargo.toml
.
$cargo add litesvm --dev$cargo add solana-sdk@2.2.0 --dev
Δοκιμή του προγράμματος
Προσθέστε την ακόλουθη δοκιμή στο src/lib.rs
, κάτω από τον κώδικα του
προγράμματος. Αυτή είναι μια ενότητα δοκιμών που καλεί το πρόγραμμα hello world.
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:#?}");}}
Εκτελέστε τη δοκιμή χρησιμοποιώντας την εντολή cargo test
. Το αρχείο
καταγραφής του προγράμματος θα εμφανίσει "Hello, world!".
$cargo test -- --no-capture
Παράδειγμα εξόδου:
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
Ανάπτυξη του προγράμματος
Στη συνέχεια, αναπτύξτε το πρόγραμμα. Κατά την τοπική ανάπτυξη, μπορούμε να
χρησιμοποιήσουμε το solana-test-validator
.
Πρώτα, ρυθμίστε το Solana CLI ώστε να χρησιμοποιεί το τοπικό σύμπλεγμα Solana.
$solana config set -ul
Παράδειγμα εξόδου:
Config File: /.config/solana/cli/config.ymlRPC URL: http://localhost:8899WebSocket URL: ws://localhost:8900/ (computed)Keypair Path: /.config/solana/id.jsonCommitment: confirmed
Ανοίξτε ένα νέο τερματικό και εκτελέστε την εντολή solana-test-validators
για
να ξεκινήσετε τον τοπικό validator.
$solana-test-validator
Ενώ ο validator δοκιμών εκτελείται, εκτελέστε την εντολή solana program deploy
σε ξεχωριστό τερματικό για να αναπτύξετε το πρόγραμμα στον τοπικό validator.
$solana program deploy ./target/deploy/hello_world.so
Παράδειγμα εξόδου:
Program Id: 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMzSignature:5osMiNMiDZGM7L1e2tPHxU8wdB8gwG8fDnXLg5G7SbhwFz4dHshYgAijk4wSQL5cXiu8z1MMou5kLadAQuHp7ybH
Μπορείτε να επιθεωρήσετε το αναγνωριστικό προγράμματος και την υπογραφή συναλλαγής στον Solana Explorer.
Σημειώστε ότι το cluster στον Solana Explorer πρέπει επίσης να είναι
localhost. Η επιλογή "Custom RPC URL" στον Solana Explorer έχει προεπιλεγμένη
τιμή http://localhost:8899
.
Δημιουργία παραδείγματος πελάτη
Στη συνέχεια, θα δείξουμε πώς να καλέσετε το πρόγραμμα χρησιμοποιώντας έναν πελάτη Rust.
Πρώτα δημιουργήστε έναν κατάλογο examples
και ένα αρχείο client.rs
.
$mkdir -p examples && touch examples/client.rs
Προσθέστε τα παρακάτω στο Cargo.toml
.
[[example]]name = "client"path = "examples/client.rs"
Προσθέστε τις εξαρτήσεις solana-client
και tokio
.
$cargo add solana-client@2.2.0 --dev$cargo add tokio --dev
Προσθήκη του πελάτη
Προσθέστε τον παρακάτω κώδικα στο examples/client.rs
. Αυτό είναι ένα script
πελάτη Rust που χρηματοδοτεί ένα νέο keypair για να πληρώσει τα τέλη συναλλαγής
και στη συνέχεια καλεί το πρόγραμμα hello world.
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),}}
Αντικατάσταση του αναγνωριστικού προγράμματος
Πριν εκτελέσετε τον κώδικα του πελάτη, αντικαταστήστε το αναγνωριστικό προγράμματος στο απόσπασμα κώδικα με αυτό του προγράμματός σας.
Μπορείτε να πάρετε το αναγνωριστικό του προγράμματός σας εκτελώντας την παρακάτω εντολή.
$solana address -k ./target/deploy/hello_world-keypair.json
Κλήση του προγράμματος
Εκτελέστε το script του πελάτη με την παρακάτω εντολή.
$cargo run --example client
Παράδειγμα εξόδου:
Transaction Signature: 54TWxKi3Jsi3UTeZbhLGUFX6JQH7TspRJjRRFZ8NFnwG5BXM9udxiX77bAACjKAS9fGnVeEazrXL4SfKrW7xZFYV
Μπορείτε να επιθεωρήσετε την υπογραφή της συναλλαγής στον Solana Explorer (τοπικό cluster) για να δείτε το "Hello, world!" στο αρχείο καταγραφής του προγράμματος.
Ενημέρωση του προγράμματος
Τα προγράμματα Solana μπορούν να ενημερωθούν με επανατοποθέτηση στο ίδιο
αναγνωριστικό προγράμματος. Ενημερώστε το πρόγραμμα στο src/lib.rs
ώστε να
εμφανίζει "Hello, Solana!" αντί για "Hello, world!".
pub fn process_instruction(_program_id: &Pubkey,_accounts: &[AccountInfo],_instruction_data: &[u8],) -> ProgramResult {-msg!("Hello, world!");+msg!("Hello, Solana!");Ok(())}
Εκτελέστε την εντολή cargo build-sbf
για να δημιουργήσετε ένα ενημερωμένο
αρχείο .so
.
$cargo build-sbf
Δοκιμάστε το ενημερωμένο πρόγραμμα εκτελώντας την εντολή cargo test
.
$cargo test -- --no-capture
Θα πρέπει να δείτε το "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
Επανατοποθέτηση του προγράμματος
Επανατοποθετήστε το πρόγραμμα χρησιμοποιώντας την ίδια εντολή
solana program deploy
.
$solana program deploy ./target/deploy/hello_world.so
Εκτελέστε ξανά τον κώδικα πελάτη και επιθεωρήστε την υπογραφή της συναλλαγής στον Solana Explorer για να δείτε το "Hello, Solana!" στο αρχείο καταγραφής του προγράμματος.
$cargo run --example client
Κλείσιμο του προγράμματος
Μπορείτε να κλείσετε το πρόγραμμα Solana για να ανακτήσετε το SOL που έχει διατεθεί στον λογαριασμό. Το κλείσιμο ενός προγράμματος είναι μη αναστρέψιμο, οπότε θα πρέπει να γίνεται με προσοχή.
Για να κλείσετε ένα πρόγραμμα, χρησιμοποιήστε την εντολή
solana program close <PROGRAM_ID>
. Για παράδειγμα:
$solana program close 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz --bypass-warning
Παράδειγμα εξόδου:
Closed Program Id 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz, 0.1350588 SOLreclaimed
Σημειώστε ότι μόλις ένα πρόγραμμα κλείσει, το αναγνωριστικό του προγράμματος δεν μπορεί να επαναχρησιμοποιηθεί. Η προσπάθεια ανάπτυξης ενός προγράμματος με ένα προηγουμένως κλεισμένο αναγνωριστικό προγράμματος θα οδηγήσει σε σφάλμα.
Error: Program 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz has been closed, usea new Program Id
Επανατοποθέτηση ενός κλεισμένου προγράμματος
Εάν χρειάζεται να επανατοποθετήσετε ένα πρόγραμμα με τον ίδιο πηγαίο κώδικα μετά το κλείσιμο ενός προγράμματος, πρέπει να δημιουργήσετε ένα νέο αναγνωριστικό προγράμματος. Για να δημιουργήσετε ένα νέο keypair για το πρόγραμμα, εκτελέστε την ακόλουθη εντολή:
$solana-keygen new -o ./target/deploy/hello_world-keypair.json --force
Εναλλακτικά, μπορείτε να διαγράψετε το υπάρχον αρχείο keypair (π.χ.
./target/deploy/hello_world-keypair.json
) και να εκτελέσετε ξανά το cargo build-sbf
, το οποίο θα δημιουργήσει ένα νέο αρχείο keypair.
Is this page helpful?