Τεκμηρίωση SolanaΑνάπτυξη προγραμμάτων

Ανάπτυξη προγραμμάτων σε 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.

Terminal
$
cargo new hello_world --lib

Μεταβείτε στον κατάλογο του project. Θα πρέπει να δείτε τα προεπιλεγμένα αρχεία src/lib.rs και Cargo.toml

Terminal
$
cd hello_world

Ενημερώστε το πεδίο edition στο Cargo.toml σε 2021. Διαφορετικά, μπορεί να αντιμετωπίσετε σφάλμα κατά την κατασκευή του προγράμματος.

Προσθέστε την εξάρτηση solana-program

Στη συνέχεια, προσθέστε την εξάρτηση solana-program. Αυτή είναι η ελάχιστη εξάρτηση που απαιτείται για τη δημιουργία ενός προγράμματος Solana.

Terminal
$
cargo add solana-program@2.2.0

Προσθέστε το crate-type

Στη συνέχεια, προσθέστε το ακόλουθο απόσπασμα στο Cargo.toml.

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

Αν δεν συμπεριλάβετε αυτή τη ρύθμιση, ο κατάλογος target/deploy δεν θα δημιουργηθεί όταν κάνετε build το πρόγραμμα.

Το αρχείο σας Cargo.toml θα πρέπει να μοιάζει με το ακόλουθο:

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 για την εκτύπωση ενός μηνύματος στο αρχείο καταγραφής του προγράμματος.

src/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(())
}

Κάντε build το πρόγραμμα

Στη συνέχεια, κάντε build το πρόγραμμα χρησιμοποιώντας την εντολή cargo build-sbf.

Terminal
$
cargo build-sbf

Αυτή η εντολή δημιουργεί έναν κατάλογο target/deploy που περιέχει δύο σημαντικά αρχεία:

  1. Ένα αρχείο .so (π.χ., hello_world.so): Αυτό είναι το μεταγλωττισμένο πρόγραμμα Solana που θα αναπτυχθεί στο δίκτυο ως "έξυπνο συμβόλαιο".
  2. Ένα αρχείο keypair (π.χ., hello_world-keypair.json): Το δημόσιο κλειδί αυτού του keypair χρησιμοποιείται ως αναγνωριστικό προγράμματος κατά την ανάπτυξη του προγράμματος.

Για να δείτε το αναγνωριστικό του προγράμματος, εκτελέστε την ακόλουθη εντολή στο τερματικό σας. Αυτή η εντολή εκτυπώνει το δημόσιο κλειδί του keypair στη συγκεκριμένη διαδρομή αρχείου:

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

Παράδειγμα εξόδου:

4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz

Προσθήκη εξαρτήσεων δοκιμών

Στη συνέχεια, δοκιμάστε το πρόγραμμα χρησιμοποιώντας το πακέτο litesvm. Προσθέστε τις ακόλουθες εξαρτήσεις στο Cargo.toml.

Terminal
$
cargo add litesvm --dev
$
cargo add solana-sdk@2.2.0 --dev

Δοκιμή του προγράμματος

Προσθέστε την ακόλουθη δοκιμή στο src/lib.rs, κάτω από τον κώδικα του προγράμματος. Αυτή είναι μια ενότητα δοκιμών που καλεί το πρόγραμμα hello world.

src/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(())
}
#[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 instance
let mut svm = LiteSVM::new();
// Create a keypair for the transaction payer
let payer = Keypair::new();
// Airdrop some lamports to the payer
svm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap();
// Load our program
let 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 data
let instruction = Instruction {
program_id,
accounts: vec![],
data: vec![],
};
// Create transaction
let message = Message::new(&[instruction], Some(&payer.pubkey()));
let transaction = Transaction::new(&[&payer], message, svm.latest_blockhash());
// Send transaction and verify it succeeds
let result = svm.send_transaction(transaction);
assert!(result.is_ok(), "Transaction should succeed");
let logs = result.unwrap().logs;
println!("Logs: {logs:#?}");
}
}

Εκτελέστε τη δοκιμή χρησιμοποιώντας την εντολή cargo test. Το αρχείο καταγραφής του προγράμματος θα εμφανίσει "Hello, world!".

Terminal
$
cargo test -- --no-capture

Παράδειγμα εξόδου:

Terminal
running 1 test
Logs: [
"Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk invoke [1]",
"Program log: Hello, world!",
"Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk consumed 211 of 200000 compute units",
"Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk success",
]
test test::test_hello_world ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s

Ανάπτυξη του προγράμματος

