Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
Solana 交易是一組以原子方式執行的指令。理解交易結構——指令、帳戶、簽署者、計算預算——是使用 Raydium 進行構建、除錯或最佳化的前提。本頁涵蓋該結構、限制條件,以及兩類費用(Solana 網路費用、Raydium 協議費用)在實際交換中的堆疊方式。

交易結構

Solana 交易有三個核心組件:
  • 訊息:有序的指令列表、這些指令引用的帳戶,以及最近的區塊雜湊。
  • 簽名:每個簽署者一個,證明交易已獲授權。
  • 最近區塊雜湊:證明交易是最近的;具有過期區塊雜湊(超過 150 個槽)的交易會被拒絕。

指令

指令指定:
  • program_id — 要調用的程式。
  • accounts — 程式可能接觸的帳戶(及其可寫/簽署者標誌)。
  • data — 程式解釋的不透明位元組。
單個交易可以包含多個指令。它們按順序執行;如果任何一個失敗,所有先前的指令都會回滾(原子性)。 典型的 Raydium 交換交易包括:
  1. ComputeBudget::SetComputeUnitLimit — 提高預設 CU 限制。
  2. ComputeBudget::SetComputeUnitPrice — 設定優先費用。
  3. 可選的 CreateAssociatedTokenAccount — 如果使用者沒有輸出 ATA,則建立一個。
  4. Raydium::SwapBaseInput — 執行交換。
  5. 可選的 CloseAccount — 關閉包裝的 SOL ATA。
SDK 會自動打包這些——透過池類型自己的建構器(raydium.cpmm.swap、raydium.clmm.swap、raydium.liquidity.swap),或用於多跳路由的 raydium.tradeV2.swap。

交易中的帳戶

交易中任何指令接觸的每個帳戶都必須列在交易的帳戶金鑰中。每個帳戶都被標記為:
  • 簽署者/非簽署者:帳戶所有者是否必須簽署交易?
  • 可寫/唯讀:交易是否可以修改帳戶?
執行時強制執行這些標誌:嘗試寫入不可寫帳戶的程式會失敗,執行時會拒絕缺少必需簽署者的交易。 對於 CPMM 交換,帳戶列表有約 13 個條目(見 solana-fundamentals/account-model)。具有多個 tick 陣列交叉的 CLMM 交換可能有 20 個以上。

交易大小限制

Solana 將交易限制在 1232 位元組,包括簽名、訊息和標頭。這是複雜交易最常見的障礙——Raydium 的 CLMM 與多跳路由經常接近此限制。 典型的 ~1000 位元組 Raydium 交換的分解:

地址查詢表(ALT)

ALT 允許交易透過 1 位元組索引引用已發佈表中的帳戶,而不是完整的 32 位元組公鑰。這大幅壓縮交易:
  • 直接引用 20 個帳戶的交易:~640 B 的公鑰。
  • 使用 ALT 的相同交易:~20 B 的索引 + ALT 參考。
Raydium 在主網上為 CPMM/CLMM 交換路徑維護 ALT。SDK 會自動使用它們。構建多跳路由的聚合器大量依賴它們。

計算預算

每個交易都有一個計算單位(CU)預算。超過它會終止執行並使交易失敗。
  • 預設值:每個交易 200,000 CU。
  • 最大值:每個交易 1,400,000 CU(透過 ComputeBudget::SetComputeUnitLimit 提高)。
  • 每區塊上限:每個區塊 48M CU(協議級別)。
典型的 Raydium CU 消耗(見 integration-guides/priority-fee-tuning 的完整表格): 始終透過 ComputeBudget 設定明確的 CU 限制;否則你會得到 200k 預設值,這對大多數 Raydium 指令來說太低了。
如果你設定的 CU 限制太低,交易在達到上限時會失敗;設定太高則冒著在擁塞下被降低優先級的風險(根據定價模型,你可能需要為從未使用的計算付費)。

優先費用

