กลับไปที่บล็อก
Solana

WithdrawExcessLamports บน Solana: คู่มือ SPL Token และ Token-2022

S
Sol Slugs Team
Sol Incinerator

ตรวจสอบหลัก evidence ด้านราคาและความสามารถแล้ว 3 กันยายน 2569.

WithdrawExcessLamports คือคำสั่ง 38 ของ Token Program ซึ่งแก้ปัญหาเฉพาะด้าน กล่าวคือ มินต์ บัญชีโทเค็น หรือ multisig อาจถือแลมพอร์ตมากกว่าที่จำเป็นสำหรับการยกเว้นค่าเช่า แต่ไม่สามารถย้ายแลมพอร์ตเหล่านั้นด้วยการโอนโทเค็นตามปกติ

WithdrawExcessLamports ทำอะไร

WithdrawExcessLamports จะย้ายเฉพาะ SOL ที่เกินยอดขั้นต่ำเพื่อยกเว้นค่าเช่าปัจจุบันของบัญชี Token Program ต้นทางยังคงเปิดอยู่ และข้อมูลโทเค็นหรือมินต์ไม่เปลี่ยนแปลง ผู้ลงนามที่จำเป็นขึ้นอยู่กับว่าต้นทางเป็นบัญชีโทเค็น มินต์ หรือ token multisig

คำสั่งนี้ใช้ได้ทั้งใน SPL Token Program แบบคลาสสิกและ Token-2022 โดยมีประโยชน์สำหรับเรียกคืนแลมพอร์ตที่ส่งไปยังบัญชีซึ่งโปรแกรมโทเค็นเป็นเจ้าของโดยไม่ตั้งใจก่อนข้อเสนอค่าเช่า 2026 เกณฑ์ค่าเช่าขั้นต่ำที่ลดลงทำให้คำสั่งนี้ใช้งานได้กว้างขึ้น เพราะบัญชีเก่าสามารถคงยอดเดิมไว้ขณะที่ต้องสำรองน้อยลง

ลักษณะการทำงานที่ใช้อ้างอิงและตัวอย่างไคลเอนต์ปัจจุบันอยู่ใน เอกสาร Withdraw Excess Lamports ของ Solana นอกจากนี้ การทำงานของตัวประมวลผลยัง เผยแพร่ต่อสาธารณะในที่เก็บโค้ดของ Token Program.

คำสั่งนี้ต้องใช้บัญชีใดบ้าง

บัญชีเขียนข้อมูลได้หรือไม่ต้องลงนามหรือไม่วัตถุประสงค์
sourceใช่บางครั้งบัญชีโทเค็น มินต์ หรือ multisig ที่ถือแลมพอร์ตส่วนเกิน
destinationใช่ไม่รับแลมพอร์ตที่ถอนออกมา
authorityไม่ขึ้นอยู่กับประเภทต้นทางพิสูจน์สิทธิ์ในการถอน
multiSignersไม่ใช่ เมื่อใช้เป็นมีผู้ลงนามครบตามเกณฑ์ token multisig ที่กำหนดไว้

ตัวประมวลผลจะอ่านความยาวข้อมูลของต้นทางและการตั้งค่าเช่าปัจจุบัน คำนวณยอดขั้นต่ำ แล้วโอนส่วนต่าง โดยไม่รับค่าเงินสำรองจากผู้เรียกซึ่งอาจล้าสมัยหรือถูกบิดเบือน

ต้นทางแต่ละประเภทต้องให้ใครลงนาม

ต้นทางผู้มีสิทธิ์ที่จำเป็น
บัญชีโทเค็นที่มีกระเป๋าเงินเป็นเจ้าของเจ้าของบัญชีโทเค็น
บัญชีโทเค็นที่ token multisig เป็นเจ้าของสมาชิก multisig ที่จำเป็น M- คนจาก N คน
มินต์ที่ยังมีผู้มีสิทธิ์ในการมินต์ผู้มีสิทธิ์ในการมินต์ปัจจุบัน
มินต์ที่ไม่มีผู้มีสิทธิ์ในการมินต์บัญชีมินต์ต้นทางเอง
บัญชีต้นทางแบบ multisigสมาชิกที่กำหนดไว้ M- คนจาก N คน

กรณีมินต์ถูกเพิกถอนสิทธิ์ควรได้รับความใส่ใจเป็นพิเศษ หากมินต์ต้นทางสร้างจากคู่คีย์แบบ on-curve คู่คีย์เดิมนั้นต้องลงนาม หากเป็นแบบ off-curve โปรแกรมที่ควบคุมต้องเรียก Token Program โดยใช้ seed ผู้ลงนาม PDA ที่ถูกต้อง ผู้ถือโทเค็นหรืออดีตผู้มีสิทธิ์ในการมินต์ไม่สามารถลงนามแทนต้นทางได้

คุณจะสร้างคำสั่งด้วยไคลเอนต์ Solana ได้อย่างไร

ตัวอย่างทางการในปัจจุบันใช้ @solana-program/token ที่มีการกำหนดค่า @solana/kit ไคลเอนต์:

