Solana拥堵问题:如何高效发送Solana交易

  • Helius
  • 发布于 2024-11-13 12:50
  • 阅读 18

本文介绍了在Solana网络拥堵时如何有效发送交易的策略,包括使用优先级费用、计算单元优化、序列化交易和账户密钥等技术,并提供了代码示例和高级策略。

5分钟阅读

2024年11月11日

介绍

“交易模拟失败:未找到区块哈希。” “发送交易失败。” 这些错误信息已经变得过于熟悉。网络拥堵使得即使是基本的交易也变成了运气游戏。这种痛苦是没有必要的。

本指南探讨在高流量期间有效导航以确保交易成功的简单策略。我们将涵盖处理网络拥堵的全面方法,包括 优先费用计算单元优化 和 Helius 独家秘技,用于确保交易成功。

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

  • 使用序列化交易进行优先费用
  • 使用账户密钥进行优先费用
  • 高级优先费用策略
  • 交易优化技术
  • 利用质押的端点确保交付

今天已安全标记,避免 Solana 拥堵

优先费用

优先费用作为一种竞标机制,使你能够向验证者发出交易重要性信号。这些费用以 微兰波特 为单位,基于每个 计算单元 定价,取决于你的交易所交互的具体账户,为每个账户创造独立的费用市场。通过基于账户特定拥堵策略地设置这些费用,你可以显著提高交易被包含在下一个区块的几率。

接下来,我们将看看如何使用 Helius 的 优先费用 API 正确设置优先费用的各种方法:

序列化交易

设置优先费用最简单的方法是使用序列化交易。序列化交易是转换为可以在网络上传输的线性格式缓冲区的交易的二进制表示。

1. 序列化你的交易并将其传递给 API:

代码

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;

2. 将推荐费用添加到你的交易中——指令的顺序无关紧要:

代码

transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: priorityFee
  })
);

账户密钥

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

1. 从你的交易中提取账户密钥:

代码

const transaction = new Transaction();

// 将指令添加到交易中

// 从交易中提取所有账户密钥
const accountKeys = transaction.compileMessage().accountKeys;

// 将 PublicKeys 转换为 base58 字符串
const publicKeys = accountKeys.map(key => key.toBase58());

2. 将账户密钥传递给优先费用 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;

3. 将推荐费用添加到你的交易:

代码

transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: priorityFee
  })
);

虽然两种方法都有效,但推荐使用序列化交易方法。使用账户密钥要求手动跟踪和包含所有相关账户,这可能导致估计费用不准确,如果遗漏了任何账户。

序列化交易方法通过自动包含所有必要账户,基于完整的交易上下文提供更准确的费用估算,从而消除了这种风险。

高级优先费用策略

对于大多数场景,使用序列化交易和推荐的优先费用就足够了。然而,对于更细粒度的控制,优先费用 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: [{\
      transaction: serializedTx,\
      options: {\
        includeAllPriorityFeeLevels: true\
      }\
    }]
  }),
});

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

这将返回一个具有不同优先级水平的对象:

代码

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

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

  • min: 第 0 百分位
  • low: 第 25 百分位
  • medium: 第 50 百分位
  • high: 第 75 百分位
  • veryHigh: 第 95 百分位
  • unsafeMax: 第 100 百分位(小心使用)

为了进一步提高交易成功率,考虑使用 highvery high 优先级。然而,使用更高的优先级水平时要小心,尤其是 veryHighunsafeMax,因为它们可能显著增加交易成本。

注意

使用 recommended: true 选项时,如果中位数超过 10,000,API 将返回中位(第 50 百分位)优先费用。如果中位数小于 10,000,API 将返回 10,000。这确保了你交易的基线优先费用。

空槽评估

最近对优先费用 API 的更新允许通过考虑空槽来进行更智能的费用估算。当区块中没有特定账户的交易时,你可以配置 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: [{\
      transaction: serializedTx,\
      options: {\
        recommended: true,\
        evaluateEmptySlotAsZero: true\
      }\
    }]
  }),
});

当启用 evaluateEmptySlotAsZero 时,API:

  • 识别没有交易的账户区块
  • 将这些空槽计作零费用
  • 在低拥堵期间随之下调估计
  • 防止在网络活动低时过度支付

交易优化策略

除了优先费用,优化交易还涉及几个关键组件,协同工作以提高成功率:

计算单元管理

1. 使用 Helius SDK 获取交易的最佳计算单元

代码

const response = await helius.rpc.getComputeUnits({
  transaction: serializedTransaction
});

const computeUnits = response.computeUnits;

2. 将计算单元限制添加到你的交易中:

代码

transaction.add(
  ComputeBudgetProgram.setComputeUnitLimit({
    units: computeUnits
  })
);

确认级别

确认级别

对于大多数应用程序,使用 processed 确认级别提供了最佳平衡。它:

  • 提供最快的确认时间
  • 对大多数用例提供足够的安全性
  • 减少区块哈希过期的风险
  • 在拥堵期间最小化丢失交易的可能性

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

RPC 配置

maxRetries 设置为 0,并实现自己的重试逻辑,以更好地控制交易的重新提交。使用 skipPreflight: true 来降低延迟。这在高拥堵期间尤为有效:

代码

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

使用质押的端点

Helius 质押的端点 提供直接且有保障的质押连接访问,无需手动优化优先费用:

代码

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

// 交易将以最佳优先级处理
const signature = await connection.sendTransaction(transaction);

质押端点:

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

结论

有效使用优先费用对于在 Solana 上成功进行交易至关重要,特别是在网络拥堵期间。通过利用 Helius 优先费用 API 并实施所讨论的策略,你可以显著提高交易成功率,同时平衡成本考虑。保持信息灵通,并根据网络状况进行调整,以获得最佳结果。

如果你读到这里,感谢你!我们希望本指南能帮助你了解如何优化在 Solana 上的交易。请务必订阅我们的时事通讯,以便你不会错过关于 Solana 最新动态的更新。

准备更深入地探讨吗?

探索 Helius 博客 上的最新文章,并继续你的 Solana 之旅。

  • 原文链接: helius.dev/blog/solana-c...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/