除了基本交易費用(每個簽名 5000 lamports),驗證者越來越多地優先考慮支付優先費用的交易:每 CU 的微 lamports 小費。
例如:10,000 µL/CU × 300,000 CU = 3,000,000 µL = 0.003 SOL。 優先費用是本地的——它們只影響區塊內的排序;它們不會改善你被納入與否的機會。在擁塞期間設定合理的優先費用至關重要。
見 integration-guides/priority-fee-tuning 了解如何動態調整此值。

指令計數和帳戶計數限制

除了 1232 位元組的總限制:
  • 每個交易的最大帳戶數:128。
  • 每個指令的最大帳戶數(CPI):64。
  • 每個交易的最大指令數:無硬限制,僅受大小限制約束。
  • 最大 CPI 深度:4(一個程式可以呼叫另一個,它可以呼叫另一個,4 層深)。
跨越多個 tick 陣列的 Raydium CLMM 交換可能會對帳戶限制施加很大壓力——單個交換接觸池、輸入/輸出保管庫、輸入/輸出 ATA、多個 tick 陣列、可能是轉移掛鉤程式的額外帳戶,加上強制的計算預算/系統/代幣程式參考。透過 CPI 組合 Raydium 的設計(例如自動複合器)需要考慮這一點。

Raydium 交換中的費用類別

使用者交換交易在兩個類別中支付費用:

Solana 網路費用

支付給驗證者的 SOL。
  • 基本簽名費用:每個簽名 5000 lamports。幾乎總是 1 個簽名 = 0.000005 SOL。
  • 優先費用:CU 價格 × CU 限制(以微 lamports 計)。隨擁塞而變化;見 integration-guides/priority-fee-tuning。
這些費用流向驗證者,與 Raydium 無關,即使對於失敗的交易也會收取(除了某些優先費用邊界情況)。

Raydium 協議費用

從交換金額中扣除。
  • 交換費用:輸入的百分比(CPMM 典型 0.25%,CLMM 0.01%–1% 每層)。在 LP 和協議目的地之間分割。見 ray/protocol-fees。
這些費用是 Raydium 會計內部的——使用者將其視為比零費用池產生的輸出金額更小。

範例:$1000 USDC → SOL 透過 CPMM 0.25% 層級

滑點(價格影響 + 市場變動)不是費用,但會影響相同的底線。

版本化交易

Solana 有兩種交易格式:
  • 舊版:原始格式,不支援 ALT。
  • v0(版本化):支援 ALT,可擴展到未來版本。
所有現代 Solana 工具都使用 v0。Raydium SDK 預設發出 v0 交易。

區塊雜湊新鮮度

交易必須包含最後 ~150 個槽(~60 秒)內的區塊雜湊。超過該窗口,驗證者會拒絕它。 對於重試迴圈,在每次重試時獲取新的區塊雜湊:
見 integration-guides/priority-fee-tuning 了解完整的重試升級費用模式。

平行執行

Solana 在多核驗證者上平行執行不衝突的交易。如果兩個交易都寫入相同帳戶,則它們衝突。 對 Raydium 的影響:
  • 同一池上的兩個交換無法平行執行——兩者都寫入池狀態。
  • 池 A 上的交換和池 B 上的交換如果帳戶列表不重疊則平行執行。
  • 唯讀交易永遠不會阻止同一帳戶上的寫入者(唯讀與自身並行,但不與寫入並行)。
這就是為什麼 Solana 儘管單池序列化仍能維持高 DEX 吞吐量。

交易確認級別

提交交易時,你選擇一個確認級別: 對於交換 UX,confirmed 是標準的。對於處理大價值的操作(池建立、獎勵補充),finalized 更安全。

模擬

Solana 支援在提交前模擬交易:
Raydium SDK 在計算 getBestSwapInfo 時在內部使用模擬來驗證選定的路由確實成功。模擬不是免費的——它消耗 RPC 容量——但它在支付前捕捉錯誤。

指標

來源: