Solana 拥塞:如何最佳地发送 Solana 交易

介绍“交易模拟失败:未找到区块哈希。”“无法发送交易。”这些错误信息已经变得太常见了。网络拥堵甚至让最基本的交易也变成了一场机会游戏。这种痛苦是不必要的。本指南探讨了有效应对高流量时段的简单策略,以确保您的交易顺利完成。我们将介绍处理网络拥塞的综合方法,包括[优先费用]、[计算单元优化]和H

<!--StartFragment-->

介绍

“交易模拟失败:未找到区块哈希。”“无法发送交易。”这些错误信息已经变得太常见了。网络拥堵甚至让最基本的交易也变成了一场机会游戏。这种痛苦是不必要的。

本指南探讨了有效应对高流量时段的简单策略,以确保您的交易顺利完成。我们将介绍处理网络拥塞的综合方法,包括[优先费用]、[计算单元优化]和 Helius 独家秘密破解,以确保您的交易始终顺利完成。 <!--EndFragment-->

<!--StartFragment-->

在本指南中,我们将探讨:

- 使用序列化交易获取优先费用

- 使用账户密钥获取优先费用

- 先进的优先费用策略

- 交易优化技术

- 利用质押端点保证交付 <!--EndFragment--> <!--StartFragment-->

优先费用

优先费用是一种竞标机制,可让您向验证者表明交易的重要性。这些费用以每[计算单位][微兰波特 (micro-lampport)]为单位定价,由您的交易与之交互的特定账户决定,为每个账户创建独立的费用市场。通过根据特定账户的拥堵情况策略性地设置这些费用,您可以显著提高您的交易被纳入下一个区块的机会。 <!--EndFragment--> <!--StartFragment-->

序列化交易

设置优先费用的最直接方法是使用序列化交易。序列化交易是将交易的二进制表示转换为可通过网络传输的线路格式缓冲区。

  1. 序列化您的交易并将其传递给 API: <!--EndFragment-->
const serializedTx = transaction.serialize();

const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      transaction: serializedTx,
      options: { recommended: true }
    }]
  }),
});

const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;

<!--StartFragment-->

  1. 将建议费用添加到您的交易中 — 指令的顺序并不重要: <!--EndFragment-->
transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: priorityFee
  })
);

<!--StartFragment-->

帐户密钥

另一种方法是向优先费用 API 提供参与交易的账户密钥列表:

1.从您的交易中提取账户密钥: <!--EndFragment-->

const transaction = new Transaction();

// Add your instructions to the transaction

// Extract all account keys from the transaction
const accountKeys = transaction.compileMessage().accountKeys;

// Convert PublicKeys to base58 strings
const publicKeys = accountKeys.map(key => key.toBase58());

<!--StartFragment-->

  1. 将账户密钥传递给优先费用 API:
const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      accountKeys: publicKeys,
      options: { recommended: true }
    }]
  }),
});

const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;

<!--StartFragment-->

  1. 将建议费用添加到您的交易中:
transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: priorityFee
  })
);

<!--StartFragment-->

虽然两种方法都有效,但建议使用序列化交易方法。使用帐户密钥需要手动跟踪并包括所有相关帐户,如果遗漏任何帐户,则可能导致费用估算不准确。 

序列化交易方法通过自动包含所有必要的账户并根据完整的交易背景提供更准确的费用估算来消除这种风险。 <!--EndFragment--> <!--StartFragment-->

高级优先费用策略

对于大多数情况,使用序列化交易和推荐的优先费用就足够了。但是,为了进行更精细的控制,优先费用 API 允许您请求不同优先级的估算并启用[空槽评估]。

优先级

以下是如何申请所有优先费用级别]的示例: <!--EndFragment-->

const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      transaction: serializedTx,
      options: {
        includeAllPriorityFeeLevels: true
      }
    }]
  }),
});

const { result } = await response.json();
console.log(result.priorityFeeLevels);

<!--StartFragment-->

这将返回具有不同优先级的对象:

{
  "priorityFeeLevels": {
    "min": 10000.0,
    "low": 10000.0,
    "medium": 10000.0,
    "high": 100000.0,
    "veryHigh": 5483924.800000011,
    "unsafeMax": 8698904817.0
  }
}

