Zaawansowane iconZaawansowane

Zaktualizowano: 2025-09-03

Zaawansowane iconZaawansowane

Zaktualizowano: 2025-09-03
Przewodnik na poziomie eksperta: Ten kompleksowy przewodnik omawia zaawansowane odzyskiwanie kont tokenów Solana przy użyciu JavaScript/TypeScript. Wymaga wiedzy technicznej i niesie ryzyko utraty środków w przypadku nieprawidłowego wykonania.

Pełne odzyskiwanie kont tokenów Solana

Zaawansowani programiści Solana mogą odzyskać SOL z pustych kont tokenów stowarzyszonych (ATA) i zamykać nieużywane konta tokenów SPL przy użyciu JavaScript/TypeScript z oficjalnymi bibliotekami Solana. Ten ręczny proces zapewnia maksymalną kontrolę nad czyszczeniem kont tokenów, odzyskiwaniem czynszu i optymalizacją portfela.

Wymagania wstępne dla zaawansowanego odzyskiwania:
  • Node.js 16+ oraz npm/yarn zainstalowane
  • Zrozumienie modelu kont Solana i mechaniki czynszu
  • Dostęp do prywatnych kluczy portfela lub fraz seed
  • Znajomość instrukcji programu tokenów SPL
  • Znajomość JavaScript/TypeScript i programowania asynchronicznego
  • Podstawowe zrozumienie konstrukcji transakcji Solana
Dlaczego JavaScript/TypeScript?
  • Oficjalna dokumentacja Solana i przykłady głównie w JS/TS
  • Dojrzały ekosystem z @solana/web3.js i @solana/spl-token
  • Aktywne wsparcie społeczności i obszerne tutoriale
  • Web3.js 2.0 (wydany w listopadzie 2024) oferuje lepszą wydajność
  • Łatwiejsza integracja z aplikacjami internetowymi i portfelami
Potencjał odzyskiwania
Standardowe ATA:
0.002 SOL na konto
Limit partii:
20 kont na transakcję
Opłaty transakcyjne:
~0.000005 SOL na podpis
Netto stopa odzysku:
99%+ zablokowanego czynszu

Konfiguracja projektu i zależności

Wymagane zależności

Komendy instalacji:
# Web3.js 2.0 (Latest - Recommended)
npm install @solana/web3.js@2

# OR Web3.js 1.x (Stable)
npm install @solana/web3.js@1

# SPL Token Library
npm install @solana/spl-token

# Additional utilities
npm install bs58 bip39 ed25519-hd-key

Połączenie z portfelem i zarządzanie kluczami

Metoda 1: Klucz prywatny (Base58)
import { Connection, Keypair } from '@solana/web3.js';
import bs58 from 'bs58';

const connection = new Connection(
  'https://api.mainnet-beta.solana.com'
);

const secretKey = 'YOUR_BASE58_PRIVATE_KEY';
const keypair = Keypair.fromSecretKey(
  bs58.decode(secretKey)
);
Eksportuj klucze prywatne z Phantom: Ustawienia → Eksportuj klucz prywatny
Metoda 2: Odzyskiwanie frazy seed
import { Keypair } from '@solana/web3.js';
import * as bip39 from 'bip39';
import { derivePath } from 'ed25519-hd-key';

const mnemonic = 'your twelve word seed phrase';
const seed = await bip39.mnemonicToSeed(mnemonic);
const derivedSeed = derivePath(
  "m/44'/501'/0'/0'", seed.toString('hex')
).key;

const keypair = Keypair.fromSeed(derivedSeed);
Standardowa ścieżka derivacji Solana: m/44'/501'/0'/0'
Krytyczne środki bezpieczeństwa:
  • Nigdy nie przechowuj kluczy prywatnych w postaci zwykłego tekstu w kodzie produkcyjnym
  • Używaj zmiennych środowiskowych dla wrażliwych danych
  • Testuj wszystkie operacje najpierw na devnet
  • Przechowuj kopie zapasowe par kluczy w bezpiecznych miejscach
  • Rozważ użycie portfeli sprzętowych dla dużych kwot

Odkrywanie i analiza kont tokenów

Znajdź wszystkie konta tokenów

import {
  TOKEN_PROGRAM_ID,
  getAccount
} from '@solana/spl-token';

async function findAllTokenAccounts(walletAddress) {
  // Get all token accounts
  const tokenAccounts = await connection.getTokenAccountsByOwner(
    walletAddress,
    { programId: TOKEN_PROGRAM_ID }
  );

  // Categorize accounts
  const emptyAccounts = [];
  const accountsWithTokens = [];

  for (const account of tokenAccounts.value) {
    const accountInfo = await getAccount(connection, account.pubkey);
    if (accountInfo.amount === 0n) {
      emptyAccounts.push(account.pubkey);
    } else {
      accountsWithTokens.push({
        pubkey: account.pubkey,
        mint: accountInfo.mint,
        amount: accountInfo.amount
      });
    }
  }

  return { emptyAccounts, accountsWithTokens };
}
Wsparcie dla Token-2022:
import { TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';

// For Token Extensions (Token-2022)
{ programId: TOKEN_2022_PROGRAM_ID }
Reference: https://spl.solana.com/token-2022

Operacje spalania tokenów

🚨 KRYTYCZNY PRZEPŁYW PRACY - Postępuj w tej kolejności:
  1. Krok 1: Zidentyfikuj - Znajdź wszystkie konta tokenów i skategoryzuj je
  2. Krok 2: Najpierw spal - Jeśli chcesz zniszczyć tokeny z saldem > 0, najpierw je spal
  3. Krok 3: Zamknij później - Zamykaj tylko konta, które są w 100% puste

⚠️ NIGDY nie zamykaj kont z saldami tokenów > 0 - Stracisz wartościowe tokeny na zawsze!

Indywidualne spalanie tokenów
import {
  createBurnInstruction,
  Transaction,
  sendAndConfirmTransaction
} from '@solana/spl-token';

async function burnTokens(
  tokenAccount, mint, owner, amount
) {
  const instruction = createBurnInstruction(
    tokenAccount, // Token account
    mint, // Mint account
    owner, // Owner
    amount // Amount to burn
  );

  const transaction = new Transaction().add(instruction);
  return await sendAndConfirmTransaction(
    connection, transaction, [ownerKeypair]
  );
}

Spala tokeny na stałe, zmniejszając całkowitą podaż i przygotowując konta do zamknięcia.

Masowe spalanie tokenów
async function burnAllTokensInAccounts(accountsWithTokens) {
  for (const account of accountsWithTokens) {
    console.log(
      `Burning {account.amount} tokens from {account.pubkey}`
    );

    await burnTokens(
      account.pubkey,
      account.mint,
      ownerKeypair.publicKey,
      account.amount
    );

    // Rate limiting
    await new Promise(r => setTimeout(r, 2000));
  }
}
⚠️ OSTRZEŻENIE: To trwale niszczy tokeny! Spalaj tylko bezwartościowe/niechciane tokeny.

Zamykanie kont tokenów stowarzyszonych

Zamykanie indywidualnych kont
import {
  createCloseAccountInstruction
} from '@solana/spl-token';

async function closeEmptyTokenAccount(
  tokenAccount, owner, recipient
) {
  // CRITICAL: Verify account is empty first
  const accountInfo = await getAccount(
    connection, tokenAccount
  );
  if (accountInfo.amount !== 0n) {
    throw new Error('Account must be empty!');
  }

  const instruction = createCloseAccountInstruction(
    tokenAccount, // Empty token account
    recipient, // SOL recipient
    owner // Account owner
  );

  const transaction = new Transaction().add(instruction);
  return await sendAndConfirmTransaction(
    connection, transaction, [ownerKeypair]
  );
}

Zamyka indywidualne PUSTE konta tokenów i odzyskuje 0.002 SOL czynszu na konto.

Masowe zamykanie pustych kont
async function closeAllEmptyAccounts(emptyAccounts) {
  const batchSize = 20; // Max per transaction
  const results = [];

  for (let i = 0; i < emptyAccounts.length; i += batchSize) {
    const batch = emptyAccounts.slice(i, i + batchSize);
    const transaction = new Transaction();

    // Double-verify all accounts are empty
    for (const account of batch) {
      const info = await getAccount(connection, account);
      if (info.amount !== 0n) {
        throw new Error(`Account not empty: {account}`);
      }
      transaction.add(
        createCloseAccountInstruction(
          account, recipient, owner
        )
      );
    }

    const signature = await sendAndConfirmTransaction(
      connection, transaction, [ownerKeypair]
    );
    results.push(signature);

    // Rate limiting
    await new Promise(r => setTimeout(r, 1000));
  }

  return results;
}
✅ Bezpieczne przetwarzanie masowe z podwójną weryfikacją, że konta są puste.

Opłaty priorytetowe dla szybszego potwierdzenia

Dodaj instrukcje budżetu obliczeniowego

import { ComputeBudgetProgram } from '@solana/web3.js';

// Add priority fee for faster confirmation
transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: 1000 // 0.000001 SOL
  })
);

// Optional: Set compute unit limit
transaction.add(
  ComputeBudgetProgram.setComputeUnitLimit({
    units: 200000
  })
);
Opłaty priorytetowe pomagają zapewnić szybsze potwierdzenie transakcji podczas przeciążenia sieci. Dostosuj microLamports w zależności od aktualnych warunków sieci.

Rozwiązywanie problemów i typowe problemy

Niepowodzenia transakcji
  • Konto nie jest puste: Sprawdź, czy saldo tokenów wynosi dokładnie 0
  • Niezgodność uprawnień: Upewnij się, że portfel jest właścicielem konta
  • Niewystarczające SOL: Potrzebne SOL na opłaty transakcyjne
  • Przeciążenie sieci: Dodaj opłaty priorytetowe lub spróbuj ponownie później
Problemy z RPC i siecią
  • Ograniczenie szybkości: Dodaj opóźnienia między żądaniami (1-2 sekundy)
  • Błędy przekroczenia czasu: Używaj niezawodnego dostawcy RPC (Helius, QuickNode)
  • Blockhash wygasł: Pobierz nowy, świeży blockhash
  • Błędy 429: Wdroż wykładnicze wycofywanie
Wskazówki optymalizacyjne
  • Operacje partiami: Grupuj do 20 kont na transakcję
  • Obsługa błędów: Używaj bloków try/catch z logiką ponownych prób
  • Filtry kont: Wstępnie filtruj puste konta po stronie klienta
  • Testowanie: Zawsze testuj najpierw na devnet
Ostrzeżenie bezpieczeństwa - grudzień 2024:

Wersje 1.95.6 i 1.95.7 @solana/web3.js zostały naruszone. Zawsze używaj najnowszej wersji:

npm install @solana/web3.js@latest

Najlepsze praktyki bezpieczeństwa i zasoby

Krytyczne środki bezpieczeństwa:
  • Testuj wszystkie operacje najpierw na devnet
  • Używaj zmiennych środowiskowych dla kluczy prywatnych
  • Weryfikuj adresy portfela przed wykonaniem
  • Utrzymuj @solana/web3.js zaktualizowane do najnowszej wersji
  • Monitoruj transakcje w eksploratorach Solana
  • Używaj portfeli sprzętowych dla dużych kwot
  • Nigdy nie zamykaj kont z saldami tokenów > 0
  • Zawsze dwukrotnie sprawdzaj stan kont przed operacjami
Oficjalne zasoby:

Dla użytkowników nieprzekonanych do kodowania, automatyczne narzędzia oferują bezpieczniejsze alternatywy:

  • SweepSOL: Automatyczne odzyskiwanie oparte na GUI
  • Profesjonalna weryfikacja i kontrole bezpieczeństwa
  • Wsparcie techniczne i wskazówki