Mỗi giao dịch Solana đều yêu cầu một khoản phí giao dịch, được thanh toán bằng SOL. Phí giao dịch được chia thành hai phần: phí cơ bản và phí ưu tiên. Phí cơ bản bù đắp cho các validator khi xử lý giao dịch. Phí ưu tiên là một khoản phí tùy chọn, nhằm tăng khả năng leader hiện tại sẽ xử lý giao dịch của bạn.
Phí cơ bản
Mỗi giao dịch tốn 5000 lamports cho mỗi chữ ký được bao gồm. Khoản phí này được thanh toán bởi người ký đầu tiên trong giao dịch. Chỉ các tài khoản thuộc sở hữu của System Program mới có thể thanh toán phí giao dịch. Phí cơ bản được phân chia như sau:
- 50% bị đốt: Một nửa bị đốt (loại bỏ khỏi nguồn cung SOL lưu thông).
- 50% được phân phối: Một nửa được trả cho validator đã xử lý giao dịch.
Phí ưu tiên
Phí ưu tiên là một khoản phí tùy chọn được sử dụng để tăng khả năng leader hiện tại (validator) sẽ xử lý giao dịch của bạn. Validator nhận 100% phí ưu tiên. Phí ưu tiên có thể được thiết lập bằng cách điều chỉnh giá đơn vị tính toán (CU) và giới hạn CU của giao dịch. (Xem hướng dẫn Cách sử dụng phí ưu tiên để biết thêm chi tiết về phí ưu tiên.)
Phí ưu tiên được tính như sau:
Prioritization fee = CU limit * CU price
Phí ưu tiên được sử dụng để xác định mức độ ưu tiên của giao dịch của bạn, so với các giao dịch khác. Nó được tính bằng công thức sau:
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
Giới hạn đơn vị tính toán
Theo
mặc định,
mỗi instruction được phân bổ
200.000 CU
và mỗi giao dịch được phân bổ
1,4 triệu CU.
Bạn có thể thay đổi các giá trị mặc định này bằng cách bao gồm một instruction
SetComputeUnitLimit
trong giao dịch của bạn.
Để tính toán giới hạn CU phù hợp cho giao dịch của bạn, chúng tôi khuyến nghị các bước sau:
- Ước tính số đơn vị CU cần thiết bằng cách mô phỏng giao dịch
- Thêm 10% dự phòng an toàn vào ước tính này
Phí ưu tiên được xác định bởi giới hạn đơn vị tính toán được yêu cầu trong giao dịch, không phải số lượng đơn vị tính toán thực tế được sử dụng. Nếu bạn đặt giới hạn đơn vị tính toán quá cao hoặc sử dụng số lượng mặc định, bạn có thể phải trả cho các đơn vị tính toán không sử dụng.
Giá đơn vị tính toán
Giá đơn vị tính toán là số lượng tùy chọn
micro-lamports được trả cho mỗi
CU được yêu cầu. Bạn có thể coi giá CU như một khoản tip để khuyến khích
validator ưu tiên giao dịch của bạn. Để đặt giá CU, hãy bao gồm một instruction
SetComputeUnitPrice
trong giao dịch của bạn.
Giá CU mặc định là 0, nghĩa là phí ưu tiên mặc định cũng là 0.
Để được trợ giúp xác định giá CU tốt nhất cho giao dịch của bạn, hãy xem khuyến nghị giá CU theo thời gian thực được liệt kê trong bảng dưới đây.
Ví dụ
Các ví dụ dưới đây cho thấy cách đặt giới hạn CU và giá CU trên một giao dịch sử dụng Solana SDK.
| SDK | Tham chiếu mã nguồn |
|---|---|
@solana/web3.js (Typescript) | ComputeBudgetProgram |
solana-sdk (Rust) | ComputeBudgetInstruction |
const limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,Keypair,Connection,ComputeBudgetProgram,sendAndConfirmTransaction} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = Keypair.generate();const recipient = new Keypair();const airdropSignature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(airdropSignature, "confirmed");// Create compute budget instructionsconst limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: recipient.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});// Add the compute budget and transfer instructions to a new transactionconst transaction = new Transaction().add(limitInstruction).add(priceInstruction).add(transferInstruction);const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);console.log("Transaction Signature:", signature);
Is this page helpful?