import { getWithdrawExcessLamportsInstruction } from "@solana-program/token";

const instruction = getWithdrawExcessLamportsInstruction({
    source,
    destination,
    authority,
});

await client.sendTransaction([instruction]);

ที่นี่ authority เป็น TransactionSigner ที่เหมาะสมกับต้นทาง สำหรับผู้มีสิทธิ์แบบ multisig ให้รวมผู้ร่วมลงนามผ่าน multiSigners ในระบบใช้งานจริง ให้ตรึงเวอร์ชันแพ็กเกจและคอมไพล์กับไคลเอนต์รุ่นที่ใช้งานโดยตรง เพราะชนิดข้อมูลของไคลเอนต์อาจเปลี่ยน แม้สัญญาบัญชีบนเชนจะไม่เปลี่ยนก็ตาม

อย่ากำหนดค่าตายตัวเป็น 0.00203928 SOL เป็นเงินสำรอง ค่านี้คือยอดขั้นต่ำแบบเดิมสำหรับบัญชีโทเค็นมาตรฐานขนาด 165 ไบต์ ไม่ใช่ค่าปัจจุบันที่ใช้ได้กับทุกบัญชี ให้สอบถามยอดขั้นต่ำปัจจุบันตามความยาวข้อมูลจริงของต้นทางทันทีก่อนสร้างหรือแสดงตัวอย่างธุรกรรม

ในกรณีนี้ SPL Token และ Token-2022 แตกต่างกันอย่างไร

ผลลัพธ์หลักของคำสั่งนั้นเหมือนกัน แต่ Token-2022 ทำให้การตั้งสมมติฐานเรื่องความยาวข้อมูลมีความเสี่ยงเป็นพิเศษ ส่วนขยายของมินต์และบัญชีจะเพิ่มขนาดข้อมูลที่ทำซีเรียลไลซ์แล้ว จึงทำให้ต้องใช้เงินสำรองเพิ่มขึ้น การผสานรวมที่ใช้ขนาดมาตรฐาน 82 หรือ 165 ไบต์กับทุกต้นทางอาจทำให้ยอดส่วนเกินสูงเกินจริง

CPI Guard ของ Token-2022 เป็นอีกหนึ่งความแตกต่างในทางปฏิบัติสำหรับตัวห่อหุ้ม เมื่อการ์ดถูกล็อก การเรียกข้ามโปรแกรมอาจถูกปฏิเสธ แม้โดยปกติกระเป๋าเงินจะเป็นผู้มีสิทธิ์ที่ถูกต้องก็ตาม Sol Incinerator จะข้ามต้นทางเหล่านั้นแทนการใส่รายการที่ล้มเหลวแน่นอนลงในธุรกรรมล้างข้อมูลขนาดใหญ่

บัญชีโทเค็น wrapped-SOL แบบเนทีฟจะถูกปฏิเสธด้วย NativeNotSupported. การแกะ wrapped SOL แบบเนทีฟใช้กระบวนการปิดบัญชีอีกแบบหนึ่ง ไม่ใช่การถอนแลมพอร์ตส่วนเกิน

Sol Incinerator API ห่อหุ้มคำสั่งนี้อย่างไร

API เวอร์ชัน v2 ของ Sol Incinerator สร้างการเรียก Token Program ผ่าน Assetcinerator เพื่อบังคับใช้ค่าธรรมเนียมโปรโตคอลและค่าธรรมเนียมพาร์ทเนอร์ที่เป็นตัวเลือกบนเชน ตัวห่อหุ้มนี้เป็นชั้นผลิตภัณฑ์ ส่วนคำสั่งดิบของ Token Program เองไม่ได้เรียกเก็บค่าธรรมเนียมของ Sol Incinerator

ใช้การแสดงตัวอย่างที่ผ่านการตรวจสอบสิทธิ์ก่อนขอให้ผู้ใช้ลงนาม

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"
  }'

เส้นทางธุรกรรมและคำสั่งที่เกี่ยวข้องมีดังนี้

  • POST /withdraw-excess-lamports
  • POST /withdraw-excess-lamports-instructions

userPublicKey คือกระเป๋าเงินปลายทางและผู้มีสิทธิ์เริ่มต้น ระบุ authorityPublicKey เมื่อมินต์ ต้นทาง หรือผู้มีสิทธิ์แบบ multisig อื่นต้องลงนาม ระบุได้สูงสุด 11 multisigSignerPublicKeys เมื่อสร้างขั้นตอน token multisig คีย์ส่วนตัวทุกคีย์จะยังคงอยู่ภายในอุปกรณ์ ส่วน API จะส่งคืนข้อมูลสำหรับให้ผู้ลงนามที่จำเป็นอนุมัติ

ค่าธรรมเนียมพื้นฐานของโปรโตคอลคือ 200 bps. ผู้ผสานรวมโดยตรงสามารถเพิ่ม partnerFeeAccount และ partnerFeeBps ขณะที่ค่าธรรมเนียมธุรกรรม Solana ตามปกติจะแยกต่างหาก ให้ใช้ข้อมูลที่ส่งกลับมาในช่อง feeLamports และช่องข้อมูลการเรียกคืน แทนการนำผลคำนวณเปอร์เซ็นต์ที่แคชไว้กลับมาใช้

การผสานรวมควรรองรับข้อผิดพลาดใดบ้าง

  • ไม่มีส่วนเกิน ยอดคงเหลือต้นทางเท่ากับเงินสำรองปัจจุบันอยู่แล้ว
  • เจ้าของบัญชีหรือโครงสร้างข้อมูลไม่ถูกต้อง: ต้นทางไม่ใช่บัญชี Token Program ที่รองรับ
  • ผู้มีสิทธิ์ไม่ถูกต้อง: ผู้ลงนามที่ระบุไม่ตรงกับสถานะต้นทางที่ถอดรหัสแล้ว
  • ผู้ลงนาม multisig ไม่ครบ ระบุผู้ลงนามที่กำหนดค่าไว้และถูกต้องไม่ครบตามจำนวนขั้นต่ำ
  • บัญชีแบบเนทีฟ wrapped SOL ใช้การดำเนินการอีกแบบหนึ่ง
  • CPI Guard ถูกล็อก Token-2022 ปฏิเสธตัวห่อหุ้ม CPI
  • สถานะเปลี่ยนแปลง ยอดคงเหลือ สิทธิ์ หรือการตั้งค่าเช่าเปลี่ยนหลังจากแสดงตัวอย่าง
  • ต้นทุนธุรกรรมสูงกว่ามูลค่า: การถอนจำนวนเล็กน้อยอาจไม่คุ้มค่าหลังหักค่าธรรมเนียมเครือข่าย

แสดงตัวอย่างอีกครั้งเมื่อสถานะอาจเปลี่ยนไป รักษาการเลือกต้นทางให้เป็น idempotent และอย่ารวมต้นทางที่ทราบว่าไม่มีสิทธิ์ไว้ในชุดเดียวกับงานอื่นที่ถูกต้อง

Sol Incinerator

Sol Incinerator

แสดงตัวอย่างค่าเช่าส่วนเกินปัจจุบัน หรือใช้ API เวอร์ชัน v2 เพื่อสร้างการถอนที่ปลอดภัยสำหรับผู้ลงนาม

ลองใช้ตอนนี้

บทความที่เกี่ยวข้อง

คำถามที่พบบ่อย

WithdrawExcessLamports ทำอะไรบน Solana

WithdrawExcessLamports โอนแลมพอร์ตที่เกินยอดขั้นต่ำสำหรับการยกเว้นค่าเช่าปัจจุบันของบัญชี Token Program ไปยังกระเป๋าเงินปลายทาง ต้นทางอาจเป็นบัญชีโทเค็น มินต์ หรือ multisig คำสั่งนี้จะไม่เปลี่ยนแปลงจำนวนโทเค็น อุปทานมินต์ สิทธิ์ ส่วนขยาย และข้อมูลบัญชีที่ทำซีเรียลไลซ์อื่นๆ ทั้งหมด

ผู้มีสิทธิ์ใดต้องลงนามใน WithdrawExcessLamports

บัญชีโทเค็นใช้เจ้าของบัญชีหรือผู้ลงนามแบบ multisig ที่กำหนดไว้ มินต์ที่ยังมีผู้มีสิทธิ์ในการมินต์จะใช้ผู้มีสิทธิ์นั้น ส่วนมินต์ที่ไม่มีผู้มีสิทธิ์ดังกล่าวต้องลงนามในฐานะบัญชีต้นทางเอง โดยใช้คู่คีย์ของบัญชีหรือช่องทางผู้ลงนาม CPI จากโปรแกรมที่ควบคุมมินต์แบบ off-curve

WithdrawExcessLamports รองรับ Token-2022 หรือไม่

ใช่ คำสั่งนี้ใช้ได้กับบัญชี มินต์ และ multisig ของ SPL Token แบบคลาสสิกและ Token-2022 การผสานรวมต้องคำนวณค่าเช่าจากความยาวข้อมูลจริงของต้นทาง เพราะส่วนขยาย Token-2022 อาจทำให้บัญชีมีขนาดใหญ่ขึ้น และ CPI Guard ที่ล็อกอยู่อาจขัดขวางการดำเนินการผ่านตัวห่อหุ้ม

WithdrawExcessLamports สามารถถอนเงินจากบัญชีโทเค็นจนต่ำกว่าเกณฑ์ยกเว้นค่าเช่าได้หรือไม่

ไม่ Token Program จะคำนวณยอดขั้นต่ำที่จำเป็นของต้นทางและโอนเฉพาะส่วนต่างที่สูงกว่านั้น บัญชีโทเค็น wrapped-SOL แบบเนทีฟจะถูกปฏิเสธ แอปพลิเคชันยังควรแสดงตัวอย่างจากสถานะปัจจุบัน เพราะยอดบัญชี ความยาวข้อมูล การตั้งค่าเช่า และสิทธิ์ที่ใช้ได้อาจเปลี่ยนก่อนส่งธุรกรรม

WithdrawExcessLamports บน Solana: คู่มือ SPL Token และ Token-2022 | Sol Incinerator