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 validator khi 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 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. 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 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
Một 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 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 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á đơn vị tính toán × Giới hạn đơn vị tính toán
Phí ưu tiên được sử dụng để xác định độ ư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:
Độ ưu tiên giao dịch = 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 lệnh đượ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 lệnh ComputeBudgetInstruction::set_compute_unit_limit trong giao dịch của bạn.
Để tính toán giới hạn đơn vị tính toá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% 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 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ể xem 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 lệnh
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 các SDK của Solana.
| SDK | Tham khảo 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);
Console
Click to execute the code.
Is this page helpful?