在Solana上铸造SPL代币时遭遇TransactionExpiredBlockheightExceededError错误
解决Solana铸造SPL代币时的TransactionExpiredBlockheightExceededError错误
这个错误本质是交易在设定的区块高度有效期内未被网络打包确认,以下是针对性的排查和解决方法:
1. 调整交易区块高度过期阈值
Umi默认的区块高度过期容错范围可能过小,尤其是在网络拥堵时。可以在sendAndConfirm方法中手动配置更大的区块高度距离,给交易足够的打包时间:
await createAndMint(umi, { mint, authority: umi.identity, name: metadata.name, symbol: metadata.symbol, uri: metadata.uri, sellerFeeBasisPoints: percentAmount(0), decimals: 8, amount: 1000000, tokenOwner: userWallet.publicKey, tokenStandard: TokenStandard.Fungible, }).sendAndConfirm(umi, { confirmationOptions: { strategy: { type: 'blockheight', blockheight: await umi.rpc.getLatestBlockhash(), maxSlotDistance: 200, // 增大这个值,默认通常为50-100 }, maxRetries: 50, // 增加重试次数 commitment: 'confirmed' } });
2. 提升交易优先级(手续费)
当Solana网络拥堵时,低手续费的交易容易被延迟处理。可以手动设置更高的计算单元价格,让交易被优先打包:
// 获取最新区块哈希时同步配置优先费用 const latestBlockhash = await umi.rpc.getLatestBlockhash({ commitment: 'confirmed', minContextSlot: 0 }); await createAndMint(umi, { // 保留原有参数 }).sendAndConfirm(umi, { blockhash: latestBlockhash.blockhash, lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, computeUnitPrice: 20000, // 单位为lamports,根据网络拥堵情况调整,默认通常是5000 });
3. 检查并更换RPC节点
如果使用的QuickNode节点同步延迟高或稳定性差,会导致交易广播后无法及时被打包。可以尝试:
- 切换到QuickNode的其他区域节点(比如从美东节点换为新加坡节点)
- 临时替换为Solana官方公共节点测试:
- Devnet:
https://api.devnet.solana.com - Mainnet:
https://api.mainnet-beta.solana.com
- Devnet:
修改节点URL的代码:
const umi = createUmi('https://api.devnet.solana.com'); // 替换为测试节点
4. 移除冗余依赖
你的脚本中引入了mplCandyMachine但并未使用,这可能增加不必要的初始化开销,建议移除相关代码:
// 删除以下两行冗余代码 import { mplCandyMachine } from "@metaplex-foundation/mpl-candy-machine"; umi.use(mplCandyMachine());
5. 确认本地网络稳定性
不稳定的网络会导致交易广播延迟,建议检查本地网络连接,或尝试使用有线网络代替WiFi。
内容的提问来源于stack exchange,提问作者Erik Johnson
相关产品推荐
相关产品推荐

