Yleiskatsaus
Nostaminen Private Channels -palvelusta on kaksivaiheinen prosessi. Ensin käyttäjä polttaa kanavan puolen token-saldon kutsumalla WithdrawFunds-funktiota Withdraw-ohjelmassa. Toiseksi operaattori kutsuu ReleaseFunds-funktiota Escrow-ohjelmassa (devnet, tässä ohjeessa) kelvollisella Sparse Merkle Tree -poissulkemistodistuksella varojen vapauttamiseksi. SMT-todistus varmistaa, että jokaista nostononcea voidaan käyttää vain kerran, estäen kaksinkertaisen kulutuksen.
Vaihe 1: Käynnistä nosto kanavalla
Kutsu WithdrawFunds-funktiota Withdraw-ohjelmassa polttaaksesi kanavan puolen saldon.
Käytä Async-varianttia, joka johtaa automaattisesti tokenAccount-PDA:n ja on
suositeltu muoto tuotantokäyttöön:
import { getWithdrawFundsInstructionAsync } from "../private-channel-withdraw-program/clients/typescript/src/generated";import {createSolanaRpc,address,pipe,createTransactionMessage,setTransactionMessageFeePayerSigner,setTransactionMessageLifetimeUsingBlockhash,appendTransactionMessageInstruction,signAndSendTransactionMessageWithSigners,assertIsTransactionMessageWithSingleSendingSigner,getBase58Decoder} from "@solana/kit";// Point to the gateway, not a public Solana RPCconst privateChannelRpc = createSolanaRpc("http://localhost:8899");const withdrawIx = await getWithdrawFundsInstructionAsync({user: userSigner,mint: address(mintAddress),amount: 1_000_000n, // 1 USDC (6 decimals)destination: null // null = release to signer's devnet wallet});const { value: latestBlockhash } = await privateChannelRpc.getLatestBlockhash({ commitment: "confirmed" }).send();// Sent to the Private Channels gateway (not Solana RPC directly), which// expects the legacy transaction format - do not switch this to version 0.const transactionMessage = pipe(createTransactionMessage({ version: "legacy" }),(m) => setTransactionMessageFeePayerSigner(userSigner, m),(m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),(m) => appendTransactionMessageInstruction(withdrawIx, m));assertIsTransactionMessageWithSingleSendingSigner(transactionMessage);const signatureBytes =await signAndSendTransactionMessageWithSigners(transactionMessage);const signature = getBase58Decoder().decode(signatureBytes);console.log("Withdrawal initiated:", signature);
- Withdraw-ohjelman tunnus:
J231K9UEpS4y4KAPwGc4gsMNCjKFRMYcQBcjVW7vBhVi - Lähetä tämä transaktio yhdyskäytävään (
http://localhost:8899), ei julkiseen Solana RPC:hen - Jos
destinationon annettu, vapautetut varat siirretään kyseiseen lompakkoon allekirjoittajan sijaan
Mitä odottaa
Mitään lisätoimia ei tarvita WithdrawFunds-kutsun jälkeen. Operaattoripalvelut
käsittelevät selvityksen automaattisesti:
indexer-private-channelpollaa kanavaa joka sekunti polttotapahtumien varalta ja kirjoittaa odottavan nostotietueen, kun omasi havaitaanoperator-private-channelpollaa tietokantaa joka sekunti odottavien tietueiden varalta ja lähettääReleaseFunds-funktion Escrow-ohjelmalle Solana devnetissä tarvittavalla SMT-poissulkemistodistuksella; se pollaa devnet-vahvistusta enintään 5 kertaa 400 ms:n välein ennen uudelleenyritystä
Varat näkyvät tavallisesti devnet-lompakossasi muutaman sekunnin kuluessa normaaliolosuhteissa.
Kuinka operaattori suorittaa selvityksen (viite)
Kanavan puolen polton jälkeen valmisteltu operaattori täytyy kutsua ReleaseFunds-funktiota
Escrow-ohjelmassa kelvollisella SMT-poissulkemistodistuksella; operaattori ei voi vapauttaa
varoja ilman todistusta siitä, että nostononcea ei ole käytetty aiemmin. Tämän vaiheen
käsittelee automaattisesti operator-private-channel; sinun ei tarvitse kutsua
sitä itse.
Operaattori toimittaa:
amount: täytyy vastata poltettua määrääuser: vastaanottajan lompakko devnetissänew_withdrawal_root: päivitetty SMT-juuri tämän noston jälkeentransaction_nonce: yksilöllinen nonce tälle lehdellesibling_proofs: 512 tavua (16 x 32-tavun sisarustiivisteet puutodistukselle)
Vahvista
Kun operaattorikutsu vahvistuu, tarkista devnet-token-saldosi:
spl-token balance <MINT_ADDRESS> --owner <YOUR_WALLET>
Tai RPC:n kautta:
import { createSolanaRpc, address } from "@solana/kit";import { findAssociatedTokenPda } from "@solana-program/token";const TOKEN_PROGRAM_ADDRESS = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");// Query devnet directly; ReleaseFunds settles here, not through the gatewayconst rpc = createSolanaRpc("https://api.devnet.solana.com");const [yourDevnetAta] = await findAssociatedTokenPda({mint: address(mintAddress),owner: address(userSigner.address),tokenProgram: TOKEN_PROGRAM_ADDRESS});const balance = await rpc.getTokenAccountBalance(yourDevnetAta).send();console.log(balance.value.uiAmountString);
Olet suorittanut pika-aloituksen
Olet suorittanut koko Private Channels -syklin devnetissä: tallettanut SPL-tokenit escrow'hun, lähettänyt ketjun ulkopuolisen siirron yhdyskäytävän kautta ja nostanut varat takaisin devnet-lompakkoosi.
Kanavan elinkaari
Ymmärrä osallistujat ja koko talletus-nostoon-kulku perusteellisesti.
Todennus ja roolit
Lisää JWT-todennus integraatioosi.
Varojen vapautuksen viite
Täydellinen ReleaseFunds-ohjeen viite operaattorityökaluille.
Sparse Merkle Tree
Ymmärrä, kuinka nostotodistukset estävät kaksinkertaisen kulutuksen.
Is this page helpful?