> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Apex Rust İstemcisi

> apex-sender-client, OrbitFlare Apex için Rust crate'idir: 0-RTT ile yeniden bağlanan kalıcı bir QUIC bağlantısı, ayrıca JSON-RPC ve toplu gönderimler için HTTP yardımcıları.

`apex-sender-client`, Apex için referans istemcidir. Apex uç noktası başına tek bir kalıcı QUIC bağlantısı tutar, API anahtarınızdan türetilen bir istemci sertifikasıyla kimlik doğrular, akış başına bir serileştirilmiş işlem gönderir ve bağlantı koptuğunda 0-RTT ile yeniden bağlanır.

## Kurulum

Crate, `apex-sender-client` adıyla **crates.io'ya geliyor**. Yayınlanana kadar OrbitFlare GitHub deposundan kurun:

```toml theme={null}
[dependencies]
apex-sender-client = { git = "https://github.com/orbitflare/apex-sender-client", features = ["rpc"] }
```

crates.io'da yayınlandığında:

```toml theme={null}
[dependencies]
apex-sender-client = { version = "0.1", features = ["rpc"] }
```

`rpc` özelliği HTTP yardımcılarını ekler: `getTipAccounts`, JSON-RPC `sendTransaction`, ikili rotalar ve herhangi bir Solana RPC için bir blockhash ve onay yardımcısı. QUIC yolunun tek başına HTTP bağımlılığı yoktur, dolayısıyla yalnızca QUIC'e ihtiyacınız varsa özelliği kapalı bırakın.

Crate, Rust 1.92 veya daha yenisini gerektirir.

## Hızlı Başlangıç

```rust theme={null}
use std::time::Duration;

use apex_sender_client::rpc::{RpcClient, SolanaRpc};
use apex_sender_client::{tip, tip_instruction, ApexSenderClient, Region, MIN_TIP_LAMPORTS};
use solana_signer::Signer;
use solana_transaction::versioned::VersionedTransaction;
use solana_transaction::Transaction;

let client = ApexSenderClient::connect(Region::Frankfurt, &api_key).await?;
let tip_accounts = RpcClient::new(Region::Frankfurt, &api_key).get_tip_accounts().await?;
let tip_account = tip::pick_tip_account(&tip_accounts).ok_or("no tip accounts")?;

// Your instructions, plus the tip as a top-level instruction.
let instructions = [
    your_instruction,
    tip_instruction(&payer.pubkey(), &tip_account, MIN_TIP_LAMPORTS),
];
let solana = SolanaRpc::new(solana_rpc_url);
let blockhash = solana.latest_blockhash().await?;
let tx = VersionedTransaction::from(Transaction::new_signed_with_payer(
    &instructions,
    Some(&payer.pubkey()),
    &[&payer],
    blockhash,
));

let signature = client.send_transaction(&tx).await?; // microseconds, no acknowledgement
let slot = solana.confirm(&signature.to_string(), Duration::from_secs(30)).await?;
```

`Cargo.toml` içeren eksiksiz bir program için [Hızlı başlangıç](/tr/apex/quickstart) sayfasının Rust sekmesine bakın.

## Bölgeler

`Region` her Apex uç noktasını adlandırır. `Region::parse("fra")` ve `Region::code()` kısa kodlarla karşılıklı eşleme yapar, `Region::ALL` ise bunları listeler.

| Varyant                                     | Kod      |
| ------------------------------------------- | -------- |
| `Region::Frankfurt`                         | `fra`    |
| `Region::Amsterdam`                         | `ams`    |
| `Region::London`                            | `lon`    |
| `Region::NewYork`                           | `nyc`    |
| `Region::SaltLakeCity`                      | `slc`    |
| `Region::Singapore`                         | `sgp`    |
| `Region::Tokyo`                             | `tyo`    |
| `Region::Siauliai`                          | `sqq`    |
| `Region::Global` (kademeli olarak açılıyor) | `global` |

`region.quic_endpoint()` `<code>.apex.orbitflare.com:7001` döndürür ve `region.rpc_url()` `http://<code>.apex.orbitflare.com` döndürür. [Uç noktalar ve bölgeler](/tr/apex/endpoints) sayfasına bakın.

## Taşıma Yöntemleri

|                             | QUIC tek yönlü                               | QUIC çift yönlü                                                        | İkili HTTP                                              | JSON-RPC                                 |
| --------------------------- | -------------------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------- |
| **Çağrı**                   | `send_transaction`, `send_transaction_bytes` | `send_transaction_with_response`, `send_with_response`                 | `rpc::RpcClient::send_transaction_binary`, `send_batch` | `rpc::RpcClient::send_transaction`       |
| **Döndürdüğü değer**        | İmza. Geriye hiçbir şey okunmaz              | Kabul edildi veya bir ret kodu ve mesajı                               | İmza veya etiketli bir hata                             | İmza veya bir JSON-RPC hatası            |
| **Gönderim başına maliyet** | Sıcak bir bağlantıda bir akış                | Bir akış ve bir gidiş dönüş                                            | Ham baytlarla bir HTTP isteği                           | JSON içinde base64 ile bir HTTP isteği   |
| **En uygun kullanım**       | Kalıcı bağlantı kullanan botlar              | Entegrasyon, hata ayıklama, nedeni satır içinde görmek isteyen araçlar | Toplu gönderimler                                       | `sendTransaction` koduna doğrudan ekleme |

Taşıma yöntemi önceliği veya yönlendirmeyi değiştirmez. Bunu bahşiş belirler.

## API

| Öğe                                                                               | Açıklama                                                                                                                           |
| --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `ApexSenderClient::connect(region, api_key)`                                      | Geçici bir yerel port ve varsayılan seçeneklerle bağlanır                                                                          |
| `ApexSenderClient::connect_with_options(opts, api_key)`                           | [`ClientOptions`](#seçenekler) ile bağlanır                                                                                        |
| `send_transaction(&tx)`                                                           | Serileştirir (legacy, v0 veya v1) ve tek yönlü bir akışta gönderir. İlk imzayı döndürür                                            |
| `send_transaction_bytes(bytes)`                                                   | Aynısı, elinizde zaten bulunan baytlarla. Hiçbir şey onları yeniden kodlamaz                                                       |
| `send_transaction_with_response(&tx)`                                             | Çift yönlü akış. Ret durumunda `Err(Error::Rejected { code, message })`                                                            |
| `send_with_response(bytes)`                                                       | Aynısı, baytlarla. Ham `Admission` değerini döndürür                                                                               |
| `health()`, `reconnects_total()`, `zero_rtt_resumptions_total()`, `remote_addr()` | Metrikleriniz için bağlantı durumu                                                                                                 |
| `reconnect()`, `close()`                                                          | Yaşam döngüsü                                                                                                                      |
| `tip_instruction(payer, tip_account, lamports)`                                   | Bahşiş transferini oluşturur                                                                                                       |
| `tip::pick_tip_account(&accounts)`                                                | Bahşiş hesaplarından birini rastgele seçer                                                                                         |
| `MIN_TIP_LAMPORTS`                                                                | Standart katman tabanı: 1.000.000 lamport                                                                                          |
| `rpc::RpcClient`                                                                  | HTTP üzerinden Apex uç noktası: `get_tip_accounts`, `send_transaction` (JSON-RPC), `send_transaction_binary`, `send_batch`, `ping` |
| `rpc::SolanaRpc`                                                                  | Herhangi bir Solana RPC: `latest_blockhash`, `confirm(signature, timeout)`                                                         |
| `rpc::fetch_vaults(solana_rpc_url)`                                               | Bahşiş hesaplarını, bir Apex uç noktasını çağırmadan doğrudan zincir üstü bahşiş programından (`rpc::TIP_PROGRAM_ID`) okur         |
| `client_pubkey(api_key)`                                                          | API anahtarınızın türettiği, gösterge panelinizde gösterilen sertifika anahtarı                                                    |
| `serialize_transaction(&tx)`                                                      | Kanonik aktarım baytları. Legacy ve v0 için bincode ile aynıdır, [v1](/tr/apex/transaction-v1) için ise doğrudur                   |
| `wire::encode_packet`, `wire::decode_admission`                                   | Diğer diller için referans olarak QUIC aktarım biçimi                                                                              |

İstemciyi `Clone` ile kopyalamak ucuzdur ve kopyalar tek bir bağlantıyı paylaşır. Onu bir kez oluşturun ve kopyalarını görevlerinize dağıtın.

<Note>
  Crate'te henüz bir paket yardımcısı yoktur. [Paketleri](/tr/apex/bundles) HTTP üzerinden `sendBundle` veya `POST /send-bundle` ile gönderin.
</Note>

## Seçenekler

`ClientOptions`, `Default` uygular, dolayısıyla yalnızca ihtiyacınız olanı ayarlayın:

| Alan                  | Varsayılan           | Açıklama                                                                                                               |
| --------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `endpoint`            | Bölgenin QUIC adresi | QUIC adresinin `host:port` değeri. Bölgeyi geçersiz kılar                                                              |
| `mev_protect`         | `false`              | Shield engelleme listesindeki liderleri atlar. [MEV koruması](/tr/apex/mev-protection) sayfasına bakın                 |
| `max_retries`         | `None`               | İşlem başına yeniden deneme bütçesi. `None`, uç noktanın varsayılanını kullanır                                        |
| `bind_addr`           | Geçici port          | Güvenlik duvarı izin listeleri için yerel UDP bağlama adresi                                                           |
| `connect_timeout`     | 3 sn                 | El sıkışma zaman aşımı                                                                                                 |
| `send_timeout`        | 2 sn                 | Tek bir gönderim için zaman aşımı                                                                                      |
| `keep_alive`          | 1 sn                 | QUIC PING aralığı. Uç noktanın boşta kalma zaman aşımı 30 sn'dir                                                       |
| `auto_reconnect`      | `true`               | Bağlantı gittiği için bir gönderim başarısız olduğunda yeniden bağlanır ve bir kez daha gönderir                       |
| `proactive_reconnect` | `true`               | Bir arka plan görevi, kopma fark edilir edilmez yeniden el sıkışır, böylece bir sonraki gönderim bunun bedelini ödemez |

```rust theme={null}
use std::time::Duration;

use apex_sender_client::{ApexSenderClient, ClientOptions, Region};

let client = ApexSenderClient::connect_with_options(
    ClientOptions {
        endpoint: Some(Region::NewYork.quic_endpoint()),
        bind_addr: Some("0.0.0.0:47001".parse()?),
        mev_protect: true,
        max_retries: Some(30),
        send_timeout: Duration::from_secs(1),
        ..Default::default()
    },
    &api_key,
)
.await?;
```

## Canlı Tutma ve Yeniden Bağlanmalar

Bağlantı, Apex uç noktasındaki 30 saniyelik boşta kalma zaman aşımına karşı her saniye gönderilen bir QUIC PING ile açık kalır. Sıcak bir bağlantıda bir gönderim, bir akış açma ve bir yazmadan ibarettir.

Bağlantı koparsa:

* Bir arka plan görevi bunu fark eder ve hemen yeniden el sıkışır (`proactive_reconnect`), böylece bir sonraki gönderim genellikle canlı bir bağlantı bulur.
* Yeniden bağlanma, önbelleğe alınmış bir oturum bileti kullanır ve bekleyen işlemi el sıkışmanın ilk uçuşunda gönderir (**0-RTT**). Uç nokta erken veriyi reddederse istemci onu el sıkışmadan sonra yeniden gönderir.
* Bağlantı gittiği için başarısız olan bir gönderim yeniden bağlanır ve bir kez yeniden dener (`auto_reconnect`). Bunu kendiniz ele almak için `false` olarak ayarlayın.

`health()`, `reconnects_total()` ve `zero_rtt_resumptions_total()` ne olduğunu gösterir. Bunları metriklerinize aktarın.

## Hatalar

| `Error` varyantı                                                   | Anlamı                                                                                                                       |
| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| `Rejected { code, message }`                                       | Uç nokta, işlemi çift yönlü bir akışta reddetti. [Kabul kodlarına](/tr/apex/errors-and-rate-limits#quic-kabul-kodları) bakın |
| `TooLarge(bytes)`                                                  | 4096 baytın üzerinde. Herhangi bir şey gönderilmeden önce yerel olarak yakalanır                                             |
| `Timeout`                                                          | Bağlanma veya gönderim zaman aşımı doldu                                                                                     |
| `Resolve`, `Bind`, `Tls`, `Connect`, `Connection`, `Write`, `Read` | Taşıma hataları                                                                                                              |
| `Serialize`, `BadAdmission`                                        | Kodlama sorunları                                                                                                            |
| `Closed`                                                           | İstemci kapatıldı                                                                                                            |

HTTP yardımcıları `rpc::RpcError` döndürür: taşıma hataları için `Http`, bir JSON-RPC veya düz HTTP reddi için `Rpc { code, message }` ve `BadResponse`.

## Depodaki Örnekler

Tüm örnekler `APEX_API_KEY`, `KEYPAIR_PATH` (varsayılan `payer.json`), `SOLANA_RPC_URL` ve isteğe bağlı olarak `APEX_REGION`, `APEX_QUIC`, `APEX_RPC`, `TIP_LAMPORTS` ve `APEX_TX_VERSION` (`legacy` veya `v1`) değişkenlerini okur. Her biri bahşişli bir memo gönderir ve bloğa girdiği slotu bildirir.

| Örnek                     | Gösterdiği şey                                                                                     |
| ------------------------- | -------------------------------------------------------------------------------------------------- |
| `quic_send`               | Tek yönlü akış: en hızlı yol, ardından bir Solana RPC'den onay                                     |
| `quic_send_with_response` | Çift yönlü akış: kabul edildi veya reddedildi yanıtı ve bir reddin nasıl okunacağı                 |
| `rpc_send`                | Aynı bahşiş kuralıyla HTTP üzerinden JSON-RPC `sendTransaction`                                    |
| `raw_bytes`               | Ağ üzerinde önceden serileştirilmiş baytlar ve diğer diller için veri paketinin tam yerleşimi      |
| `throughput`              | Tek bir sıcak bağlantı, N eşzamanlı gönderim, gönderim başına p50 ve p99, bloğa giren işlem sayısı |
| `client_pubkey`           | Gösterge panelinizle karşılaştırmak için bir API anahtarının türettiği sertifika anahtarı          |
| `typescript/send_rpc.ts`  | İstemci kütüphanesi olmadan `@solana/web3.js` ile JSON-RPC yolu                                    |
| `python/send.py`          | Python'dan `solders` ile ikili rota ve JSON-RPC                                                    |

```bash theme={null}
APEX_API_KEY=... KEYPAIR_PATH=payer.json SOLANA_RPC_URL=https://... \
  cargo run --release --example quic_send --features rpc
```

Apex uç noktasının yakınındaki bir istemciden, mainnet üzerinde tipik çıktı:

```text theme={null}
sent in 16 us
landed in slot 447831391 after 745 ms: 5gwAmfVM...
```

## İstemcinin Yapmadıkları

* İşlem oluşturmak veya imzalamak ya da öncelik ücretinizi seçmek.
* Simülasyon yapmak veya preflight kontrolleri çalıştırmak. Sizinle lider arasındaki hiçbir şey bunu yapmaz.
