SDK, yerel yapı dosyalarından tek bir çağrıyla program dağıtabilir. İki farklı yöntem mevcuttur: geleneksel yollarla Anchor/Agave çalışma alanları için otomatik keşif ve baytların nereden geleceğini kontrol etmek istediğinizde açık dağıtım.
Her iki yöntem de programı IDL'de belirtilen adreste (veya keypair dosyasının
public key'inde) kaydeder ve IDL mevcutsa, RPC istemcilerinin hesap verilerini
çözümleyebilmesi için surfnet_registerIdl aracılığıyla çalışma zamanına
kaydeder.
Bir Anchor Çalışma Alanını Otomatik Keşfet
deployProgram / deploy_program program adını alır ve şu dosyaları mevcut
çalışma dizinine göre arar:
| Dosya | Amaç |
|---|---|
target/deploy/{name}.so | Derlenmiş program bayt kodu (gerekli) |
target/deploy/{name}-keypair.json | Program keypair — public key, program kimliği olur (gerekli) |
target/idl/{name}.json | Anchor IDL JSON (isteğe bağlı; mevcutsa kaydedilir) |
use surfpool_sdk::Surfnet;let surfnet = Surfnet::start().await?;let cheats = surfnet.cheatcodes();let program_id = cheats.deploy_program("my_program")?;println!("deployed at {program_id}");
Dağıtmadan önce derleyin
deployProgram'i çağırmadan önce anchor build (veya cargo build-sbf)
komutunu çalıştırın; böylece .so ve keypair dosyaları gerçekten diskte
mevcut olur. SDK derlemeyi sizin adınıza başlatmaz.
Açık Dağıtım
Dosyalar standart dışı bir yerde bulunduğunda — bir CI yapı dosyası, önceden hazırlanmış bir test verisi, gömülü bir bayt dilimi — açık bir dağıtım yapılandırması belirtin.
use surfpool_sdk::cheatcodes::builders::DeployProgram;use surfpool_sdk::Surfnet;let cheats = Surfnet::start().await?.cheatcodes();// Derive the program ID from a keypair file.let program_id = cheats.deploy(DeployProgram::from_keypair_path("fixtures/my_program-keypair.json")?.so_path("fixtures/my_program.so").idl_path("fixtures/my_program.idl.json"),)?;
Ham Baytlardan Dağıtım
Bayt kodu zaten bellekteyken — bir derleme adımıyla üretilmiş, bir yapı
deposundan indirilmiş veya include_bytes! aracılığıyla gömülmüş — dosya
sistemini tamamen atlayın.
use surfpool_sdk::cheatcodes::builders::DeployProgram;use surfpool_sdk::{Pubkey, Surfnet};const PROGRAM_BYTES: &[u8] = include_bytes!("../fixtures/my_program.so");let cheats = Surfnet::start().await?.cheatcodes();let program_id: Pubkey = "DemoProgram111111111111111111111111111111111".parse()?;cheats.deploy(DeployProgram::new(program_id).so_bytes(PROGRAM_BYTES.to_vec()),)?;
DeployProgram Builder Referansı (Rust)
| Yapıcı / ayarlayıcı | İmza | Amaç |
|---|---|---|
DeployProgram::new | (program_id: Pubkey) -> Self | Bilinen bir program ID'si için dağıtım oluşturur. |
DeployProgram::from_keypair_path | (path: impl AsRef<Path>) -> SurfnetResult<Self> | Bir Solana keypair dosyası okur; public key program ID'si olur. |
.so_path | (path: impl Into<PathBuf>) | Diskteki derlenmiş .so dosyasının yolu. |
.so_bytes | (bytes: Vec<u8>) | Ham program baytları (so_path ile birbirini dışlar). |
.idl_path | (path: impl Into<PathBuf>) | Dağıtımdan sonra kaydedilecek isteğe bağlı Anchor IDL JSON'u. |
DeployOptions Tür Referansı (JS)
type ByteArrayLike = Uint8Array | number[];interface DeployOptions {programId: string; // base58 address to deploy atsoPath?: string; // path to .so on disksoBytes?: ByteArrayLike; // or raw bytes in memoryidlPath?: string; // optional Anchor IDL JSON}
soPath ve soBytes birbirini dışlar — yalnızca birini sağlayın.
Nelerin Kaydedildiği
Başarılı bir dağıtımın ardından çalışma zamanı üç işlem yapar:
- program account'u yazar
programIdadresine.sobaytlarınısurfnet_writeProgramaracılığıyla. - Hesabı çalıştırılabilir olarak işaretler, böylece normal RPC çağrıları aracılığıyla çağrılabilir.
- IDL'yi kaydeder (sağlanmışsa)
surfnet_registerIdlaracılığıyla; bu, RPC istemcilerinin program'ın IDL şemasını kullanarak hesap verilerini çözmesine olanak tanır.
Nadir: çalıştırılamaz program account
Program baytlarını bir hesaba yazmak ancak çalıştırılamaz tutmak istiyorsanız,
deploy yerine doğrudan SetAccount kullanın. deploy yolu her zaman hesabı
çalıştırılabilir olarak işaretler.
Hatalar
| Neden | Belirti |
|---|---|
.so dosyası eksik veya okunamıyor | SurfnetError::Cheatcode("...failed to read...") veya JS hatası fırlatılır |
| Program ID keypair dosyasıyla eşleşmiyor | SurfnetError::Cheatcode("...mismatched program id...") |
| IDL JSON hatalı biçimlendirilmiş | SurfnetError::Cheatcode("...invalid IDL...") |
| Surfnet çevrimdışı ve program account zaten yukarı akışta mevcut | Dağıtım yine de başarılı olur; yerel kopya yukarı akış sürümünü geçersiz kılar |
Is this page helpful?