Phí giao dịch
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ồi thường cho các validator để xử lý giao dịch. Phí ưu tiên là một khoản phí tùy chọn, để tăng cơ hội rằng người lãnh đạo hiện tại sẽ xử lý giao dịch của bạn.
Phí cơ bản
Mỗi giao dịch có chi phí 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 và phải được thanh toán bởi một tài khoản thuộc sở hữu của System Program. Phí cơ bản được chia như sau:
- 50% bị đốt: Một nửa bị đốt (lấy ra khỏi nguồn cung SOL đang lưu hành).
- 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 cơ hội rằng người lãnh đạo hiện tại (validator) sẽ xử lý giao dịch của bạn. Validator nhận được 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:
Phí ưu tiên = Giới hạn đơn vị tính toán × Giá đơn vị tính toán
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 toán bằng công thức sau:
Mức độ ưu tiên = Phí ưu tiên / Giới hạn đơn vị tính toán
Giới hạn đơn vị tính toán
Theo mặc định, mỗi hướng dẫn đượ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 hướng dẫn ComputeBudgetProgram::set_compute_unit_limit trong giao dịch của bạn.
Để tính toán giới hạn CU thích 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% biên độ 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ố đơ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ả tiền 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à một khoản tiền tùy chọn tính bằng 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 tiền boa để 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 hướng dẫn ComputeBudgetProgram.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 hỗ trợ 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 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 cho một giao dịch sử dụng Solana SDKs.
| SDK | Tham khảo mã nguồn |
|---|---|
| web3.js (Typescript) | setComputeUnitPrice |
| agave-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?