Files
2026-08-28 07:05:02 +02:00

4.0 KiB

Usage de ksp-interface-lib

Cette page décrit la façade publique matérialisée par 0.2.13. Les modules internes ne font pas partie du contrat consommable : utiliser uniquement les exports du crate-root.

Construire des account metas

let readonly_account = ksp_interface_lib::Pubkey::new_from_array([1_u8; 32]);
let writable_account = ksp_interface_lib::Pubkey::new_from_array([2_u8; 32]);

let readonly = ksp_interface_lib::ProgramAccountMeta::readonly(readonly_account, true);
let writable = ksp_interface_lib::ProgramAccountMeta::writable(writable_account, false);

assert_eq!(readonly.pubkey(), &readonly_account);
assert!(readonly.is_signer());
assert!(!readonly.is_writable());

assert_eq!(writable.pubkey(), &writable_account);
assert!(!writable.is_signer());
assert!(writable.is_writable());

readonly/writable décrivent uniquement les flags wire de l'account meta. Interface ne valide pas l'identité du compte contre un registry Program.

Construire une instruction passive

let program_id = ksp_interface_lib::Pubkey::new_from_array([3_u8; 32]);
let account_id = ksp_interface_lib::Pubkey::new_from_array([4_u8; 32]);

let account = ksp_interface_lib::ProgramAccountMeta::writable(account_id, true);
let result = ksp_interface_lib::ProgramInstruction::try_new(
    program_id,
    std::vec![account, account],
    std::vec![7_u8, 8, 9],
);

match result {
    std::result::Result::Ok(instruction) => {
        assert_eq!(instruction.program_id(), &program_id);
        assert_eq!(instruction.accounts(), &[account, account]);
        assert_eq!(instruction.data(), &[7_u8, 8, 9]);
    }
    std::result::Result::Err(error) => {
        eprintln!("{error}");
    }
}

L'ordre et les doublons des accounts sont conservés. Les octets data restent opaques : ProgramInstruction ne les sérialise, désérialise ni interprète.

Les Vec fournis à try_new sont consommés par la structure après validation des bornes ; aucun clone ou reformatage interne n'est requis par le contrat actuel.

Bornes

Les limites publiques sont :

assert_eq!(ksp_interface_lib::MAX_PROGRAM_INSTRUCTION_ACCOUNTS, 255);
assert_eq!(ksp_interface_lib::MAX_PROGRAM_INSTRUCTION_DATA_LEN, 10_240);

255 account metas et 10_240 bytes de data sont admis. 256 account metas ou 10_241 bytes sont refusés par try_new avant création d'un ProgramInstruction valide.

Ces limites sont des bornes locales Interface et ne promettent pas qu'une instruction admise respecte à elle seule toutes les contraintes de taille/account-set d'une transaction Solana complète.

Observer une erreur de limite

Le code public est :

assert_eq!(
    ksp_interface_lib::ERROR_CODE_PROGRAM_INSTRUCTION_LIMIT_EXCEEDED.domain(),
    "interface",
);
assert_eq!(
    ksp_interface_lib::ERROR_CODE_PROGRAM_INSTRUCTION_LIMIT_EXCEEDED.code(),
    "program_instruction_limit_exceeded",
);

Une erreur de dépassement expose uniquement un contexte structurel sûr :

field
actual_len
maximum_len

Le contenu du payload et les account metas arbitraires ne sont pas projetés dans le diagnostic.

Debug borné

Le Debug de ProgramInstruction contient uniquement :

program_id
account_count
data_len

Il ne faut donc pas attendre de ce rendu une sérialisation wire ou un dump du payload.

Dépendances à ne pas ajouter côté consumer

Un consumer de la façade Interface n'a pas besoin d'ajouter un SDK Program Solana uniquement pour reconstruire ProgramInstruction. La crate utilise le Pubkey canonique partagé avec Core et conserve son propre contrat passif.

La foundation ne fournit volontairement pas :

serde générique
Borsh / Wincode générique
solana-instruction interop automatique
transport réseau
Program decoder/preparer
signing/execution

Ces surfaces doivent être introduites dans leur owner respectif lorsqu'un cas réel le justifie, pas comme dépendances implicites d'un consumer Interface.