调用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
相关产品推荐
相关产品推荐

