You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Solana confirmTransaction触发CSP(content-src:self)违规,求解决

解决confirmTransaction触发CSP违规的方案

最优方案:替换为轮询getSignatureStatuses

官方的confirmTransaction方法在部分场景下会触发content-src: self的CSP违规,大概率是因为内部使用了动态代码执行(如eval、new Function)或者WebSocket订阅逻辑,超出了CSP的限制。改用轮询getSignatureStatuses的方式可以彻底规避这个问题,同时保证交易确认后再更新余额。

修改后的代码如下:

const sendTransaction = async (
    transaction: Transaction | VersionedTransaction,
    connection: Connection,
    options?: SendTransactionOptions
) => {
    // 调用原sendTransaction方法获取签名
    const signature = await originalSendTransaction.call(
        provider,
        transaction,
        connection,
        options
    );

    // 自定义交易确认逻辑:轮询签名状态
    const waitForTxConfirmation = async (sig: string) => {
        let txStatus;
        // 每秒轮询一次,直到交易完成或失败
        do {
            await new Promise(resolve => setTimeout(resolve, 1000));
            const statusResult = await connection.getSignatureStatuses([sig]);
            txStatus = statusResult.value[0]?.status;
        } while (!txStatus || txStatus.type === 'processing');

        // 处理交易失败的情况
        if (txStatus.type === 'error') {
            throw new Error(`交易执行失败:${JSON.stringify(txStatus.error)}`);
        }
    };

    // 等待交易确认
    await waitForTxConfirmation(signature);
    // 确认后同步余额
    this.syncBalance(this.getAddress() ?? '');

    return signature;
};

可选方案(不推荐):调整CSP规则

如果业务场景允许放宽CSP限制,可以在content-src中添加'unsafe-eval'(针对动态代码执行的情况),或者添加对应Solana RPC节点的域名(针对跨域请求的情况)。但这种做法会降低页面的安全性,仅建议在测试环境临时使用。

例如修改CSP头部:

Content-Security-Policy: content-src 'self' 'unsafe-eval';

内容的提问来源于stack exchange,提问作者valentine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:42:39