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

Το SDK μπορεί να αναπτύξει ένα πρόγραμμα από τοπικά αρχεία κατασκευής με μία μόνο κλήση. Υπάρχουν δύο παραλλαγές: αυτόματη ανακάλυψη για χώρους εργασίας Anchor/Agave με συμβατικές διαδρομές, και ρητή ανάπτυξη όταν θέλετε να ελέγχετε την προέλευση των bytes.

Και οι δύο παραλλαγές καταχωρούν το πρόγραμμα στη δηλωμένη διεύθυνση του IDL (ή στο δημόσιο κλειδί του αρχείου keypair) και, εφόσον υπάρχει IDL, το καταχωρούν στο runtime μέσω surfnet_registerIdl ώστε οι RPC clients να μπορούν να αποκωδικοποιούν δεδομένα λογαριασμών.

Αυτόματη Ανακάλυψη Χώρου Εργασίας Anchor

deployProgram / deploy_program λαμβάνει το όνομα του προγράμματος και αναζητά αυτά τα αρχεία σχετικά με τον τρέχοντα κατάλογο εργασίας:

ΑρχείοΣκοπός
target/deploy/{name}.soΜεταγλωττισμένος κώδικας bytecode προγράμματος (απαιτείται)
target/deploy/{name}-keypair.jsonkeypair προγράμματος — το δημόσιο κλειδί γίνεται το ID προγράμματος (απαιτείται)
target/idl/{name}.jsonIDL JSON του Anchor (προαιρετικό· καταχωρείται αν υπάρχει)
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}");

Build before you deploy

Εκτελέστε anchor buildcargo build-sbf) πριν καλέσετε deployProgram ώστε τα αρχεία .so και keypair να υπάρχουν πραγματικά στον δίσκο. Το SDK δεν εκτελεί την κατασκευή για εσάς.

Ρητή Ανάπτυξη

Όταν τα αρχεία βρίσκονται σε μη τυπική τοποθεσία — ένα αρχείο CI, μια προκατασκευασμένη δοκιμαστική σταθερά, ένα ενσωματωμένο τμήμα bytes — περάστε μια ρητή διαμόρφωση ανάπτυξης.

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"),
)?;

Ανάπτυξη από Ακατέργαστα Bytes

Όταν ο κώδικας bytecode βρίσκεται ήδη στη μνήμη — δημιουργήθηκε από ένα βήμα κατασκευής, λήφθηκε από αποθετήριο αρχείων ή ενσωματώθηκε μέσω include_bytes! — παραλείψτε εντελώς το σύστημα αρχείων.

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()),
)?;

Αναφορά Builder DeployProgram (Rust)

Κατασκευαστής / setterΥπογραφήΣκοπός
DeployProgram::new(program_id: Pubkey) -> SelfΔημιουργία ανάπτυξης για γνωστό αναγνωριστικό προγράμματος.
DeployProgram::from_keypair_path(path: impl AsRef<Path>) -> SurfnetResult<Self>Ανάγνωση αρχείου keypair του Solana· το δημόσιο κλειδί γίνεται το αναγνωριστικό προγράμματος.
.so_path(path: impl Into<PathBuf>)Διαδρομή προς το μεταγλωττισμένο αντικείμενο .so στο δίσκο.
.so_bytes(bytes: Vec<u8>)Ακατέργαστα bytes προγράμματος (αμοιβαία αποκλειόμενο με so_path).
.idl_path(path: impl Into<PathBuf>)Προαιρετικό Anchor IDL JSON για καταχώριση μετά την ανάπτυξη.

Αναφορά Τύπου DeployOptions (JS)

type ByteArrayLike = Uint8Array | number[];
interface DeployOptions {
programId: string; // base58 address to deploy at
soPath?: string; // path to .so on disk
soBytes?: ByteArrayLike; // or raw bytes in memory
idlPath?: string; // optional Anchor IDL JSON
}

Τα soPath και soBytes είναι αμοιβαία αποκλειόμενα — δώστε ακριβώς ένα από τα δύο.

Τι Καταχωρείται

Μετά από μια επιτυχημένη ανάπτυξη, το περιβάλλον εκτέλεσης κάνει τρία πράγματα:

  1. Εγγράφει το program account στο programId με τα bytes .so μέσω surfnet_writeProgram.
  2. Επισημαίνει τον λογαριασμό ως εκτελέσιμο ώστε να μπορεί να κληθεί μέσω κανονικών κλήσεων RPC.
  3. Καταχωρεί το IDL (εφόσον παρέχεται) μέσω surfnet_registerIdl, το οποίο επιτρέπει στους πελάτες RPC να αποκωδικοποιούν δεδομένα λογαριασμού χρησιμοποιώντας το σχήμα IDL του προγράμματος.

Σπάνιο: μη εκτελέσιμο program account

Εάν θέλετε να εγγράψετε bytes προγράμματος σε έναν λογαριασμό αλλά να τον διατηρήσετε μη εκτελέσιμο, χρησιμοποιήστε απευθείας το SetAccount αντί του deploy. Η διαδρομή deploy επισημαίνει πάντα τον λογαριασμό ως εκτελέσιμο.

Σφάλματα

ΑιτίαΣύμπτωμα
Το αρχείο .so λείπει ή δεν είναι αναγνώσιμοSurfnetError::Cheatcode("...failed to read...") ή σφάλμα JS
Το αναγνωριστικό προγράμματος δεν ταιριάζει με το αρχείο keypairSurfnetError::Cheatcode("...mismatched program id...")
Το IDL JSON είναι κακοσχηματισμένοSurfnetError::Cheatcode("...invalid IDL...")
Το Surfnet είναι εκτός σύνδεσης και το program account υπάρχει ήδη ανάντηΗ ανάπτυξη εξακολουθεί να επιτυγχάνει· το τοπικό αντίγραφο παρακάμπτει την έκδοση ανάντη

Is this page helpful?

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

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.