Phí giao dịch
Mỗi giao dịch Solana đều yêu cầu một khoản phí cơ bản (SOL) để bồi thường cho các validator khi xử lý giao dịch. Bạn cũng có thể trả một khoản phí ưu tiên tùy chọn để tăng khả năng leader hiện tại (validator) xử lý giao dịch của bạn.
Điểm chính
- Phí cơ bản cho một giao dịch là 5000 lamport cho mỗi chữ ký trên giao dịch.
- Phí ưu tiên (tùy chọn) là một khoản phí bổ sung bạn trả cho validator để tăng khả năng leader hiện tại xử lý giao dịch của bạn.
- Phí ưu tiên bằng: (giới hạn đơn vị tính toán * giá đơn vị tính toán).
- Giới hạn đơn vị tính toán là số đơn vị tính toán tối đa mà giao dịch của bạn có thể sử dụng.
- Giá đơn vị tính toán là giá cho mỗi đơn vị tính toán, tính bằng micro-lamport.
- 1.000.000 micro lamport = 1 lamport
- Người trả phí giao dịch phải là một tài khoản thuộc sở hữu của System Program.
Phí giao dịch cơ bản
Phí cơ bản là chi phí để gửi một giao dịch. Chi phí là 5000 lamport cho mỗi chữ ký được bao gồm trong giao dịch.
Phí cơ bản được trừ từ tài khoản của người trả phí giao dịch, đây là người ký đầu tiên trong giao dịch. Người trả phí phải là một tài khoản thuộc sở hữu của System Program.
- 50% Bị đốt: Một nửa phí cơ bản bị đốt.
- 50% 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 trả để tăng khả năng leader hiện tại xử lý giao dịch của bạn.
- SIMD-0096: Validator xử lý giao dịch nhận 100% phí ưu tiên.
Đơn vị tính toán và giới hạn
Khi một giao dịch được xử lý, nó sử dụng tài nguyên tính toán được đo bằng đơn vị tính toán (compute units - CU). Mỗi lệnh sẽ trừ vào ngân sách đơn vị tính toán của giao dịch.
- Giới hạn tối đa: Một giao dịch có thể sử dụng tối đa 1.4 triệu đơn vị tính toán.
- Giới hạn mặc định: Theo mặc định, mỗi lệnh có thể sử dụng tối đa 200,000 đơn vị tính toán.
- Giới hạn tùy chỉnh: Bạn có thể yêu cầu giới hạn đơn vị tính toán cụ thể bằng
cách bao gồm lệnh
SetComputeUnitLimit
trong giao dịch của bạn.
Để biết thêm chi tiết về việc sử dụng đơn vị tính toán:
Xem hướng dẫn Cách yêu cầu tính toán tối ưu để biết thêm chi tiết về việc sử dụng đơn vị tính toán.
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, được chỉ định bằng micro-lamport, mà bạn trả cho mỗi đơn vị tính toán được yêu cầu. Giá này được sử dụng để tính toán phí ưu tiên cho giao dịch của bạn.
Sử dụng các tài nguyên sau để nhận khuyến nghị thời gian thực về giá đơn vị tính toán hiện tại:
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.
Tính toán 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
Cách tiếp cận được khuyến nghị để thiết lập phí ưu tiên là trước tiên
mô phỏng giao dịch
để ước tính đơn vị tính toán cần thiết. Sau đó, thêm biên độ an toàn 10% vào ước
tính này và sử dụng giá trị kết quả làm Compute Unit Limit
.
Ưu tiên giao dịch, yếu tố quyết định mức độ ưu tiên của giao dịch so với các giao dịch khác, được tính bằng công thức sau:
Ưu tiên = ((Giới hạn Đơn vị Tính toán * Giá Đơn vị Tính toán) + Phí Cơ bản) / (1 + Giới hạn Đơn vị Tính toán + CUs Chữ ký + CUs Khóa Ghi)
Sử dụng các hướng dẫn này để thiết lập giới hạn và giá đơn vị tính toán cho một giao dịch:
SetComputeUnitLimit
để thiết lập giới hạn đơn vị cụ thể.SetComputeUnitPrice
để xác định giá cho mỗi đơn vị tính toán.
Nếu bạn không cung cấp các hướng dẫn này, giao dịch sẽ sử dụng giới hạn đơn vị tính toán mặc định với giá đơn vị tính toán là 0 (không có phí ưu tiên).
Phí ưu tiên phụ thuộc vào giới hạn đơn vị tính toán bạn yêu cầu cho giao dịch, không phải đơn vị tính toán thực tế được sử dụng. Nếu bạn thiết lập 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.
Ví dụ
Các ví dụ sau đây cho thấy cách thiết lập giới hạn và giá đơn vị tính toán cho một giao dịch.
SDK | Tham chiếu Mã nguồn |
---|---|
solana-sdk (Rust) | ComputeBudgetInstruction |
@solana/web3.js (Typescript) | ComputeBudgetProgram |
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?