<!--StartFragment-->

优先级别对应最近交易费用的不同百分位数:

  • 最小值:第 0 百分位数
  • :第 25 百分位
  • 中等:第 50 百分位
  • :75 百分位
  • veryHigh:第 95 百分位
  • unsafeMax:第 100 个百分位数(谨慎使用)

<!--EndFragment--> <!--StartFragment-->

为了进一步提高交易的落地率,可以考虑使用非常高的优先级。但是,使用更高的优先级时要谨慎,尤其是veryHighunsafeMax,因为它们会显著增加交易成本。

注意:使用推荐:true选项时,如果优先费用超过 10,000,API 将返回中等(第 50 百分位)优先费用。如果中等费用低于 10,000,API 将返回 10,000。这可确保您的交易具有基准优先费用。

空槽评估

优先费用 API 的最新更新允许通过考虑空位来更智能地估算费用。当区块不包含特定帐户的交易时,您可以配置 API 以[评估这些空位是否具有零费用],从而在网络活动较少时提供更准确的估算: <!--EndFragment-->

const response = await fetch(heliusEndpoint, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 'helius-example',
    method: 'getPriorityFeeEstimate',
    params: [{
      transaction: serializedTx,
      options: {
        recommended: true,
        evaluateEmptySlotAsZero: true
      }
    }]
  }),
});

<!--StartFragment-->

启用assessEmptySlotAsZero后,API:

  • 识别你的账户中没有交易的区块
  • 将这些空位视为零费用
  • 在交通拥堵程度较低时下调估计值
  • 网络活动较少时防止支付过多费用 <!--EndFragment--> <!--StartFragment-->

交易优化策略

除了优先费用之外,优化交易还涉及几个关键要素,它们共同作用以提高落地率:

计算单元管理

  1. 使用 Helius SDK获取适合您交易的[最佳计算单元:] <!--EndFragment-->
const response = await helius.rpc.getComputeUnits({
  transaction: serializedTransaction
});

const computeUnits = response.computeUnits;

<!--StartFragment-->

  1. 为您的交易添加计算单位限制:
transaction.add(
  ComputeBudgetProgram.setComputeUnitLimit({
    units: computeUnits
  })
);

<!--StartFragment-->

承诺水平

<!--EndFragment--> <!--StartFragment-->

对于大多数应用程序来说,使用已处理的承诺级别可以提供最佳平衡。它:

  • 提供最快的确认时间
  • 对于大多数用例来说是否具有足够的安全性
  • 降低区块哈希过期的风险
  • 最大限度地减少拥堵期间的交易丢失

始终使用相同的承诺级别来发送和确认交易,以保持应用程序行为的一致性。

<!--EndFragment--> <!--StartFragment-->

RPC 配置

将maxRetries设置为 0 并实现您自己的重试逻辑,以便更好地控制事务重新提交。使用skipPreflight: true来减少延迟。这在高拥堵时期尤其有用:

<!--EndFragment-->

const signature = await connection.sendTransaction(transaction, {
  maxRetries: 0,
  skipPreflight: true
});

<!--StartFragment-->

使用质押端点

质押端点提供对质押连接的直接、保证访问,从而无需手动优化优先费用 <!--EndFragment-->

const connection = new Connection(
  'https://staked.helius-rpc.com?api-key=YOUR_API_KEY'
);

// Transaction will be processed with optimal priority
const signature = await connection.sendTransaction(transaction);

<!--StartFragment-->

质押端点:

  • 提供有保障的带宽
  • 减少拥堵期间的交易失败
  • 通过专用基础设施提供更快的交易传播

<!--EndFragment--> <!--StartFragment-->

结论

有效使用优先费用对于在 Solana 上成功完成交易至关重要,尤其是在网络拥堵期间。通过利用 优先费用 API 并实施讨论的策略,您可以显著提高交易成功率,同时平衡成本考虑。随时了解情况并适应网络条件以获得最佳结果。 <!--EndFragment-->

作者:https://t.me/+P3Z7P_xQxbNlZWZl 来源:https://www.fabipingtai.com

  • 原创
  • 学分: 5
  • 分类: Solana
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
加密女士
加密女士
无代码发币平台