Osoitteen vahvistaminen

Tokenien lähettäminen väärään osoitteeseen voi johtaa varojen pysyvään menetykseen. Osoitteen vahvistaminen varmistaa, että lähetät tokeneita vain osoitteisiin, jotka voivat asianmukaisesti vastaanottaa ja käyttää niitä.

Katso Miten maksut toimivat Solanassa maksun peruskäsitteitä varten.

Solanan osoitteiden ymmärtäminen

Solana-tileillä on kahdenlaisia osoitteita: käyrällä olevat ja käyrän ulkopuoliset.

Käyrällä olevat osoitteet

Tavalliset osoitteet ovat Ed25519-avainparien julkisia avaimia. Nämä osoitteet:

  • Niillä on vastaava yksityinen avain, joka voi allekirjoittaa transaktioita
  • Niitä käytetään lompakko-osoitteina

Käyrän ulkopuoliset osoitteet (PDA:t)

Program Derived Address -osoitteet johdetaan deterministisesti ohjelmatunnisteesta ja siemenistä. Nämä osoitteet:

  • Eivät sisällä vastaavaa yksityistä avainta
  • Vain ohjelma, josta osoite on johdettu, voi allekirjoittaa niiden puolesta

Tilityypit maksuissa

Käytä osoitetta tilin hakemiseen verkosta, tarkista sen ohjelmaomistaja ja tilityyppi määrittääksesi, miten osoitetta käsitellään.

Sen tietäminen, onko osoite käyrällä vai käyrän ulkopuolella, ei kerro, minkä tyyppinen tili se on, mikä ohjelma omistaa sen tai onko kyseisessä osoitteessa olemassa tiliä. Sinun on haettava tili verkosta näiden tietojen määrittämiseksi.

System Program -tilit (lompakot)

System Program -ohjelman omistamat tilit ovat tavallisia lompakoita. Lähettääksesi SPL-tokeneita lompakolle, johdat ja käytät sen associated token account -tiliä (ATA).

Kun olet johtanut ATA-osoitteen, tarkista, onko token account olemassa lohkoketjussa. Jos ATA:ta ei ole olemassa, voit sisällyttää ohjeen vastaanottajan token account -tilin luomiseksi samaan transaktioon siirron kanssa. Tämä kuitenkin edellyttää vuokran maksamista uudesta token account -tilistä. Koska vastaanottaja omistaa ATA:n, vuokrasta maksettu SOL ei ole lähettäjän palautettavissa.

Ilman suojatoimia ATA:n luomisen tukemista voidaan hyväksikäyttää. Haitallinen käyttäjä voisi pyytää siirtoa, saada ATA:nsa luotua kustannuksellasi, sulkea ATA:n saadakseen rent-SOL:n takaisin ja toistaa prosessin.

Token accountit

Token accountit ovat Token Programin tai Token-2022 Programin omistuksessa ja sisältävät token-saldoja. Jos saamasi osoite on token programin omistuksessa, sinun tulee varmistaa, että tili on token account (ei mint account) ja vastaa odotettua token mint accountia ennen lähettämistä.

Token Programit validoivat automaattisesti, että molemmat token accountit siirrossa sisältävät saman mintin tokeneita. Jos validointi epäonnistuu, transaktio hylätään eikä varoja menetä.

Mint accountit

Mint accountit seuraavat tietyn tokenin tarjontaa ja metadataa. Mint accountit ovat myös Token Programien omistuksessa, mutta eivät ole kelvollisia vastaanottajia token-siirroille. Yritys lähettää tokeneita mint-osoitteeseen johtaa epäonnistuneeseen transaktioon, mutta varoja ei menetä.

Muut accountit

Muiden programien omistamat accountit vaativat linjapäätöksen. Jotkin accountit (esim. multisig-lompakot) voivat olla kelvollisia token accountin omistajia, kun taas toiset tulisi hylätä.

Validointiprosessi

Seuraava kaavio näyttää viitepäätöspuun osoitteen validointiin:

Address Verification Flow

Hae account

Käytä osoitetta accountin tietojen hakemiseen verkosta.

Accountia ei ole olemassa

Jos osoitteessa ei ole accountia, tarkista onko osoite on-curve vai off-curve:

  • Käyrän ulkopuolella (PDA): Hylkää osoite varmuuden vuoksi välttääksesi lähettämisen ATA:han, joka saattaa olla saavuttamaton. Ilman olemassa olevaa tiliä et voi pelkästään osoitteesta määrittää, mikä ohjelma johti tämän PDA:n tai onko osoite ATA:ta varten. ATA:n johtaminen tälle osoitteelle tokenien lähettämistä varten voisi johtaa varojen lukittumiseen saavuttamattomaan token-tiliin.

  • Käyrällä: Tämä on kelvollinen lompakko-osoite (julkinen avain), jota ei ole vielä rahoitettu. Johda ATA, tarkista onko se olemassa ja lähetä tokenit siihen. Sinun on tehtävä linjapäätös siitä, rahoitetaanko ATA:n luominen, jos sitä ei ole olemassa.

Tili on olemassa

Jos tili on olemassa, tarkista mikä ohjelma omistaa sen:

  • System Program: Tämä on tavallinen lompakko. Johda ATA, tarkista onko se olemassa ja lähetä tokenit siihen. Sinun on tehtävä linjapäätös siitä, rahoitetaanko ATA:n luominen, jos sitä ei ole olemassa.

  • Token Program / Token-2022: Varmista, että tili on token-tili (ei mint account) ja että se sisältää tokenin (mintin), jonka aiot lähettää. Jos kelvollinen, lähetä tokenit suoraan tähän osoitteeseen. Jos kyseessä on mint account tai token-tili eri mintille, hylkää osoite.

  • Muu ohjelma: Tämä vaatii linjapäätöksen. Jotkin ohjelmat, kuten multisig-lompakot, voivat olla hyväksyttäviä token-tilien omistajia. Jos linjauksesi sallii sen, johda ATA ja lähetä. Muussa tapauksessa hylkää osoite.

Demo

Seuraava esimerkki näyttää vain osoitteen validointilogiikan. Tämä on referenssikoodia havainnollistamistarkoituksiin.

Demo ei näytä, miten ATA johdetaan tai miten rakennetaan transaktio tokenien lähettämiseksi. Katso esimerkkikoodia token account- ja token transfer -dokumentaatiosta.

Alla oleva demo käyttää kolmea mahdollista tulosta:

TulosMerkitysToimenpide
IS_WALLETKelvollinen lompakko-osoiteJohda ja lähetä associated token accountiin
IS_TOKEN_ACCOUNTKelvollinen token accountLähetä tokenit suoraan tähän osoitteeseen
REJECTVirheellinen osoiteÄlä lähetä
Demo
/**
* Validates an input address and classifies it as a wallet, token account, or invalid.
*
* @param inputAddress - The address to validate
* @param rpc - Optional RPC client (defaults to mainnet)
* @returns Classification result:
* - IS_WALLET: Valid wallet address
* - IS_TOKEN_ACCOUNT: Valid token account
* - REJECT: Invalid address for transfers
*/
export async function validateAddress(
inputAddress: Address,
rpc: Rpc<GetAccountInfoApi> = defaultRpc
): Promise<ValidationResult> {
const account = await fetchJsonParsedAccount(rpc, inputAddress);
// Log the account data for demo
console.log("\nAccount:", account);
// Account doesn't exist on-chain
if (!account.exists) {
// Off-curve = PDA that doesn't exist as an account
// Reject conservatively to avoid sending to an address that may be inaccessible.
if (isOffCurveAddress(inputAddress)) {
return { type: "REJECT", reason: "PDA doesn't exist as an account" };
}
// On-curve = valid keypair address, treat as unfunded wallet
return { type: "IS_WALLET" };
}
// Account exists, check program owner
const owner = account.programAddress;
// System Program = wallet
if (owner === SYSTEM_PROGRAM) {
return { type: "IS_WALLET" };
}
// Token Program or Token-2022, check if token account
if (owner === TOKEN_PROGRAM || owner === TOKEN_2022_PROGRAM) {
const accountType = (
account.data as { parsedAccountMeta?: { type?: string } }
).parsedAccountMeta?.type;
if (accountType === "account") {
return { type: "IS_TOKEN_ACCOUNT" };
}
// Reject if not a token account (mint account)
return {
type: "REJECT",
reason: "Not a token account"
};
}
// Unknown program owner
return { type: "REJECT", reason: "Unknown program owner" };
}
// =============================================================================
// Examples
// =============================================================================
Console
Click to execute the code.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä