Solana programları öncelikle Rust programlama dili kullanılarak geliştirilir. Bu sayfa, Anchor çerçevesini kullanmadan Rust ile Solana programları yazmaya odaklanır, bu yaklaşım genellikle "native Rust" programları yazma olarak adlandırılır.
Native Rust geliştirme, geliştiricilere Solana programları üzerinde doğrudan kontrol sağlar. Ancak, bu yaklaşım Anchor çerçevesini kullanmaya kıyasla daha fazla manuel kurulum ve şablon kod gerektirir. Bu yöntem şu özelliklere sahip geliştiriciler için önerilir:
- Program mantığı ve optimizasyonlar üzerinde ayrıntılı kontrol isteyenler
- Daha üst düzey çerçevelere geçmeden önce altta yatan kavramları öğrenmek isteyenler
Yeni başlayanlar için Anchor çerçevesi ile başlamanızı öneririz. Daha fazla bilgi için Anchor bölümüne bakın.
Ön Koşullar
Ayrıntılı kurulum talimatları için kurulum sayfasını ziyaret edin.
Başlamadan önce, aşağıdakilerin kurulu olduğundan emin olun:
- Rust: Solana programları oluşturmak için programlama dili.
- Solana CLI: Solana geliştirme için komut satırı aracı.
Başlarken
Aşağıdaki örnek, Rust ile yazılmış ilk Solana programınızı oluşturmak için temel adımları kapsar. Program günlüğüne "Hello, world!" yazdıran minimal bir program oluşturacağız.
Yeni bir program oluşturma
İlk olarak, --lib bayrağı ile standart cargo new komutunu kullanarak yeni
bir Rust projesi oluşturun.
$cargo new hello_world --lib
Proje dizinine gidin. Varsayılan src/lib.rs ve Cargo.toml dosyalarını
görmelisiniz
$cd hello_world
Cargo.toml dosyasındaki edition alanını 2021 olarak güncelleyin. Aksi
takdirde, programı derlerken bir hatayla karşılaşabilirsiniz.
Solana-program bağımlılığını ekleyin
Ardından, solana-program bağımlılığını ekleyin. Bu, bir Solana programı
oluşturmak için gereken minimum bağımlılıktır.
$cargo add solana-program@2.2.0
Crate-type ekleyin
Ardından, aşağıdaki kod parçasını Cargo.toml dosyasına ekleyin.
[lib]crate-type = ["cdylib", "lib"]
Bu yapılandırmayı eklemezseniz, programı derlediğinizde target/deploy dizini
oluşturulmayacaktır.
Cargo.toml dosyanız aşağıdaki gibi görünmelidir:
[package]name = "hello_world"version = "0.1.0"edition = "2021"[lib]crate-type = ["cdylib", "lib"][dependencies]solana-program = "2.2.0"
Program kodunu ekleyin
Ardından, src/lib.rs dosyasının içeriğini aşağıdaki kodla değiştirin. Bu,
program çağrıldığında program günlüğüne "Hello, world!" yazdıran minimal bir
Solana programıdır.
msg! makrosu, Solana programlarında program günlüğüne bir mesaj yazdırmak için
kullanılır.
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(())}
Programı derleyin
Ardından, cargo build-sbf komutunu kullanarak programı derleyin.
$cargo build-sbf
Bu komut, iki önemli dosya içeren bir target/deploy dizini oluşturur:
- Bir
.sodosyası (örn.hello_world.so): Bu, ağa "akıllı sözleşme" olarak dağıtılacak derlenmiş Solana programıdır. - Bir keypair dosyası (örn.
hello_world-keypair.json): Bu keypair'in açık anahtarı, program dağıtılırken program kimliği olarak kullanılır.
Program kimliğini görüntülemek için terminalinizde aşağıdaki komutu çalıştırın. Bu komut, belirtilen dosya yolundaki keypair'in açık anahtarını yazdırır:
$solana address -k ./target/deploy/hello_world-keypair.json
Örnek çıktı:
4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz
Test bağımlılıklarını ekle
Ardından, litesvm crate'ini kullanarak programı test edin. Aşağıdaki
bağımlılıkları Cargo.toml dosyasına ekleyin.
$cargo add litesvm@0.6.1 --dev$cargo add solana-sdk@2.2.0 --dev
Programı test et
Aşağıdaki testi src/lib.rs dosyasına, program kodunun altına ekleyin. Bu,
hello world programını çağıran bir test modülüdür.
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:#?}");}}
Testi cargo test komutuyla çalıştırın. Program günlüğü "Hello, world!"
mesajını gösterecektir.
$cargo test -- --no-capture
Örnek çıktı:
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
Programı dağıt
Ardından, programı deploy edin. Yerel olarak geliştirme yaparken,
solana-test-validator kullanabiliriz.
Öncelikle, Solana CLI'yi yerel Solana kümesini kullanacak şekilde yapılandırın.
$solana config set -ul
Örnek çıktı:
Config File: /.config/solana/cli/config.ymlRPC URL: http://localhost:8899WebSocket URL: ws://localhost:8900/ (computed)Keypair Path: /.config/solana/id.jsonCommitment: confirmed
Yeni bir terminal açın ve yerel validator'ı başlatmak için
solana-test-validators komutunu çalıştırın.
$solana-test-validator
Test validator çalışırken, programı yerel validator'a deploy etmek için ayrı bir
terminalde solana program deploy komutunu çalıştırın.
$solana program deploy ./target/deploy/hello_world.so
Örnek çıktı:
Program Id: 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMzSignature:5osMiNMiDZGM7L1e2tPHxU8wdB8gwG8fDnXLg5G7SbhwFz4dHshYgAijk4wSQL5cXiu8z1MMou5kLadAQuHp7ybH
Program ID'sini ve işlem imzasını Solana Explorer üzerinde inceleyebilirsiniz.
Solana Explorer'daki cluster'ın da localhost olması gerektiğini unutmayın.
Solana Explorer'daki "Custom RPC URL" seçeneği varsayılan olarak
http://localhost:8899 değerindedir.
Örnek istemci oluşturma
Şimdi, bir Rust istemcisi kullanarak programı nasıl çağıracağımızı göstereceğiz.
Önce bir examples dizini ve bir client.rs dosyası oluşturun.
$mkdir -p examples && touch examples/client.rs
Aşağıdakileri Cargo.toml dosyasına ekleyin.
[[example]]name = "client"path = "examples/client.rs"
solana-client ve tokio bağımlılıklarını ekleyin.
$cargo add solana-client@2.2.0 --dev$cargo add tokio --dev
İstemciyi ekleme
examples/client.rs dosyasına aşağıdaki kodu ekleyin. Bu, işlem ücretlerini
ödemek için yeni bir keypair'e fon aktaran ve ardından hello world programını
çağıran bir Rust istemci betiğidir.
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),}}
Program ID'sini değiştirme
İstemci kodunu çalıştırmadan önce, kod parçasındaki program ID'sini kendi programınızın ID'si ile değiştirin.
Program ID'nizi aşağıdaki komutu çalıştırarak alabilirsiniz.
$solana address -k ./target/deploy/hello_world-keypair.json
Programı çağırma
İstemci komut dosyasını aşağıdaki komutla çalıştırın.
$cargo run --example client
Örnek çıktı:
Transaction Signature: 54TWxKi3Jsi3UTeZbhLGUFX6JQH7TspRJjRRFZ8NFnwG5BXM9udxiX77bAACjKAS9fGnVeEazrXL4SfKrW7xZFYV
İşlem imzasını Solana Explorer üzerinde (yerel küme) inceleyerek program günlüğünde "Hello, world!" yazısını görebilirsiniz.
Programı güncelle
Solana programları aynı program ID'sine yeniden dağıtılarak güncellenebilir.
src/lib.rs içindeki programı "Hello, world!" yerine "Hello, Solana!"
yazdıracak şekilde güncelleyin.
pub fn process_instruction(_program_id: &Pubkey,_accounts: &[AccountInfo],_instruction_data: &[u8],) -> ProgramResult {-msg!("Hello, world!");+msg!("Hello, Solana!");Ok(())}
Güncellenmiş bir .so dosyası oluşturmak için cargo build-sbf komutunu
çalıştırın.
$cargo build-sbf
Güncellenmiş programı cargo test komutunu çalıştırarak test edin.
$cargo test -- --no-capture
Program günlüğünde "Hello, Solana!" yazısını görmelisiniz.
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
Programı yeniden dağıt
Programı aynı solana program deploy komutunu kullanarak yeniden dağıtın.
$solana program deploy ./target/deploy/hello_world.so
İstemci kodunu tekrar çalıştırın ve Solana Explorer'da işlem imzasını inceleyerek program günlüğünde "Hello, Solana!" yazısını görün.
$cargo run --example client
Programı kapat
Hesaba tahsis edilen SOL'u geri almak için Solana programınızı kapatabilirsiniz. Bir programı kapatmak geri alınamaz, bu nedenle dikkatle yapılmalıdır.
Bir programı kapatmak için solana program close <PROGRAM_ID> komutunu
kullanın. Örneğin:
$solana program close 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz --bypass-warning
Örnek çıktı:
Closed Program Id 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz, 0.1350588 SOLreclaimed
Program kapatıldıktan sonra, program kimliğinin yeniden kullanılamayacağını unutmayın. Daha önce kapatılmış bir program kimliği ile program dağıtmaya çalışmak hata ile sonuçlanacaktır.
Error: Program 4Ujf5fXfLx2PAwRqcECCLtgDxHKPznoJpa43jUBxFfMz has been closed, usea new Program Id
Kapatılmış bir programı yeniden dağıtma
Bir programı kapattıktan sonra aynı kaynak koduyla yeniden dağıtmanız gerekiyorsa, yeni bir program kimliği oluşturmalısınız. Program için yeni bir keypair oluşturmak için aşağıdaki komutu çalıştırın:
$solana-keygen new -o ./target/deploy/hello_world-keypair.json --force
Alternatif olarak, mevcut keypair dosyasını (örneğin
./target/deploy/hello_world-keypair.json) silebilir ve cargo build-sbf
komutunu tekrar çalıştırabilirsiniz, bu yeni bir keypair dosyası
oluşturacaktır.
Is this page helpful?