Maison >interface Web >js tutoriel >Aidez à rendre la transaction Solana plus rapide

Aidez à rendre la transaction Solana plus rapide

WBOY
WBOYoriginal
2024-08-13 13:22:251006parcourir

Help make Solana Transaction faster

aidez-moi à accélérer la transaction Solana
`async sendSplTransaction(wallet, {to, value, mintAddress, decimals, fee}) {
const destinatairePubKey = new PublicKey(to);
const mintPubKey = new PublicKey(mintAddress);
const bigValue = this.convertToBigInt(value, décimales);
const recentBlockhash = wait this.provider.connection.getLatestBlockhash();
let currentBlockheight = wait this.provider.connection.getBlockHeight();
const { blockhash } = wait this.provider.connection.getLatestBlockhash();
const MAX_RETRIES = 3;
laissez retryCount = 0;

    while (retryCount < MAX_RETRIES) {
        try {
            const senderATA = await getAssociatedTokenAddress(mintPubKey, this.keypair.publicKey);
            const recipientATA = await getAssociatedTokenAddress(mintPubKey, recipientPubKey);

            console.log('Sender pubkey:', this.keypair.publicKey.toString());
            console.log('Sender ATA:', senderATA.toString());
            console.log('Mint address:', mintAddress);

            let senderAccountInfo =  await this.provider.connection.getAccountInfo(senderATA);

            if (!senderAccountInfo) {
                console.log('Sender ATA not found. Attempting to create...');
                const transaction = new Transaction().add(
                    createAssociatedTokenAccountInstruction(
                        this.keypair.publicKey,
                        senderATA,
                        this.keypair.publicKey,
                        mintPubKey
                    )
                );
                await solanaWeb3.sendAndConfirmTransaction(this.provider.connection, transaction, [this.keypair]);
                console.log('Sender ATA created successfully');
            }

            const senderBalance = await this.provider.connection.getTokenAccountBalance(senderATA);
            console.log('Sender token balance:', senderBalance.value.uiAmount);

            if (senderBalance.value.uiAmount < value) {
                throw new Error(`Insufficient balance. Current balance: ${senderBalance.value.uiAmount}`);
            }

            const transaction = new Transaction({
                recentBlockhash: recentBlockhash.blockhash,
                feePayer: this.keypair.publicKey
            });
            transaction.recentBlockhash = blockhash;
            transaction.feePayer = this.keypair.publicKey;
            transaction.fee = fee;

            const recipientAccountInfo = await this.provider.connection.getAccountInfo(recipientATA);

            if (!recipientAccountInfo) {
                transaction.add(
                    createAssociatedTokenAccountInstruction(
                        this.keypair.publicKey,
                        recipientATA,
                        recipientPubKey,
                        mintPubKey
                    )
                );
            }

            transaction.add(
                createTransferInstruction(
                    senderATA,
                    recipientATA,
                    this.keypair.publicKey,
                    bigValue,
                    [],
                    TOKEN_PROGRAM_ID
                )
            );

            transaction.lastValidBlockHeight = currentBlockheight + 150;

            const txid = await solanaWeb3.sendAndConfirmTransaction(
                this.provider.connection,
                transaction,
                [this.keypair],
                {
                    commitment: "confirmed",
                    skipPreflight: true
                }
            );

            console.log('Transaction successful. Txid:', txid);
            return { success: true, data: { txid } };
        } catch (error) {
            if (error.message.includes('block height')) {
                retryCount++;
                const MAX_RETRY_DELAY = 30000;
                const delay = Math.min(2 ** retryCount * 1000, MAX_RETRY_DELAY);
                console.log(`Transaction failed, retrying in ${delay / 1000} seconds...`);
                await new Promise(resolve => setTimeout(resolve, delay));
            } else {
                return { success: false, data: null, error: error.message };
            }
        }
    }

    return { success: false, data: null, error: 'Transaction retries exhausted.' };
}`

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn