WithdrawExcessLamports trên Solana: Hướng dẫn về SPL Token và Token-2022
Đã kiểm tra bằng chứng về giá và tính năng 3 tháng 9, 2026.
WithdrawExcessLamports là chỉ thị 38 của Token Program. Nó giải quyết một vấn đề cụ thể: mint, tài khoản token hoặc tài khoản đa chữ ký có thể nắm giữ nhiều lamport hơn mức cần thiết để được miễn tiền thuê, nhưng số lamport đó không thể được chuyển bằng giao dịch chuyển token thông thường.
WithdrawExcessLamports làm gì?
WithdrawExcessLamports chỉ chuyển phần SOL cao hơn mức tối thiểu miễn tiền thuê hiện tại của tài khoản Token Program. Nguồn vẫn mở và dữ liệu token hoặc mint không thay đổi. Bên ký bắt buộc phụ thuộc vào việc nguồn là tài khoản token, mint hay tài khoản đa chữ ký token.
Chỉ thị này có trong cả SPL Token Program cổ điển và Token-2022. Chỉ thị hữu ích để thu hồi lamport vô tình được gửi đến các tài khoản do chương trình token sở hữu trước đề xuất tiền thuê 2026. Mức tiền thuê tối thiểu thấp hơn giúp mở rộng phạm vi sử dụng: các tài khoản cũ có thể giữ số dư ban đầu trong khi chỉ cần mức dự trữ nhỏ hơn.
Hành vi chuẩn và ví dụ máy khách hiện tại nằm trong tài liệu Withdraw Excess Lamports của Solana. Phần triển khai bộ xử lý cũng được công khai trong kho lưu trữ Token Program.
Chỉ thị yêu cầu những tài khoản nào?
| Tài khoản | Có thể ghi? | Bên ký? | Mục đích |
|---|---|---|---|
source | Có | Đôi khi | Tài khoản token, mint hoặc tài khoản đa chữ ký nắm giữ lamport dư thừa |
destination | Có | Không | Nhận số lamport được rút |
authority | Không | Phụ thuộc vào loại nguồn | Chứng minh quyền rút |
multiSigners | Không | Có, khi được dùng | Đáp ứng ngưỡng đa chữ ký token đã cấu hình |
Bộ xử lý đọc độ dài dữ liệu và cài đặt tiền thuê hiện tại của nguồn, tính số dư tối thiểu rồi chuyển phần chênh lệch. Nó không chấp nhận mức dự trữ do bên gọi cung cấp vì giá trị đó có thể đã lỗi thời hoặc bị thao túng.
Ai phải ký cho từng loại nguồn?
| Nguồn | Thẩm quyền bắt buộc |
|---|---|
| Tài khoản token có chủ sở hữu là ví | Chủ sở hữu tài khoản token |
| Tài khoản token thuộc sở hữu của một tài khoản đa chữ ký token | Yêu cầu M- trên N thành viên đa chữ ký |
| Mint có quyền mint đang hoạt động | Thẩm quyền mint hiện tại |
| Mint không có quyền mint | Chính tài khoản mint nguồn |
| Tài khoản nguồn đa chữ ký | Các thành viên M- trên N đã cấu hình |
Trường hợp mint đã bị thu hồi quyền cần được đặc biệt lưu ý. Nếu mint nguồn được tạo từ một cặp khóa on-curve, cặp khóa ban đầu đó phải ký. Nếu mint là off-curve, chương trình kiểm soát nó phải gọi Token Program bằng các seed bên ký PDA chính xác. Người nắm giữ token hoặc thẩm quyền mint trước đây không thể thay thế cho chữ ký nguồn.
Làm thế nào để tạo chỉ thị bằng máy khách Solana?
Ví dụ chính thức hiện tại sử dụng @solana-program/token với một mục đã cấu hình @solana/kit máy khách:
import { getWithdrawExcessLamportsInstruction } from "@solana-program/token";
const instruction = getWithdrawExcessLamportsInstruction({
source,
destination,
authority,
});
await client.sendTransaction([instruction]);
Tại đây authority là một TransactionSigner phù hợp với nguồn. Đối với thẩm quyền đa chữ ký, hãy thêm các bên đồng ký thông qua multiSigners. Hãy cố định phiên bản gói trong môi trường production và biên dịch theo đúng bản phát hành máy khách đang dùng; kiểu dữ liệu máy khách có thể thay đổi ngay cả khi hợp đồng tài khoản on-chain không đổi.
Không mã hóa cứng 0.00203928 SOL làm mức dự trữ. Đó là mức tối thiểu cũ cho tài khoản token chuẩn có kích thước 165 byte, không phải giá trị hiện tại áp dụng chung. Hãy truy vấn mức tối thiểu hiện tại cho độ dài dữ liệu thực tế của nguồn ngay trước khi tạo hoặc xem trước giao dịch.
SPL Token và Token-2022 khác nhau như thế nào trong trường hợp này?
Tác dụng cốt lõi của chỉ thị là như nhau, nhưng Token-2022 khiến các giả định về độ dài dữ liệu đặc biệt rủi ro. Các phần mở rộng của mint và tài khoản làm tăng kích thước tuần tự hóa, do đó cũng tăng mức dự trữ bắt buộc. Một quy trình tích hợp dùng kích thước chuẩn 82 hoặc 165 byte cho mọi nguồn có thể ước tính phần dư quá cao.
CPI Guard của Token-2022 là một khác biệt thực tế khác đối với các lớp bọc. Khi guard bị khóa, lời gọi liên chương trình có thể bị từ chối ngay cả khi ví đáng lẽ là một thẩm quyền hợp lệ. Sol Incinerator bỏ qua các nguồn đó thay vì đưa một lỗi chắc chắn xảy ra vào giao dịch dọn dẹp lớn hơn.
Các tài khoản token wrapped-SOL gốc bị từ chối với NativeNotSupported. Việc mở bọc SOL gốc đi theo quy trình đóng tài khoản khác; đó không phải là thao tác rút lamport dư thừa.
Sol Incinerator API bọc chỉ thị như thế nào?
API v2 của Sol Incinerator tạo lệnh gọi Token Program thông qua Assetcinerator để phí giao thức và phí đối tác tùy chọn được thực thi on-chain. Lớp bọc này là một lớp sản phẩm; bản thân chỉ thị Token Program thô không áp dụng phí của Sol Incinerator.
Dùng tính năng xem trước đã xác thực trước khi yêu cầu người dùng ký:
curl -X POST https://v2.api.sol-incinerator.com/withdraw-excess-lamports/preview \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"userPublicKey": "DESTINATION_WALLET",
"sourceAccount": "TOKEN_ACCOUNT_MINT_OR_MULTISIG"
}'
Các tuyến giao dịch và chỉ thị liên quan là:
POST /withdraw-excess-lamportsPOST /withdraw-excess-lamports-instructions
userPublicKey là ví đích và bên có thẩm quyền mặc định. Cung cấp authorityPublicKey khi một mint, nguồn hoặc bên có thẩm quyền đa chữ ký khác phải ký. Cung cấp tối đa 11 multisigSignerPublicKeys khi tạo luồng đa chữ ký token. Mọi khóa riêng tư đều được giữ cục bộ; API trả về dữ liệu cần thiết để các bên ký bắt buộc phê duyệt.
Phí giao thức cơ bản là 200 bps. Bên tích hợp trực tiếp có thể thêm một partnerFeeAccount và partnerFeeBps, còn phí giao dịch Solana thông thường được tính riêng. Hãy dùng các trường được trả về feeLamports và các trường thu hồi thay vì sử dụng lại phép tính tỷ lệ phần trăm đã lưu vào bộ nhớ đệm.
Quy trình tích hợp nên xử lý những lỗi nào?
- Không có phần dư: số dư nguồn đã bằng mức dự trữ hiện tại.
- Chủ sở hữu hoặc bố cục tài khoản không đúng: nguồn không phải là tài khoản Token Program được hỗ trợ.
- Thẩm quyền không hợp lệ: bên ký được cung cấp không khớp với trạng thái nguồn đã giải mã.
- Đa chữ ký chưa đầy đủ: số bên ký hợp lệ đã cấu hình được cung cấp không đủ.
- Tài khoản gốc: wrapped SOL dùng một thao tác khác.
- CPI Guard bị khóa: Token-2022 từ chối lớp bọc CPI.
- Trạng thái đã thay đổi: số dư, thẩm quyền hoặc cài đặt tiền thuê đã thay đổi sau khi xem trước.
- Chi phí giao dịch vượt quá giá trị: một khoản rút rất nhỏ có thể không đáng thực hiện sau khi tính phí mạng.
Hãy xem trước lại khi trạng thái có thể đã thay đổi, duy trì tính lũy đẳng khi chọn nguồn và không bao giờ gộp một nguồn đã biết là không đủ điều kiện với các thao tác hợp lệ khác.

Sol Incinerator
Xem trước tiền thuê dư thừa theo thời gian thực hoặc dùng API v2 để tạo giao dịch rút an toàn cho bên ký.
Bài viết liên quan
Câu hỏi thường gặp
WithdrawExcessLamports làm gì trên Solana?
WithdrawExcessLamports chuyển số lamport cao hơn mức tối thiểu miễn tiền thuê hiện tại của tài khoản Token Program sang ví đích. Nguồn có thể là tài khoản token, mint hoặc tài khoản đa chữ ký. Chỉ thị không thay đổi lượng token, nguồn cung mint, các thẩm quyền, phần mở rộng và mọi dữ liệu tài khoản đã tuần tự hóa khác.
Thẩm quyền nào ký WithdrawExcessLamports?
Tài khoản token dùng chủ sở hữu hoặc các bên ký đa chữ ký đã cấu hình. Mint có quyền mint đang hoạt động dùng quyền đó. Mint không có quyền mint phải tự ký với tư cách tài khoản nguồn, bằng cặp khóa của nó hoặc đường dẫn bên ký CPI từ chương trình kiểm soát mint off-curve.
WithdrawExcessLamports có hỗ trợ Token-2022 không?
Có. Chỉ thị này khả dụng cho SPL Token cổ điển và các tài khoản, mint cũng như tài khoản đa chữ ký Token-2022. Quy trình tích hợp phải tính tiền thuê theo độ dài dữ liệu thực tế của nguồn vì các phần mở rộng Token-2022 có thể làm tài khoản lớn hơn, đồng thời CPI Guard bị khóa có thể chặn việc thực thi qua lớp bọc.
WithdrawExcessLamports có thể rút cạn tài khoản token xuống dưới mức miễn tiền thuê không?
Không. Token Program tính mức tối thiểu bắt buộc của nguồn và chỉ chuyển phần chênh lệch cao hơn mức đó. Các tài khoản token wrapped-SOL gốc bị từ chối. Ứng dụng vẫn nên xem trước trạng thái hiện tại vì số dư tài khoản, độ dài dữ liệu, cài đặt tiền thuê và thẩm quyền hiện có có thể thay đổi trước khi gửi.