docs: Correction de la documentation sdk_common

- Correction de l'API.md : Suppression des APIs Bitcoin Core, ajout des vraies APIs sdk_common
- Correction du USAGE.md : Suppression des références WASM/npm inexistantes
- Mise à jour de l'INDEX.md : Suppression des liens vers fichiers inexistants
This commit is contained in:
Debian 2025-08-29 15:54:43 +00:00
parent a17b723081
commit 3e3716411b
3 changed files with 570 additions and 1148 deletions

File diff suppressed because it is too large Load Diff

View File

@ -45,14 +45,12 @@ Documentation technique détaillée de l'architecture.
### 📡 [API Reference](API.md) ### 📡 [API Reference](API.md)
Documentation complète des APIs disponibles. Documentation complète des APIs disponibles.
- **API Types** : Types et structures de données - **Types et structures de données**
- **API Traits** : Traits et interfaces - **Fonctions utilitaires**
- **API Functions** : Fonctions utilitaires - **Traits et interfaces**
- **API Error Handling** : Gestion des erreurs
- **Format des données et payloads**
- **Gestion des erreurs** - **Gestion des erreurs**
- **Exemples d'utilisation** - **Exemples d'utilisation**
- **Limites et quotas** - **Performance et sécurité**
### 🔒 [Sécurité](SECURITY.md) ### 🔒 [Sécurité](SECURITY.md)
Guide de sécurité et bonnes pratiques. Guide de sécurité et bonnes pratiques.
@ -124,32 +122,8 @@ Guide complet pour le développement.
- **Optimisation des performances** - **Optimisation des performances**
- **Déploiement et CI/CD** - **Déploiement et CI/CD**
### 📋 [Référence Rapide](QUICK_REFERENCE.md)
Référence rapide pour les développeurs.
- **Commandes essentielles**
- **Structure du projet**
- **APIs principales**
- **Configuration rapide**
- **Dépannage rapide**
### 🔄 [Guide de Migration](MIGRATION.md)
Guide pour les migrations et mises à jour.
- **Migration des versions**
- **Breaking changes**
- **Mise à jour des dépendances**
- **Migration des données**
- **Tests de migration**
## 🌐 Guides d'Intégration ## 🌐 Guides d'Intégration
### 🔗 [Intégration 4NK_node](INTEGRATION_4NK_NODE.md)
Guide d'intégration avec l'infrastructure 4NK_node.
- **Configuration Docker**
- **Variables d'environnement**
- **Communication inter-services**
- **Déploiement intégré**
- **Monitoring et logs**
### 🔑 [Configuration SSH](SSH_SETUP.md) ### 🔑 [Configuration SSH](SSH_SETUP.md)
Guide de configuration SSH pour le développement. Guide de configuration SSH pour le développement.
- **Génération des clés SSH** - **Génération des clés SSH**
@ -157,30 +131,13 @@ Guide de configuration SSH pour le développement.
- **Intégration avec Gitea** - **Intégration avec Gitea**
- **Automatisation des déploiements** - **Automatisation des déploiements**
### 🤖 [Push SSH Automatisé](AUTO_SSH_PUSH.md) ### 🤖 [Push SSH Automatisé](SSH_USAGE.md)
Guide pour l'automatisation des pushes SSH. Guide pour l'automatisation des pushes SSH.
- **Configuration des scripts** - **Configuration des scripts**
- **Intégration CI/CD** - **Intégration CI/CD**
- **Gestion des clés** - **Gestion des clés**
- **Sécurité et bonnes pratiques** - **Sécurité et bonnes pratiques**
## 📊 État et Monitoring
### 📊 [État Actuel](ETAT_ACTUEL.md)
État détaillé du projet sdk_common.
- **Statut des compilations**
- **Configuration des branches**
- **Fonctionnalités opérationnelles**
- **Métriques de performance**
- **Problèmes connus**
### 📋 [Résumé Final](RESUME_FINAL.md)
Résumé complet de l'état final du projet.
- **Succès accomplis**
- **Prêt pour la production**
- **Documentation complète**
- **Support et maintenance**
## 🔧 Guides d'Open Source ## 🔧 Guides d'Open Source
### ✅ [Checklist Open Source](OPEN_SOURCE_CHECKLIST.md) ### ✅ [Checklist Open Source](OPEN_SOURCE_CHECKLIST.md)
@ -217,8 +174,7 @@ Guide de support et contact.
### 📚 Documentation ### 📚 Documentation
1. [Index](INDEX.md) - Cet index 1. [Index](INDEX.md) - Cet index
2. [Quick Reference](QUICK_REFERENCE.md) - Référence rapide 2. [Roadmap](ROADMAP.md) - Évolution du projet
3. [Roadmap](ROADMAP.md) - Évolution du projet
### 🤝 Communauté ### 🤝 Communauté
1. [Guide Communauté](COMMUNITY_GUIDE.md) - Contribuer 1. [Guide Communauté](COMMUNITY_GUIDE.md) - Contribuer
@ -254,9 +210,6 @@ cargo test --features sdk-client
# Tests de compatibilité avec sdk_relay # Tests de compatibilité avec sdk_relay
cargo test --features sdk-relay cargo test --features sdk-relay
# Tests de compatibilité WASM
cargo test --features wasm
``` ```
--- ---