Στη συνέχεια, αναπτύξτε το πρόγραμμα. Κατά την τοπική ανάπτυξη, μπορούμε να χρησιμοποιήσουμε το solana-test-validator.

Πρώτα, ρυθμίστε το Solana CLI ώστε να χρησιμοποιεί το τοπικό σύμπλεγμα Solana.

Terminal
$
solana config set -ul

Παράδειγμα εξόδου:

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

Ανοίξτε ένα νέο τερματικό και εκτελέστε την εντολή solana-test-validators για να ξεκινήσετε τον τοπικό validator.

Terminal
$
solana-test-validator

Ενώ ο validator δοκιμών εκτελείται, εκτελέστε την εντολή solana program deploy σε ξεχωριστό τερματικό για να αναπτύξετε το πρόγραμμα στον τοπικό validator.

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

Παράδειγμα εξόδου:

Program Id: 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz
Signature:
5osMiNMiDZGM7L1e2tPHxU8wdB8gwG8fDnXLg5G7SbhwFz4dHshYgAijk4wSQL5cXiu8z1MMou5kLadAQuHp7ybH

Μπορείτε να επιθεωρήσετε το αναγνωριστικό προγράμματος και την υπογραφή συναλλαγής στον Solana Explorer.

Σημειώστε ότι το cluster στον Solana Explorer πρέπει επίσης να είναι localhost. Η επιλογή "Custom RPC URL" στον Solana Explorer έχει προεπιλεγμένη τιμή http://localhost:8899.

Δημιουργία παραδείγματος πελάτη

Στη συνέχεια, θα δείξουμε πώς να καλέσετε το πρόγραμμα χρησιμοποιώντας έναν πελάτη Rust.

Πρώτα δημιουργήστε έναν κατάλογο examples και ένα αρχείο client.rs.

Terminal
$
mkdir -p examples && touch examples/client.rs

Προσθέστε τα παρακάτω στο Cargo.toml.

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

Προσθέστε τις εξαρτήσεις solana-client και tokio.

Terminal
$
cargo add solana-client@2.2.0 --dev
$
cargo add tokio --dev

Προσθήκη του πελάτη

Προσθέστε τον παρακάτω κώδικα στο examples/client.rs. Αυτό είναι ένα script πελάτη Rust που χρηματοδοτεί ένα νέο keypair για να πληρώσει τα τέλη συναλλαγής και στη συνέχεια καλεί το πρόγραμμα hello world.

examples/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://localhost: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),
}
}

Αντικατάσταση του αναγνωριστικού προγράμματος

Πριν εκτελέσετε τον κώδικα του πελάτη, αντικαταστήστε το αναγνωριστικό προγράμματος στο απόσπασμα κώδικα με αυτό του προγράμματός σας.

Μπορείτε να πάρετε το αναγνωριστικό του προγράμματός σας εκτελώντας την παρακάτω εντολή.

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

Κλήση του προγράμματος

Εκτελέστε το script του πελάτη με την παρακάτω εντολή.

Terminal
$
cargo run --example client

Παράδειγμα εξόδου:

Transaction Signature: 54TWxKi3Jsi3UTeZbhLGUFX6JQH7TspRJjRRFZ8NFnwG5BXM9udxiX77bAACjKAS9fGnVeEazrXL4SfKrW7xZFYV

Μπορείτε να επιθεωρήσετε την υπογραφή της συναλλαγής στον Solana Explorer (τοπικό cluster) για να δείτε το "Hello, world!" στο αρχείο καταγραφής του προγράμματος.

Ενημέρωση του προγράμματος

Τα προγράμματα Solana μπορούν να ενημερωθούν με επανατοποθέτηση στο ίδιο αναγνωριστικό προγράμματος. Ενημερώστε το πρόγραμμα στο src/lib.rs ώστε να εμφανίζει "Hello, Solana!" αντί για "Hello, world!".

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

Εκτελέστε την εντολή cargo build-sbf για να δημιουργήσετε ένα ενημερωμένο αρχείο .so.

Terminal
$
cargo build-sbf

Δοκιμάστε το ενημερωμένο πρόγραμμα εκτελώντας την εντολή cargo test.

Terminal
$
cargo test -- --no-capture

Θα πρέπει να δείτε το "Hello, Solana!" στο αρχείο καταγραφής του προγράμματος.

Terminal
running 1 test
Logs: [
"Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV invoke [1]",
"Program log: Hello, Solana!",
"Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV consumed 211 of 200000 compute units",
"Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV success",
]
test test::test_hello_world ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s

Επανατοποθέτηση του προγράμματος

Επανατοποθετήστε το πρόγραμμα χρησιμοποιώντας την ίδια εντολή solana program deploy.

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

Εκτελέστε ξανά τον κώδικα πελάτη και επιθεωρήστε την υπογραφή της συναλλαγής στον Solana Explorer για να δείτε το "Hello, Solana!" στο αρχείο καταγραφής του προγράμματος.

Terminal
$
cargo run --example client

Κλείσιμο του προγράμματος

Μπορείτε να κλείσετε το πρόγραμμα Solana για να ανακτήσετε το SOL που έχει διατεθεί στον λογαριασμό. Το κλείσιμο ενός προγράμματος είναι μη αναστρέψιμο, οπότε θα πρέπει να γίνεται με προσοχή.

Για να κλείσετε ένα πρόγραμμα, χρησιμοποιήστε την εντολή solana program close <PROGRAM_ID>. Για παράδειγμα:

Terminal
$
solana program close 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz --bypass-warning

Παράδειγμα εξόδου:

Closed Program Id 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz, 0.1350588 SOL
reclaimed

Σημειώστε ότι μόλις ένα πρόγραμμα κλείσει, το αναγνωριστικό του προγράμματος δεν μπορεί να επαναχρησιμοποιηθεί. Η προσπάθεια ανάπτυξης ενός προγράμματος με ένα προηγουμένως κλεισμένο αναγνωριστικό προγράμματος θα οδηγήσει σε σφάλμα.

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

Επανατοποθέτηση ενός κλεισμένου προγράμματος

Εάν χρειάζεται να επανατοποθετήσετε ένα πρόγραμμα με τον ίδιο πηγαίο κώδικα μετά το κλείσιμο ενός προγράμματος, πρέπει να δημιουργήσετε ένα νέο αναγνωριστικό προγράμματος. Για να δημιουργήσετε ένα νέο keypair για το πρόγραμμα, εκτελέστε την ακόλουθη εντολή:

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

Εναλλακτικά, μπορείτε να διαγράψετε το υπάρχον αρχείο keypair (π.χ. ./target/deploy/hello_world-keypair.json) και να εκτελέσετε ξανά το cargo build-sbf, το οποίο θα δημιουργήσει ένα νέο αρχείο keypair.

Δημιουργία νέου προγράμματος

Πρώτα, δημιουργήστε ένα νέο project Rust χρησιμοποιώντας την τυπική εντολή cargo new με τη σημαία --lib.

Terminal
$
cargo new hello_world --lib

Μεταβείτε στον κατάλογο του project. Θα πρέπει να δείτε τα προεπιλεγμένα αρχεία src/lib.rs και Cargo.toml

Terminal
$
cd hello_world

Ενημερώστε το πεδίο edition στο Cargo.toml σε 2021. Διαφορετικά, μπορεί να αντιμετωπίσετε σφάλμα κατά την κατασκευή του προγράμματος.

Προσθέστε την εξάρτηση solana-program

Στη συνέχεια, προσθέστε την εξάρτηση solana-program. Αυτή είναι η ελάχιστη εξάρτηση που απαιτείται για τη δημιουργία ενός προγράμματος Solana.

Terminal
$
cargo add solana-program@2.2.0

Προσθέστε το crate-type

Στη συνέχεια, προσθέστε το ακόλουθο απόσπασμα στο Cargo.toml.

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

Αν δεν συμπεριλάβετε αυτή τη ρύθμιση, ο κατάλογος target/deploy δεν θα δημιουργηθεί όταν κάνετε build το πρόγραμμα.

Προσθέστε τον κώδικα του προγράμματος

Στη συνέχεια, αντικαταστήστε τα περιεχόμενα του src/lib.rs με τον ακόλουθο κώδικα. Αυτό είναι ένα ελάχιστο πρόγραμμα Solana που εκτυπώνει "Hello, world!" στο αρχείο καταγραφής του προγράμματος όταν γίνεται επίκληση του προγράμματος.

Η μακροεντολή msg! χρησιμοποιείται στα προγράμματα Solana για την εκτύπωση ενός μηνύματος στο αρχείο καταγραφής του προγράμματος.

Κάντε build το πρόγραμμα

Στη συνέχεια, κάντε build το πρόγραμμα χρησιμοποιώντας την εντολή cargo build-sbf.

Terminal
$
cargo build-sbf

Αυτή η εντολή δημιουργεί έναν κατάλογο target/deploy που περιέχει δύο σημαντικά αρχεία:

  1. Ένα αρχείο .so (π.χ., hello_world.so): Αυτό είναι το μεταγλωττισμένο πρόγραμμα Solana που θα αναπτυχθεί στο δίκτυο ως "έξυπνο συμβόλαιο".
  2. Ένα αρχείο keypair (π.χ., hello_world-keypair.json): Το δημόσιο κλειδί αυτού του keypair χρησιμοποιείται ως αναγνωριστικό προγράμματος κατά την ανάπτυξη του προγράμματος.

Για να δείτε το αναγνωριστικό του προγράμματος, εκτελέστε την ακόλουθη εντολή στο τερματικό σας. Αυτή η εντολή εκτυπώνει το δημόσιο κλειδί του keypair στη συγκεκριμένη διαδρομή αρχείου:

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

Παράδειγμα εξόδου:

4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz

Προσθήκη εξαρτήσεων δοκιμών

Στη συνέχεια, δοκιμάστε το πρόγραμμα χρησιμοποιώντας το πακέτο litesvm. Προσθέστε τις ακόλουθες εξαρτήσεις στο Cargo.toml.

Terminal
$
cargo add litesvm --dev
$
cargo add solana-sdk@2.2.0 --dev

Δοκιμή του προγράμματος

Προσθέστε την ακόλουθη δοκιμή στο src/lib.rs, κάτω από τον κώδικα του προγράμματος. Αυτή είναι μια ενότητα δοκιμών που καλεί το πρόγραμμα hello world.

Εκτελέστε τη δοκιμή χρησιμοποιώντας την εντολή cargo test. Το αρχείο καταγραφής του προγράμματος θα εμφανίσει "Hello, world!".

Terminal
$
cargo test -- --no-capture

Παράδειγμα εξόδου:

Terminal
running 1 test
Logs: [
"Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk invoke [1]",
"Program log: Hello, world!",
"Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk consumed 211 of 200000 compute units",
"Program 9528phXNvdWp5kkR4rgpoeZvR8ZWT5THVywK95YRprkk success",
]
test test::test_hello_world ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s

Ανάπτυξη του προγράμματος

Στη συνέχεια, αναπτύξτε το πρόγραμμα. Κατά την τοπική ανάπτυξη, μπορούμε να χρησιμοποιήσουμε το solana-test-validator.

Πρώτα, ρυθμίστε το Solana CLI ώστε να χρησιμοποιεί το τοπικό σύμπλεγμα Solana.

Terminal
$
solana config set -ul

Παράδειγμα εξόδου:

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

Ανοίξτε ένα νέο τερματικό και εκτελέστε την εντολή solana-test-validators για να ξεκινήσετε τον τοπικό validator.

Terminal
$
solana-test-validator

Ενώ ο validator δοκιμών εκτελείται, εκτελέστε την εντολή solana program deploy σε ξεχωριστό τερματικό για να αναπτύξετε το πρόγραμμα στον τοπικό validator.

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

Παράδειγμα εξόδου:

Program Id: 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz
Signature:
5osMiNMiDZGM7L1e2tPHxU8wdB8gwG8fDnXLg5G7SbhwFz4dHshYgAijk4wSQL5cXiu8z1MMou5kLadAQuHp7ybH

Μπορείτε να επιθεωρήσετε το αναγνωριστικό προγράμματος και την υπογραφή συναλλαγής στον Solana Explorer.

Σημειώστε ότι το cluster στον Solana Explorer πρέπει επίσης να είναι localhost. Η επιλογή "Custom RPC URL" στον Solana Explorer έχει προεπιλεγμένη τιμή http://localhost:8899.

Δημιουργία παραδείγματος πελάτη

Στη συνέχεια, θα δείξουμε πώς να καλέσετε το πρόγραμμα χρησιμοποιώντας έναν πελάτη Rust.

Πρώτα δημιουργήστε έναν κατάλογο examples και ένα αρχείο client.rs.

Terminal
$
mkdir -p examples && touch examples/client.rs

Προσθέστε τα παρακάτω στο Cargo.toml.

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

Προσθέστε τις εξαρτήσεις solana-client και tokio.

Terminal
$
cargo add solana-client@2.2.0 --dev
$
cargo add tokio --dev

Προσθήκη του πελάτη

Προσθέστε τον παρακάτω κώδικα στο examples/client.rs. Αυτό είναι ένα script πελάτη Rust που χρηματοδοτεί ένα νέο keypair για να πληρώσει τα τέλη συναλλαγής και στη συνέχεια καλεί το πρόγραμμα hello world.

Αντικατάσταση του αναγνωριστικού προγράμματος

Πριν εκτελέσετε τον κώδικα του πελάτη, αντικαταστήστε το αναγνωριστικό προγράμματος στο απόσπασμα κώδικα με αυτό του προγράμματός σας.

Μπορείτε να πάρετε το αναγνωριστικό του προγράμματός σας εκτελώντας την παρακάτω εντολή.

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

Κλήση του προγράμματος

Εκτελέστε το script του πελάτη με την παρακάτω εντολή.

Terminal
$
cargo run --example client

Παράδειγμα εξόδου:

Transaction Signature: 54TWxKi3Jsi3UTeZbhLGUFX6JQH7TspRJjRRFZ8NFnwG5BXM9udxiX77bAACjKAS9fGnVeEazrXL4SfKrW7xZFYV

Μπορείτε να επιθεωρήσετε την υπογραφή της συναλλαγής στον Solana Explorer (τοπικό cluster) για να δείτε το "Hello, world!" στο αρχείο καταγραφής του προγράμματος.

Ενημέρωση του προγράμματος

Τα προγράμματα Solana μπορούν να ενημερωθούν με επανατοποθέτηση στο ίδιο αναγνωριστικό προγράμματος. Ενημερώστε το πρόγραμμα στο src/lib.rs ώστε να εμφανίζει "Hello, Solana!" αντί για "Hello, world!".

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

Εκτελέστε την εντολή cargo build-sbf για να δημιουργήσετε ένα ενημερωμένο αρχείο .so.

Terminal
$
cargo build-sbf

Δοκιμάστε το ενημερωμένο πρόγραμμα εκτελώντας την εντολή cargo test.

Terminal
$
cargo test -- --no-capture

Θα πρέπει να δείτε το "Hello, Solana!" στο αρχείο καταγραφής του προγράμματος.

Terminal
running 1 test
Logs: [
"Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV invoke [1]",
"Program log: Hello, Solana!",
"Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV consumed 211 of 200000 compute units",
"Program 5y8bHrnwfq2dLDgLn3WoTHb9dDuyorj9gyapW6aeyrpV success",
]
test test::test_hello_world ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s

Επανατοποθέτηση του προγράμματος

Επανατοποθετήστε το πρόγραμμα χρησιμοποιώντας την ίδια εντολή solana program deploy.

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

Εκτελέστε ξανά τον κώδικα πελάτη και επιθεωρήστε την υπογραφή της συναλλαγής στον Solana Explorer για να δείτε το "Hello, Solana!" στο αρχείο καταγραφής του προγράμματος.

Terminal
$
cargo run --example client

Κλείσιμο του προγράμματος

Μπορείτε να κλείσετε το πρόγραμμα Solana για να ανακτήσετε το SOL που έχει διατεθεί στον λογαριασμό. Το κλείσιμο ενός προγράμματος είναι μη αναστρέψιμο, οπότε θα πρέπει να γίνεται με προσοχή.

Για να κλείσετε ένα πρόγραμμα, χρησιμοποιήστε την εντολή solana program close <PROGRAM_ID>. Για παράδειγμα:

Terminal
$
solana program close 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz --bypass-warning

Παράδειγμα εξόδου:

Closed Program Id 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz, 0.1350588 SOL
reclaimed

Σημειώστε ότι μόλις ένα πρόγραμμα κλείσει, το αναγνωριστικό του προγράμματος δεν μπορεί να επαναχρησιμοποιηθεί. Η προσπάθεια ανάπτυξης ενός προγράμματος με ένα προηγουμένως κλεισμένο αναγνωριστικό προγράμματος θα οδηγήσει σε σφάλμα.

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

Επανατοποθέτηση ενός κλεισμένου προγράμματος

Εάν χρειάζεται να επανατοποθετήσετε ένα πρόγραμμα με τον ίδιο πηγαίο κώδικα μετά το κλείσιμο ενός προγράμματος, πρέπει να δημιουργήσετε ένα νέο αναγνωριστικό προγράμματος. Για να δημιουργήσετε ένα νέο keypair για το πρόγραμμα, εκτελέστε την ακόλουθη εντολή:

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

Εναλλακτικά, μπορείτε να διαγράψετε το υπάρχον αρχείο keypair (π.χ. ./target/deploy/hello_world-keypair.json) και να εκτελέσετε ξανά το cargo build-sbf, το οποίο θα δημιουργήσει ένα νέο αρχείο keypair.

lib.rs
Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
[dependencies]

Is this page helpful?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας