จัดทำขึ้นเพื่อการศึกษาเท่านั้น ไม่ใช่คำแนะนำการลงทุน ธุรกรรมและลายเซ็นเกี่ยวกับสินทรัพย์ดิจิทัลอาจทำให้เกิดความสูญเสียที่ไม่อาจย้อนกลับได้
คำตอบโดยตรง
ลายเซ็นมอบสิทธิ์กำกับดูแลจะปลอดภัยก็ต่อเมื่อข้อความที่ถอดรหัสแล้วตรงกับการมอบสิทธิ์ที่คุณตั้งใจไว้ทุกประการ และสัญญากำกับดูแลบังคับใช้การป้องกันการนำลายเซ็นกลับมาใช้ซ้ำอย่างเพียงพอ ในการออกแบบโทเค็นลงคะแนนโดยทั่วไป การมอบสิทธิ์จะเปลี่ยนผู้ที่สามารถใช้พลังเสียงของผู้ลงนาม แต่ ไม่ได้ โอนยอดคงเหลือของโทเค็นหรือให้สิทธิ์ใช้จ่ายโทเค็น อย่างไรก็ตาม สัญญาที่นำขึ้นใช้งานจริงเป็นตัวชี้ขาดว่าลายเซ็นนั้นทำอะไร
ลายเซ็นที่สร้างนอกเชนสามารถส่งโดยผู้ถ่ายทอดธุรกรรมได้ ผู้ลงนามจึงอาจไม่ต้องจ่ายค่า gas แต่ยังคงอนุญาตให้เปลี่ยนสถานะบนเชนได้ ให้ถือว่าลายเซ็นเป็นคำสั่งที่นำไปดำเนินการได้ ไม่ใช่การเข้าสู่ระบบหรือคำขอเชื่อมต่อกระเป๋าที่ไม่มีอันตราย
วิธีการทำงาน
กระบวนการ delegateBySig ที่ใช้กันทั่วไปมีสี่ขั้นตอน:
- แอปพลิเคชันเตรียมข้อมูลแบบมีชนิดตาม EIP-712 ซึ่งประกอบด้วยที่อยู่ของผู้รับมอบสิทธิ์, nonce และวันหมดอายุ
- กระเป๋าลงนาม digest ที่ผูกกับข้อความแบบมีชนิดและโดเมน EIP-712
- บัญชีใดก็ได้สามารถถ่ายทอดลายเซ็นไปยังสัญญาโทเค็นหรือสัญญากำกับดูแล
- สัญญากู้คืนหรือตรวจสอบผู้ลงนาม ตรวจ nonce และวันหมดอายุ แล้วบันทึกผู้รับมอบสิทธิ์รายใหม่
โดเมน EIP-712 สามารถมี name, version, chainId และ verifyingContract ได้ ฟิลด์เหล่านี้แยกข้อความที่เหมือนกันในด้านอื่นออกจากกันตามแอปพลิเคชัน เวอร์ชัน เครือข่าย และสัญญา ตัว EIP-712 เองระบุไว้อย่างชัดเจนว่า ไม่ได้ ให้การป้องกันการนำลายเซ็นกลับมาใช้ซ้ำ สัญญาต้องใช้ nonce ไปแล้วหรือทำให้การอนุญาตแต่ละครั้งใช้ได้เพียงครั้งเดียวด้วยวิธีอื่น ส่วนวันหมดอายุจะจำกัดช่วงเวลาได้ก็ต่อเมื่อสัญญาตรวจสอบค่านั้นจริง
ก่อนลงนาม ให้ตรวจสอบรายการทั้งหมดต่อไปนี้กับอินเทอร์เฟซกำกับดูแลอย่างเป็นทางการ เอกสารประกอบ หรือข้อมูลสัญญาที่ตรวจสอบอย่างเป็นอิสระแล้ว:
primaryTypeและชื่อฟิลด์ต้องอธิบายการมอบสิทธิ์ ไม่ใช่ permit, การโอนโทเค็น, คำสั่งซื้อขาย หรือการอนุญาตจัดการบัญชีverifyingContractต้องเป็นสัญญาโทเค็นหรือสัญญากำกับดูแลที่ต้องการบนchainIdที่กำลังใช้งานdelegateeต้องเป็นที่อยู่ของตัวแทนที่คุณเลือก โดยตรวจสอบที่อยู่เต็มแทนการเชื่อชื่อที่แสดงnonceต้องตรงกับ nonce ปัจจุบันของผู้ลงนามในสัญญา และexpiryควรสั้นพอสำหรับขั้นตอนที่ต้องการ- กระเป๋าควรแสดงข้อมูลแบบมีชนิดทั้งหมด ปฏิเสธคำขอลงนามแบบไม่เห็นข้อมูลหรือค่าแฮชดิบที่คุณไม่สามารถตรวจสอบความหมายซ้ำได้อย่างอิสระ
แต่ละระบบนำไปใช้ต่างกัน ตัวอย่างเช่น สัญญา COMP ของ Compound แฮชผู้รับมอบสิทธิ์, nonce และวันหมดอายุ กำหนดให้ nonce ตรงกับค่าที่เก็บไว้ของผู้ลงนาม เพิ่มค่า nonce นั้น และปฏิเสธลายเซ็นที่หมดอายุแล้ว อินเทอร์เฟซ Votes ของ OpenZeppelin ก็มี delegateBySig การจัดการ nonce และการตรวจวันหมดอายุเช่นกัน อย่าคิดว่าฟังก์ชันชื่อคล้ายกันในสัญญาอื่นจะมีมาตรการป้องกันเหมือนกัน
ตัวอย่าง
มีราตั้งใจมอบ 10,000 คะแนนเสียงให้ที่อยู่ 0xAB...1234 กระเป๋าของเธอแสดง primaryType: Delegation, สัญญาโทเค็นลงคะแนนที่ตรวจสอบแล้ว, ID ของเชนที่ใช้งานอยู่, delegatee: 0xAB...1234, nonce ปัจจุบัน และวันหมดอายุในอีก 20 นาที หลังตรวจสอบที่อยู่กับแหล่งที่เชื่อถือได้อีกแห่ง เธอลงนาม ผู้ถ่ายทอดส่งข้อความนั้น และสัญญาปล่อย event การมอบสิทธิ์ ยอดโทเค็นของเธอยังคงอยู่ในกระเป๋า ส่วนตัวแทนได้รับพลังเสียงที่เกี่ยวข้องตามกฎของโปรโตคอลนั้น
คราวนี้เปลี่ยนรายละเอียดหนึ่งอย่าง: หน้าเว็บขอ primaryType: Permit และระบุผู้ที่มีสิทธิ์ใช้จ่ายโทเค็น หรือ verifyingContract เป็นสัญญาที่ไม่เกี่ยวข้อง นี่ไม่ใช่คำสั่งมอบสิทธิ์เดียวกัน แต่อาจอนุญาตให้ใช้จ่ายโทเค็นแทน แม้ปุ่มบนหน้าเว็บจะเขียนว่า “มอบสิทธิ์” และผู้ลงนามไม่ต้องจ่ายค่า gas มีราค็ควรปฏิเสธคำขอนี้
ความเสี่ยงและมาตรการควบคุม
- ผู้รับมอบสิทธิ์ผิดคน: การวางยาพิษที่อยู่ ข้อความส่วนตัว และชื่อที่แสดงซึ่งถูกคัดลอกอาจแทนที่
delegateeด้วยที่อยู่ที่ผู้โจมตีควบคุม ตรวจสอบที่อยู่เต็มผ่านข้อเสนออย่างเป็นทางการหรือโปรไฟล์ของผู้รับมอบสิทธิ์ - การกระทำผิดประเภท: อินเทอร์เฟซที่เป็นอันตรายอาจขอ EIP-712 ประเภทอื่น เช่น permit อ่าน
primaryTypeทุกฟิลด์ และสัญญาที่ใช้ตรวจสอบ เพราะข้อความบนปุ่มไม่มีคุณค่าด้านความปลอดภัย - การนำกลับมาใช้ซ้ำ: การตรวจ nonce ที่อ่อนแอหรือไม่มีเลยอาจทำให้ใช้ลายเซ็นซ้ำได้ โดเมนที่ไม่ผูกกับเชนหรือสัญญาที่ต้องการอาจเปิดให้ใช้ในบริบทที่ไม่ได้ตั้งใจด้วย ตรวจสอบโค้ดการยืนยันจริง เพราะ EIP-712 เพียงอย่างเดียวไม่ใช่การป้องกันการนำกลับมาใช้ซ้ำ
- ลายเซ็นที่มีอายุยาว: ข้อความที่ลงนามแล้วแต่ยังไม่ได้ใช้อาจยังนำไปดำเนินการได้จนกว่าจะหมดอายุหรือ nonce ใช้ไม่ได้ เลือกวันหมดอายุสั้น อย่าเผยแพร่ลายเซ็น และใช้เฉพาะวิธียกเลิกที่โปรโตคอลบันทึกไว้หากจำเป็นต้องยกเลิก
- การแสดงผลของกระเป๋าที่ทำให้เข้าใจผิด: ฟิลด์ที่ถูกตัด โดเมนที่ไม่รู้จัก หรือการลงนามแบบไม่เห็นข้อมูล ทำให้ไม่สามารถให้ความยินยอมอย่างมีความหมายได้ ให้ยกเลิกและตรวจคำขอข้อมูลแบบมีชนิดด้วยกระเป๋าหรือตัวถอดรหัสที่แสดงข้อความทั้งหมด
- ความแตกต่างของบัญชีสัญญา: กระเป๋าสมาร์ตคอนแทรกต์อาจตรวจสอบลายเซ็นผ่าน ERC-1271 ซึ่งความถูกต้องอาจขึ้นกับสถานะกระเป๋าและนโยบายการอนุญาต ยืนยันว่าทั้งกระเป๋าและสัญญากำกับดูแลรองรับ แทนการสมมติว่าจะกู้คืนลายเซ็นแบบ EOA ได้
- ผลต่อการกำกับดูแล: การมอบสิทธิ์อาจรวมศูนย์พลังเสียงหรือทำให้ผู้รับมอบสิทธิ์ที่ไม่น่าเชื่อถือออกเสียงขัดต่อผลประโยชน์ของคุณ ตรวจสอบตัวตน ประวัติการลงคะแนน ผลประโยชน์ทับซ้อน และกระบวนการมอบสิทธิ์ใหม่ของโปรโตคอล
หลังส่งแล้ว ให้ตรวจสอบธุรกรรมบนเชนที่ถูกต้อง โดยดูสัญญาปลายทาง ฟังก์ชันที่ถอดรหัส ผู้ลงนามที่กู้คืนได้หรือที่ event รายงาน ผู้รับมอบสิทธิ์รายใหม่ และ nonce ธุรกรรมจากผู้ถ่ายทอดที่สำเร็จพิสูจน์เพียงว่าสัญญายอมรับการเรียกเท่านั้น ไม่ได้พิสูจน์ว่าเจตนาที่ลงนามนั้นปลอดภัย
หากคุณลงนามแล้วแต่ยังไม่เห็นการส่ง ให้หยุดแชร์ลายเซ็นและตรวจวิธียกเลิกหรือทำให้ nonce ใช้ไม่ได้ตามเอกสารของโปรโตคอล หากมีการมอบสิทธิ์ที่ไม่ต้องการเกิดขึ้นแล้ว ให้มอบสิทธิ์ใหม่ผ่านสัญญาอย่างเป็นทางการและตรวจสอบสถานะใหม่ โดยปกติการมอบสิทธิ์เพียงอย่างเดียวไม่ได้สร้าง allowance ของโทเค็น จึงอย่าสับสนระหว่างการมอบสิทธิ์ใหม่กับการเพิกถอนการอนุมัติ หากคุณลงนาม permit ด้วย หรือเปิดเผย seed phrase หรือ private key ให้ถือว่าเป็นเหตุการณ์ด้านกระเป๋าอีกกรณีหนึ่งที่ร้ายแรงกว่า
ความเข้าใจผิดที่พบบ่อย
- “ไม่เสีย gas หมายถึงไม่ได้ให้อำนาจ” ผู้ถ่ายทอดสามารถจ่ายค่า gas ขณะที่ลายเซ็นยังให้อำนาจของผู้ลงนามได้
- “EIP-712 ทำให้ทุกลายเซ็นปลอดภัย” มาตรฐานนี้กำหนดรูปแบบการแฮชข้อมูลแบบมีชนิดและการแยกโดเมน แต่ไม่ได้รวมการป้องกันการนำกลับมาใช้ซ้ำ และไม่สามารถยืนยันว่าผู้ใช้ตั้งใจทำสิ่งที่แสดงจริง
- “การมอบสิทธิ์โอนโทเค็นของฉัน” การมอบสิทธิ์ลงคะแนนแบบทั่วไปย้ายหรือกำหนดพลังเสียง ไม่ใช่กรรมสิทธิ์ในโทเค็น แต่มีเพียงสัญญาที่นำขึ้นใช้งานจริงและข้อความที่ถอดรหัสแล้วเท่านั้นที่ยืนยันผลที่แท้จริงได้
- “ฉันเพิกถอนลายเซ็นนอกเชนได้เสมอ” ไม่มีธุรกรรมเพิกถอนลายเซ็นแบบสากล วันหมดอายุ การใช้หรือทำให้ nonce ใช้ไม่ได้ และการมอบสิทธิ์ใหม่เป็นกลไกเฉพาะของแต่ละสัญญา
- “การเปลี่ยนผู้รับมอบสิทธิ์ลบคะแนนเสียงก่อนหน้า” การมอบสิทธิ์ใหม่เปลี่ยนพลังเสียงในปัจจุบันหรืออนาคตตามกฎของโปรโตคอล แต่อาจไม่ยกเลิกคะแนนที่ลงไปแล้วหรือเปลี่ยน snapshot ในอดีต
หัวข้อที่เกี่ยวข้อง
แหล่งข้อมูล
- EIP-712: การแฮชและลงนามข้อมูลแบบมีชนิดและมีโครงสร้าง - Ethereum Improvement Proposals (เข้าถึงเมื่อ: 2026-08-20)
- Comp.sol - Compound Finance (เข้าถึงเมื่อ: 2026-08-20)
- API การกำกับดูแล - OpenZeppelin (เข้าถึงเมื่อ: 2026-08-20)
- ERC-1271: วิธีมาตรฐานสำหรับตรวจสอบลายเซ็นของสัญญา - Ethereum Improvement Proposals (เข้าถึงเมื่อ: 2026-08-20)