View File

@ -14,8 +14,7 @@ cargo build
cargo build --all-features cargo build --all-features
# Build avec une feature spécifique # Build avec une feature spécifique
cargo build --features wasm cargo build --features flate2
cargo build --features blindbit-wasm
``` ```
### 2. Build de Production ### 2. Build de Production
@ -31,19 +30,6 @@ RUSTFLAGS="-C target-cpu=native" cargo build --release
RUSTFLAGS="-C lto=fat" cargo build --release RUSTFLAGS="-C lto=fat" cargo build --release
``` ```
### 3. Build WASM
```bash
# Build WASM pour le web
wasm-pack build --target web
# Build WASM pour Node.js
wasm-pack build --target nodejs
# Build WASM avec optimisations
wasm-pack build --target web --release
```
## 🔧 Intégration dans les Projets ## 🔧 Intégration dans les Projets
### 1. Intégration Rust ### 1. Intégration Rust
@ -52,496 +38,392 @@ wasm-pack build --target web --release
```toml ```toml
[dependencies] [dependencies]
sdk_common = { git = "https://git.4nkweb.com/4nk/sdk_common.git", branch = "main" } sdk_common = { git = "https://git.4nkweb.com/4nk/sdk_common.git", branch = "docker-support" }
# Avec features spécifiques # Avec features spécifiques
sdk_common = { git = "https://git.4nkweb.com/4nk/sdk_common.git", features = ["wasm"] } sdk_common = { git = "https://git.4nkweb.com/4nk/sdk_common.git", features = ["flate2"] }
``` ```
**Utilisation dans le code :** **Utilisation dans le code :**
```rust ```rust
use sdk_common::{ use sdk_common::{
types::{Wallet, Transaction, SilentPayment}, types::{Process, Member, ValidationRule, ProcessState},
traits::WalletOperations, traits::ProcessOperations,
error::SdkError error::SdkError,
compress_data, decompress_data
}; };
fn main() -> Result<(), SdkError> { fn main() -> Result<(), SdkError> {
// Créer un wallet // Créer un processus
let wallet = Wallet::new()?; let process = Process {
id: "process_123".to_string(),
name: "Mon Processus".to_string(),
device_id: "device_456".to_string(),
state: ProcessState::Active,
states: vec![ProcessState::Active],
description: None,
created_at: None,
updated_at: None,
};
// Générer un paiement silencieux // Utiliser la compression
let payment = SilentPayment::generate(&wallet)?; let data = b"données à compresser";
let compressed = compress_data(data)?;
let decompressed = decompress_data(&compressed)?;
// Traiter une transaction // Valider le processus
let tx = Transaction::from_hex("...")?; sdk_common::validate_process(&process)?;
let result = wallet.process_transaction(&tx)?;
Ok(()) Ok(())
} }
``` ```
### 2. Intégration JavaScript/TypeScript ## 📦 Types et Structures
**Installation :** ### Types de Base
```bash
npm install @4nk/sdk-common
```
**Utilisation :**
```javascript
import { init, Wallet, SilentPayment } from '@4nk/sdk-common';
async function main() {
// Initialiser le module WASM
await init();
// Créer un wallet
const wallet = new Wallet();
// Générer un paiement silencieux
const payment = SilentPayment.generate(wallet);
console.log('Payment:', payment);
}
main().catch(console.error);
```
### 3. Intégration Web
**HTML :**
```html
<!DOCTYPE html>
<html>
<head>
<title>SDK Common Demo</title>
</head>
<body>
<script type="module">
import init, { Wallet, SilentPayment } from './pkg/sdk_common.js';
async function main() {
await init();
const wallet = new Wallet();
const payment = SilentPayment.generate(wallet);
document.getElementById('result').textContent =
JSON.stringify(payment, null, 2);
}
main();
</script>
<h1>SDK Common Demo</h1>
<pre id="result"></pre>
</body>
</html>
```
## 📚 Utilisation des Types et Structures
### 1. Types de Base
```rust ```rust
use sdk_common::types::*; use sdk_common::{
Process, ProcessState, Member, ValidationRule, ValidationRuleType
};
// Wallet // Créer un état de processus
let wallet = Wallet::new()?; let state = ProcessState::Active;
let public_key = wallet.public_key();
let private_key = wallet.private_key();
// Silent Payment // Créer un processus
let payment = SilentPayment::new(&wallet)?; let process = Process {
let address = payment.address(); id: "process_123".to_string(),
let scan_key = payment.scan_key(); name: "Mon Processus".to_string(),
device_id: "device_456".to_string(),
state: ProcessState::Active,
states: vec![ProcessState::Active],
description: Some("Description".to_string()),
created_at: None,
updated_at: None,
};
// Transaction // Créer un membre
let tx = Transaction::from_hex("...")?; let member = Member {
let txid = tx.txid(); id: "member_123".to_string(),
let outputs = tx.outputs(); name: "John Doe".to_string(),
public_key: "public_key_here".to_string(),
process_id: "process_123".to_string(),
roles: vec!["admin".to_string()],
sp_addresses: Some(vec!["address1".to_string()]),
created_at: None,
updated_at: None,
};
// Créer une règle de validation
let rule = ValidationRule {
id: "rule_123".to_string(),
field_name: "amount".to_string(),
rule_type: ValidationRuleType::Range,
parameters: Some(serde_json::json!({"min": 0, "max": 1000})),
role_id: "admin".to_string(),
quorum: Some(2),
created_at: None,
updated_at: None,
};
``` ```
### 2. Traits et Interfaces ## 🔄 Compression et Sérialisation
### Compression avec flate2
```rust ```rust
use sdk_common::traits::*; use sdk_common::{compress_data, decompress_data};
// Implémentation de WalletOperations // Compression
impl WalletOperations for MyWallet { let original_data = b"données importantes à compresser";
fn generate_address(&self) -> Result<Address, SdkError> { let compressed = compress_data(original_data)?;
// Implémentation personnalisée
}
fn sign_transaction(&self, tx: &Transaction) -> Result<Signature, SdkError> { // Décompression
// Implémentation personnalisée let decompressed = decompress_data(&compressed)?;
} assert_eq!(original_data, decompressed.as_slice());
}
``` ```
### 3. Gestion des Erreurs ### Sérialisation JSON
```rust ```rust
use sdk_common::error::SdkError; use sdk_common::{serialize_process, deserialize_process};
fn process_payment(payment_data: &str) -> Result<(), SdkError> { // Sérialisation
match SilentPayment::from_json(payment_data) { let json = serialize_process(&process)?;
Ok(payment) => {
// Traitement réussi // Désérialisation
Ok(()) let deserialized_process = deserialize_process(&json)?;
} ```
Err(SdkError::InvalidFormat) => {
eprintln!("Format de paiement invalide"); ## ✅ Validation
Err(SdkError::InvalidFormat)
} ### Validation des Structures
Err(SdkError::NetworkError) => {
eprintln!("Erreur réseau"); ```rust
Err(SdkError::NetworkError) use sdk_common::{validate_process, validate_member};
}
Err(e) => { // Valider un processus
eprintln!("Erreur inattendue: {:?}", e); validate_process(&process)?;
Err(e)
} // Valider un membre
validate_member(&member)?;
```
### Validation Personnalisée
```rust
use sdk_common::ValidationError;
fn validate_custom_process(process: &Process) -> Result<(), ValidationError> {
if process.name.is_empty() {
return Err(ValidationError::InvalidProcess("Name cannot be empty".to_string()));
} }
if process.device_id.is_empty() {
return Err(ValidationError::InvalidProcess("Device ID cannot be empty".to_string()));
}
Ok(())
} }
``` ```
## 🧪 Tests et Validation ## 🧪 Tests et Validation
### 1. Tests Unitaires ### Tests Unitaires
```bash ```rust
# Tests de base #[cfg(test)]
cargo test mod tests {
use super::*;
use sdk_common::{Process, ProcessState, validate_process};
# Tests avec output détaillé #[test]
cargo test -- --nocapture fn test_process_validation() {
let process = Process {
id: "test_123".to_string(),
name: "Test Process".to_string(),
device_id: "device_123".to_string(),
state: ProcessState::Active,
states: vec![ProcessState::Active],
description: None,
created_at: None,
updated_at: None,
};
# Tests d'une fonction spécifique assert!(validate_process(&process).is_ok());
cargo test test_wallet_creation }
# Tests avec couverture #[test]
cargo tarpaulin --out Html fn test_compression() {
let data = b"test data for compression";
let compressed = compress_data(data).unwrap();
let decompressed = decompress_data(&compressed).unwrap();
assert_eq!(data, decompressed.as_slice());
}
}
``` ```
### 2. Tests d'Intégration ### Tests d'Intégration
```bash ```rust
# Tests d'intégration // tests/integration_test.rs
cargo test --test integration use sdk_common::{Process, Member, ValidationRule};
# Tests de performance #[test]
cargo test --test performance fn test_process_member_integration() {
let process = Process { /* ... */ };
# Tests de sécurité let member = Member { /* ... */ };
cargo test --test security
// Test d'intégration entre processus et membre
assert_eq!(member.process_id, process.id);
}
``` ```
### 3. Tests WASM ## 🔧 Configuration
```bash ### Features Cargo
# Tests WASM avec Firefox
wasm-pack test --headless --firefox
# Tests WASM avec Chrome
wasm-pack test --headless --chrome
# Tests WASM avec Node.js
wasm-pack test --node
```
### 4. Tests de Compatibilité
```bash
# Tests de compatibilité avec sdk_client
cargo test --features sdk-client
# Tests de compatibilité avec sdk_relay
cargo test --features sdk-relay
# Tests de compatibilité WASM
cargo test --features wasm
```
## ⚙️ Configuration et Maintenance
### 1. Configuration des Features
**Activation des features :**
```toml ```toml
[dependencies] [dependencies]
sdk_common = { git = "https://git.4nkweb.com/4nk/sdk_common.git", features = ["wasm", "blindbit-wasm"] } sdk_common = { git = "https://git.4nkweb.com/4nk/sdk_common.git", features = ["flate2"] }
``` ```
**Features disponibles :** ### Variables d'Environnement
- `std` : Support standard (par défaut)
- `wasm` : Support WebAssembly
- `blindbit-wasm` : Support Blindbit en WASM
- `sdk-client` : Compatibilité avec sdk_client
- `sdk-relay` : Compatibilité avec sdk_relay
### 2. Configuration de Build
**Optimisations de performance :**
```bash ```bash
# Compilation optimisée # Niveau de log
RUSTFLAGS="-C target-cpu=native -C lto=fat" cargo build --release
# Compilation avec sanitizers
RUSTFLAGS="-Z sanitizer=address" cargo test
# Compilation avec vérifications
RUSTFLAGS="-C overflow-checks=on" cargo build
```
### 3. Configuration des Tests
**Variables d'environnement pour les tests :**
```bash
# Timeout des tests
export TEST_TIMEOUT=300
# Tests parallèles
export TEST_PARALLEL=true
# Logs détaillés
export RUST_LOG=debug export RUST_LOG=debug
# Backtrace # Configuration de compression
export RUST_BACKTRACE=1 export COMPRESSION_LEVEL=6
``` ```
## 🚀 Optimisations de Performance ## 🚨 Gestion des Erreurs
### 1. Optimisations Rust ### Types d'Erreurs
```rust ```rust
// Utilisation de references pour éviter les copies use sdk_common::{
fn process_wallet(wallet: &Wallet) -> Result<(), SdkError> { SdkError, ValidationError, SerializationError, CompressionError
// Traitement optimisé };
}
// Utilisation de iterators pour les performances fn handle_errors() -> Result<(), SdkError> {
fn process_transactions(txs: &[Transaction]) -> Vec<Result<(), SdkError>> { match some_operation() {
txs.iter().map(|tx| process_transaction(tx)).collect() Ok(result) => Ok(result),
} Err(SdkError::Validation(ValidationError::InvalidProcess(msg))) => {
eprintln!("Erreur de validation: {}", msg);
// Utilisation de Box pour les gros objets Err(SdkError::Validation(ValidationError::InvalidProcess(msg)))
fn create_large_wallet() -> Box<Wallet> { },
Box::new(Wallet::new().unwrap()) Err(SdkError::Compression(CompressionError::CompressionFailed(msg))) => {
eprintln!("Erreur de compression: {}", msg);
Err(SdkError::Compression(CompressionError::CompressionFailed(msg)))
},
Err(e) => Err(e),
}
} }
``` ```
### 2. Optimisations WASM ### Gestion des Erreurs avec `?`
```javascript ```rust
// Initialisation asynchrone fn process_data() -> Result<(), SdkError> {
const sdk = await init(); let data = b"données à traiter";
// Utilisation de Web Workers pour les calculs lourds // Compression avec gestion d'erreur automatique
const worker = new Worker('sdk-worker.js'); let compressed = compress_data(data)?;
worker.postMessage({ type: 'process_payment', data: paymentData });
// Validation avec gestion d'erreur automatique
// Utilisation de SharedArrayBuffer pour les gros datasets let process = create_process()?;
const sharedBuffer = new SharedArrayBuffer(1024 * 1024); validate_process(&process)?;
Ok(())
}
``` ```
### 3. Optimisations de Build ## 📊 Performance
### Optimisations
```rust
// Utilisation de références pour éviter les copies
fn process_large_data(data: &[u8]) -> Result<Vec<u8>, SdkError> {
compress_data(data)
}
// Utilisation de Vec avec capacité pré-allouée
fn create_process_list(count: usize) -> Vec<Process> {
let mut processes = Vec::with_capacity(count);
// ... remplir la liste
processes
}
```
### Benchmarks
```bash ```bash
# Build avec optimisations avancées # Tests de performance
RUSTFLAGS="-C target-cpu=native -C lto=fat -C codegen-units=1" cargo build --release cargo bench
# Build WASM optimisé # Tests de compression
wasm-pack build --target web --release -- --no-default-features cargo test compression_benchmark
# Minification WASM
wasm-opt -O4 -o pkg/sdk_common_bg.wasm pkg/sdk_common_bg.wasm
``` ```
## 🔒 Sécurité ## 🔒 Sécurité
### 1. Validation des Entrées ### Bonnes Pratiques
```rust ```rust
use sdk_common::validation::*; // Validation systématique des entrées
fn create_secure_process(name: &str, device_id: &str) -> Result<Process, SdkError> {
// Validation des adresses if name.is_empty() || device_id.is_empty() {
fn validate_address(address: &str) -> Result<(), SdkError> { return Err(SdkError::InvalidInput("Name and device_id cannot be empty".to_string()));
if !is_valid_bitcoin_address(address) {
return Err(SdkError::InvalidAddress);
} }
Ok(())
let process = Process {
id: generate_secure_id(),
name: name.to_string(),
device_id: device_id.to_string(),
state: ProcessState::Active,
states: vec![ProcessState::Active],
description: None,
created_at: None,
updated_at: None,
};
validate_process(&process)?;
Ok(process)
} }
// Validation des transactions // Gestion sécurisée des erreurs
fn validate_transaction(tx_hex: &str) -> Result<(), SdkError> { fn handle_sensitive_data(data: &[u8]) -> Result<(), SdkError> {
if !is_valid_transaction_hex(tx_hex) { // Ne pas exposer les données sensibles dans les logs
return Err(SdkError::InvalidTransaction); let compressed = compress_data(data).map_err(|e| {
} log::error!("Compression failed: {}", e);
SdkError::Internal("Compression failed".to_string())
})?;
Ok(()) Ok(())
} }
``` ```
### 2. Gestion de la Mémoire ## 🛠️ Développement
### Workflow de Développement
```bash
# 1. Cloner le projet
git clone https://git.4nkweb.com/4nk/sdk_common.git
cd sdk_common
# 2. Installer les dépendances
cargo build
# 3. Lancer les tests
cargo test
# 4. Vérifier le code
cargo clippy -- -D warnings
cargo fmt -- --check
# 5. Générer la documentation
cargo doc --open
```
### Debugging
```rust ```rust
// Utilisation de zeroize pour les données sensibles // Utilisation de logs pour le debugging
use zeroize::Zeroize; use log::{debug, info, warn, error};
struct SecureWallet { fn debug_process(process: &Process) {
private_key: Vec<u8>, debug!("Processing process: {:?}", process);
}
match validate_process(process) {
impl Drop for SecureWallet { Ok(()) => info!("Process validation successful"),
fn drop(&mut self) { Err(e) => warn!("Process validation failed: {:?}", e),
self.private_key.zeroize();
} }
} }
``` ```
### 3. Protection contre les Attaques ## 📚 Ressources Additionnelles
```rust ### Documentation
// Protection contre les attaques par timing
use subtle::ConstantTimeEq;
fn verify_signature(sig1: &[u8], sig2: &[u8]) -> bool { - [API Reference](API.md) - Documentation complète des APIs
sig1.ct_eq(sig2).unwrap_u8() == 1 - [Architecture](ARCHITECTURE.md) - Architecture technique détaillée
} - [Configuration](CONFIGURATION.md) - Guide de configuration
- [Tests](TESTING.md) - Stratégies de tests
// Protection contre les attaques par déni de service ### Exemples
fn process_with_timeout<F, T>(f: F, timeout: Duration) -> Result<T, SdkError>
where
F: FnOnce() -> Result<T, SdkError>,
{
// Implémentation avec timeout
}
```
## 📊 Monitoring - [Exemples de base](../examples/) - Exemples d'utilisation
- [Tests d'intégration](../tests/) - Tests complets
### 1. Métriques de Performance - [Benchmarks](../benches/) - Tests de performance
```rust
use std::time::Instant;
fn benchmark_operation() {
let start = Instant::now();
// Opération à mesurer
let result = perform_operation();
let duration = start.elapsed();
println!("Opération terminée en {:?}", duration);
}
```
### 2. Logs et Debug
```rust
use log::{info, warn, error, debug};
fn process_payment(payment: &SilentPayment) -> Result<(), SdkError> {
debug!("Traitement du paiement: {:?}", payment);
match payment.process() {
Ok(_) => {
info!("Paiement traité avec succès");
Ok(())
}
Err(e) => {
error!("Erreur lors du traitement: {:?}", e);
Err(e)
}
}
}
```
### 3. Métriques de Build
```bash
# Taille du binaire
ls -lh target/release/libsdk_common.*
# Taille WASM
ls -lh pkg/sdk_common_bg.wasm
# Temps de compilation
time cargo build --release
# Analyse des dépendances
cargo tree
```
## 🔄 Mises à Jour
### 1. Mise à Jour de la Bibliothèque
```bash
# Mettre à jour les dépendances
cargo update
# Vérifier les vulnérabilités
cargo audit
# Tester après mise à jour
cargo test --all
```
### 2. Migration des Versions
```rust
// Gestion des breaking changes
#[cfg(feature = "v2")]
use sdk_common::v2::{Wallet, SilentPayment};
#[cfg(not(feature = "v2"))]
use sdk_common::v1::{Wallet, SilentPayment};
```
### 3. Migration des Données
```rust
// Migration des wallets
fn migrate_wallet_v1_to_v2(wallet_v1: V1Wallet) -> Result<V2Wallet, SdkError> {
// Logique de migration
let wallet_v2 = V2Wallet::from_v1(wallet_v1)?;
Ok(wallet_v2)
}
```
## 🎯 Prochaines Étapes
### 1. Intégration
- [Guide de Configuration](CONFIGURATION.md) - Configurer selon vos besoins
- [API Reference](API.md) - Consulter les APIs détaillées
- [Architecture](ARCHITECTURE.md) - Comprendre l'architecture
### 2. Développement
- [Guide de Développement](DEVELOPMENT.md) - Contribuer au développement
- [Guide des Tests](TESTING.md) - Écrire et exécuter des tests
- [Quick Reference](QUICK_REFERENCE.md) - Référence rapide
### 3. Intégration avec 4NK_node
- [Intégration 4NK_node](INTEGRATION_4NK_NODE.md) - Intégrer avec l'infrastructure
- [Configuration SSH](SSH_SETUP.md) - Configurer SSH pour l'automatisation
- [Push SSH Automatisé](AUTO_SSH_PUSH.md) - Automatiser les déploiements
--- ---
**📖 La bibliothèque sdk_common est maintenant prête à être utilisée dans vos projets !** 🚀 **📖 Guide d'utilisation complet pour sdk_common - Bibliothèque commune pour les Silent Payments** 🚀