🪙Bitcoin, explained
ระดับกลางกระเป๋าเงินรอการตรวจสอบโดยมนุษย์อ่าน 18 นาที

กระเป๋า Multisig ทำงานยังไง

กุญแจดอกเดียวคือจุดล้มเหลวจุดเดียว กระเป๋า multisig กระจายอำนาจใช้จ่ายไปยังกุญแจหลายดอก แล้วปล่อยให้ภาษาสคริปต์ของ Bitcoin เองเป็นผู้บังคับว่าต้องมีกี่ดอกเห็นพ้องกันก่อนเหรียญจะขยับได้

ห้องนิรภัยแบบ 2-of-3 — ลายเซ็นสองดอกก็เปิดได้ กุญแจดอกที่สามเก็บออฟไลน์ไว้

🔑

แล็ปท็อป

🔑

ฮาร์ดแวร์

🔑

สำรอง

→

🔓

ใช้จ่ายได้

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

กระเป๋า multisig คืออะไร

กระเป๋า Bitcoin ทั่วไปถูกปกป้องด้วยกุญแจส่วนตัวเพียงดอกเดียว ตัวเลขก้อนนั้นคือระบบความปลอดภัยทั้งหมด ใครถือไว้ก็ใช้จ่ายได้ ใครทำหายก็เสียเงินไปตลอดกาล ไม่มีลิงก์รีเซ็ตรหัสผ่าน ไม่มีฝ่ายบริการลูกค้า

กระเป๋า multisig (multi-signature) แทนกุญแจดอกเดียวนั้นด้วยกุญแจ N ดอก พร้อมกติกาว่าต้องมีอย่างน้อย M ดอกร่วมเซ็นก่อนเหรียญจะเคลื่อนได้ เขียนย่อว่า M-of-N เช่น 2-of-3, 3-of-5 หรือ 2-of-2 กุญแจแต่ละดอกจะอยู่คนละที่ คนละอุปกรณ์ หรือถือโดยคนละคนก็ได้

เป็นเกณฑ์ ไม่ใช่ต้องครบทุกดอก

ห้องนิรภัย 2-of-3 ไม่ต้องใช้ครบสามดอก ดอกไหนก็ได้สองดอกก็พอ

กุญแจอิสระต่อกัน

แต่ละดอกเป็นกุญแจส่วนตัวคนละชุด มี seed phrase ของตัวเอง ถูกเจาะไปหนึ่งดอกก็ไม่บอกอะไรเกี่ยวกับดอกอื่นเลย

บังคับใช้ด้วยฉันทามติ

กติกาอยู่ในสคริปต์ Bitcoin ที่ล็อกเหรียญไว้ และโหนดทุกตัวตรวจซ้ำ ไม่มีผู้ดูแลทรัพย์สิน ไม่มีนโยบายบริษัท ไม่ต้องเชื่อใจใคร

💡
Multisig อยู่ใน Bitcoin มาตั้งแต่ปี 2012 (BIP 11 และ BIP 16) ไม่ใช่ฟีเจอร์ที่กระเป๋าเงินแปะเพิ่มทีหลัง แต่เป็นเงื่อนไขการใช้จ่ายที่โปรโตคอลชั้นฐานเข้าใจโดยตรง

ทำงานยังไง ทีละขั้น

มีสามอย่างที่ต้องเกิดขึ้น กติกาถูกฝังลงในที่อยู่ ผู้ร่วมเซ็นแต่ละคนเซ็นธุรกรรมชุดเดียวกัน และเครือข่ายตรวจสอบลายเซ็นที่รวบรวมมาได้

1

สคริปต์เป็นตัวกำหนดกติกา

ที่อยู่ multisig ถูกสร้างจากโปรแกรมสั้น ๆ ที่เรียกว่า redeem script (หรือ witness script สำหรับ SegWit) ซึ่งไล่รายชื่อกุญแจสาธารณะกับเกณฑ์ที่ต้องการ แล้วปิดท้ายด้วยโอปโค้ด OP_CHECKMULTISIG

redeem script
OP_2                       // เกณฑ์ M = 2
  <02a1b2...c3>            // กุญแจสาธารณะของผู้ร่วมเซ็นคนที่ 1
  <03d4e5...f6>            // กุญแจสาธารณะของผู้ร่วมเซ็นคนที่ 2
  <02789a...bc>            // กุญแจสาธารณะของผู้ร่วมเซ็นคนที่ 3
OP_3                       // จำนวนกุญแจทั้งหมด N = 3
OP_CHECKMULTISIG

สคริปต์นั้นจะถูกแฮช — HASH160 สำหรับที่อยู่ P2SH ที่ขึ้นต้นด้วย 3 หรือ SHA-256 สำหรับที่อยู่ P2WSH ที่ขึ้นต้นด้วย bc1q — แล้วค่าแฮชนั้นก็กลายเป็นที่อยู่ ใครจะโอนเข้ามาก็ได้โดยไม่รู้ด้วยซ้ำว่าเป็น multisig เพราะสิ่งที่เขาเห็นมีแค่ค่าแฮช

💡
เพราะที่อยู่คือค่าแฮชของสคริปต์ การเปลี่ยนเกณฑ์จาก 2-of-3 เป็น 3-of-3 หรือแม้แต่สลับลำดับกุญแจสาธารณะ จะได้ที่อยู่คนละอันโดยสิ้นเชิง กติกาถูกล็อกตั้งแต่วินาทีที่สร้างที่อยู่
2

ผู้ร่วมเซ็นแต่ละคนเซ็นธุรกรรมชุดเดียวกัน

เวลาจะใช้จ่าย จะมีคนร่างธุรกรรมที่ยังไม่ได้เซ็นขึ้นมาก่อนว่าจะใช้เหรียญไหน ส่งไปที่ไหน จ่ายค่าธรรมเนียมเท่าไร จากนั้นผู้ร่วมเซ็นทุกคนเซ็นธุรกรรมชุดนั้นเป๊ะ ๆ ด้วยกุญแจส่วนตัวของตัวเอง โดยใช้ ECDSA บนเส้นโค้ง secp256k1 ซึ่งเป็นวิธีเดียวกับกระเป๋ากุญแจเดี่ยว

ตัวร่างเดินทางระหว่างผู้ร่วมเซ็นในรูปแบบ PSBT (Partially Signed Bitcoin Transaction, BIP 174) อุปกรณ์แต่ละเครื่องเติมลายเซ็นของตัวเองแล้วส่งต่อ กุญแจส่วนตัวไม่เคยออกจากอุปกรณ์และไม่เคยมาเจอกัน

psbt flow
1. ผู้ประสานงาน    -> สร้าง PSBT ที่ยังไม่ได้เซ็น
2. ฮาร์ดแวร์วอลเล็ต -> เติมลายเซ็นที่ 1 -> PSBT (1 จาก 2)
3. กุญแจในแล็ปท็อป  -> เติมลายเซ็นที่ 2 -> PSBT (2 จาก 2)
4. ใครก็ได้        -> รวบรวมให้สมบูรณ์แล้วกระจายออกสู่เครือข่าย
3

เครือข่ายตรวจสอบ

ธุรกรรมที่ใช้จ่ายจะเปิดเผย redeem script พร้อมลายเซ็นที่รวบรวมมา โหนดทุกตัวจะแฮชสคริปต์เพื่อยืนยันว่าตรงกับที่อยู่ แล้วรัน OP_CHECKMULTISIG ซึ่งไล่ตรวจรายการลายเซ็นเทียบกับรายการกุญแจสาธารณะ และต้องได้ลายเซ็นที่ถูกต้อง M ดอก โดยเรียงตามลำดับเดียวกับที่กุญแจถูกไล่ไว้

script evaluation
input script:  OP_0 '<sig1>' '<sig2>' '<redeemScript>'

hash(redeemScript) ตรงกับค่าแฮชในที่อยู่ ?  -> ใช่
พบลายเซ็นที่ถูกต้องกี่ดอก              ?  -> 2 จาก 3
2 >= เกณฑ์ที่ต้องการ (2)               ?  -> ผ่าน
⚡
OP_0 ที่นำหน้าคือบั๊กจริงในโค้ดต้นฉบับ OP_CHECKMULTISIG ดึงข้อมูลออกจากสแต็กเกินไปหนึ่งชิ้น และแก้ไม่ได้เลยถ้าไม่ทำ hard fork ทุกการใช้จ่าย multisig ในประวัติศาสตร์ Bitcoin จึงต้องพกค่าหลอกตัวนี้ติดไปด้วยเสมอ

โอนบิตคอยน์เข้ากระเป๋า multisig ยังไง

การรับเงินเข้ากระเป๋า multisig เป็นส่วนที่น่าเบื่อที่สุด และนั่นแหละคือข้อดี สำหรับคนที่โอนมาให้คุณ มันคือการโอนธรรมดาไปยังที่อยู่ธรรมดาอันหนึ่ง

1

สร้างและสำรองกระเป๋าให้เสร็จก่อนเหรียญแรกจะมาถึง

ผู้ร่วมเซ็นแต่ละคนสร้างกุญแจของตัวเองบนอุปกรณ์ของตัวเอง จากนั้นแลกกุญแจสาธารณะกัน (ในทางปฏิบัติคือ extended public key) แล้วทุกอุปกรณ์ประกอบนิยามกระเป๋าชุดเดียวกันขึ้นมา ได้แก่ เกณฑ์ที่ต้องใช้ กุญแจสาธารณะทุกดอก และเส้นทางการอนุพัทธ์ นิยามชุดนี้เรียกว่า wallet descriptor

เก็บ descriptor ไว้ทุกที่ที่คุณเก็บ seed phrase คือติดไว้กับฮาร์ดแวร์วอลเล็ตทุกตัว ไว้ในที่สำรองทุกแห่ง และพิมพ์เก็บคู่กับชุดคำ จากนั้นตรวจว่าทุกอุปกรณ์แสดงที่อยู่แรกตรงกัน

⚡
การโอนเงินเข้ากระเป๋า multisig ก่อนที่จะสำรอง descriptor ไว้ คือสาเหตุอันดับหนึ่งที่ทำให้คนเสียเหรียญใน multisig เพราะลำพัง seed phrase สร้างกระเป๋ากลับคืนมาไม่ได้
2

ส่งที่อยู่ให้เขาเหมือนที่อยู่ทั่วไป

ที่อยู่สำหรับรับเงินก็แค่ค่าแฮชค่าหนึ่ง ผู้โอนเอาไปวางในฟอร์มถอนเงินของ exchange หรือในกระเป๋าของเขาแล้วกดโอน เขาไม่ต้องมีระบบรองรับ multisig และดูไม่ออกด้วยซ้ำว่ากระเป๋าคุณเป็น multisig เพราะที่อยู่ P2SH ก็หน้าตาเหมือนที่อยู่ขึ้นต้นด้วย 3 ทั่วไป และ P2WSH ก็เหมือนที่ขึ้นต้นด้วย bc1q ทั่วไป

sender's wallet
to      3KSnTx3G8wRbYQpyE9q4KdqqwEMaBejDEe
amount  0.05000000 BTC
fee     2 sat/vB

// กระเป๋าของผู้โอนไม่ต้องรองรับ multisig
// และไม่มีทางรู้ค่า M, N หรือกุญแจสาธารณะของคุณเลย

ไม่มีอะไรพิเศษในธุรกรรมนี้เลย การถอนจาก exchange การปิดช่อง Lightning หรือเพื่อนโอนเงินคืน ก็เป็นแบบเดียวกันหมด

3

เหรียญไปอยู่ใน UTXO ที่ถูกล็อกด้วยสคริปต์ของคุณ

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

utxo
utxo
  value          0.05000000 BTC
  scriptPubKey   OP_HASH160 [ค่าแฮชสคริปต์ 20 ไบต์] OP_EQUAL
  ปลดล็อกด้วย     redeem script + ลายเซ็นที่ถูกต้อง M ดอก

กระเป๋าของคุณรู้ว่า output ก้อนนั้นเป็นของคุณก็เพราะ descriptor บอกว่าต้องเฝ้าดูที่อยู่ไหนบ้าง การเก็บ descriptor แบบดูอย่างเดียวไว้ในมือถือหรือแล็ปท็อป ก็พอให้เห็นเงินเข้าได้โดยไม่ต้องถือกุญแจสักดอก

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

สร้างที่อยู่สำหรับรับบิตคอยน์ยังไง

กระเป๋า multisig ไม่ได้มีที่อยู่เดียว แต่มีสิ่งที่เรียกว่า descriptor ซึ่งประกอบด้วยเกณฑ์ที่ต้องใช้ extended public key ของผู้ร่วมเซ็นทุกคนพร้อมเส้นทางต้นทาง และเครื่องหมายไวลด์การ์ดปิดท้าย เจ้าไวลด์การ์ดนี่เองที่เปลี่ยนกระเป๋าหนึ่งใบให้ผลิตที่อยู่ได้ไม่จำกัด

wallet descriptor
wsh(sortedmulti(2,
  [a1b2c3d4/48h/0h/0h/2h]xpub6E...uK/0/*,
  [e5f6a7b8/48h/0h/0h/2h]xpub6C...7p/0/*,
  [c9d0e1f2/48h/0h/0h/2h]xpub6D...m3/0/*
))

// [fingerprint/path] บอกว่ากุญแจดอกนี้อยู่ในอุปกรณ์ไหน
// /0/* คือสายสำหรับรับเงิน ส่วน /1/* คือสายเงินทอน
// ดัชนี 0, 1, 2 ... แต่ละค่าให้ที่อยู่ที่ต่างกันโดยสิ้นเชิง

จะสร้างที่อยู่ลำดับที่ 5 ผู้ร่วมเซ็นทุกคนก็อนุพัทธ์กุญแจลูกลำดับที่ 5 จาก extended key ของตัวเอง แล้วกระเป๋าประกอบสคริปต์ M-of-N จากกุญแจสาธารณะสามดอกที่ได้ ดัชนีเดียวกัน สคริปต์เดียวกัน ที่อยู่เดียวกัน เกิดขึ้นบนทุกอุปกรณ์โดยไม่ต้องคุยกันเลย

อนุพัทธ์ที่อยู่รับเงินแบบสด ๆ

Wallet descriptor (ย่อไว้ ของจริงจะมี xpub เต็ม)

···

ที่อยู่รับเงินที่อนุพัทธ์ออกมา

···

extended key สามชุดถูกสร้างขึ้นในเบราว์เซอร์ของคุณ แต่ละแถวคือการอนุพัทธ์ตาม BIP32 จริงที่ดัชนีถัดไปบนกุญแจทั้งสามชุด แล้วประกอบเป็นสคริปต์ 2-of-3 และแฮชออกมาเป็นที่อยู่ P2SH

ตัวอย่างด้านบนทำแบบนั้นจริง ๆ extended key สามชุดถูกสร้างในเบราว์เซอร์ของคุณ และแต่ละแถวคือการอนุพัทธ์ตามมาตรฐาน BIP32 ที่ดัชนีถัดไป แล้วแฮชออกมาเป็นที่อยู่ P2SH จริง สังเกตว่าที่อยู่ที่อยู่ติดกันไม่มีอะไรเหมือนกันเลย นั่นคือสิ่งที่ต้องการ เพราะคนนอกจะดูไม่ออกว่าทั้งหมดเป็นของกระเป๋าใบเดียวกัน

⚡
ก่อนรับเงินก้อนใหญ่ ให้กดแสดงที่อยู่บนหน้าจอของฮาร์ดแวร์วอลเล็ตแต่ละตัว แล้วเทียบว่าตรงกับที่โปรแกรมประสานงานแสดงหรือไม่ คอมพิวเตอร์ที่ถูกเจาะสามารถโชว์ที่อยู่ที่ไม่ใช่ของคุณได้ และการที่จอสามจอที่เป็นอิสระต่อกันแสดงตรงกันคือสิ่งที่ทำให้การโจมตีแบบนั้นล้มเหลว

ลองเอง: ใช้จ่ายจากห้องนิรภัย 2-of-3

ด้านล่างคือห้องนิรภัย multisig ที่ทำงานได้จริง คู่กุญแจสามชุดถูกสร้างขึ้นในเบราว์เซอร์ของคุณ redeem script และที่อยู่ P2SH ถูกคำนวณจากกุญแจเหล่านั้นจริง ๆ และปุ่มเซ็นแต่ละปุ่มสร้างลายเซ็น ECDSA จริงบนธุรกรรมนั้น เก็บลายเซ็นที่ถูกต้องให้ครบเกณฑ์แล้วธุรกรรมจะผ่าน จากนั้นลองแก้ยอดเงินดูว่าเกิดอะไรขึ้น

ห้องนิรภัย multisig ของจริง

ที่อยู่ห้องนิรภัย (P2SH คำนวณจากสคริปต์ด้านล่าง)

···

Redeem script

···

ธุรกรรมที่จะเซ็น

0.25000000 BTC

→ bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq

0 / 2 ลายเซ็น

ยังต้องการลายเซ็นที่ถูกต้องอีก 2 ดอก ก่อนจะกระจายธุรกรรมนี้ออกสู่เครือข่ายได้

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

เลือก M กับ N ยังไง

เกณฑ์นี้คือปุ่มหมุนระหว่างความล้มเหลวสองแบบ M สูงทำให้ขโมยยากขึ้น M ต่ำทำให้ทำกุญแจหายแล้วยังกู้คืนได้ ลองเลื่อนแถบเพื่อดูการแลกเปลี่ยนทั้งสองทาง

สำรวจการแลกเปลี่ยนของ M-of-N

2-of-3

🔑
🔑
🔑

กุญแจที่เน้นสีคือจำนวนขั้นต่ำที่ต้องใช้ในการใช้จ่าย

3
2

กุญแจที่โจรต้องขโมย

2

ผู้โจมตีต้องได้กุญแจ 2 ดอกจากทั้งหมด 3 ดอก น้อยกว่านั้นเงินก็ยังถูกล็อกอยู่

กุญแจที่ทำหายได้

1

คุณทำกุญแจหายได้ 1 ดอกจาก 3 ดอก แล้วยังกู้เงินคืนได้ทั้งหมด

รูปแบบที่ใช้กันบ่อย

⚡
สำรองแค่ seed phrase ยังไม่พอ การกู้กระเป๋า multisig กลับมาต้องมี wallet descriptor (หรือ redeem script ฉบับเต็ม) ด้วย ซึ่งบอกทั้งเกณฑ์และกุญแจสาธารณะทุกดอกตามลำดับที่ถูกต้อง ถ้าไม่มีสิ่งนี้ ต่อให้ถือกุญแจส่วนตัวครบทุกดอกก็ใช้เงินไม่ได้

เทคโนโลยีเบื้องหลัง

Multisig ไม่ใช่สิ่งประดิษฐ์ชิ้นเดียว แต่คือโครงสร้างพื้นฐานของ Bitcoin ราวครึ่งโหลที่ซ้อนทับกันอยู่ และส่วนใหญ่คุณก็ใช้มันอยู่แล้วในกระเป๋ากุญแจเดี่ยวธรรมดา

secp256k1 และ ECDSA

คู่กุญแจของผู้ร่วมเซ็นทุกคนและลายเซ็นทุกดอก ใช้คณิตศาสตร์เส้นโค้งวงรีชุดเดียวกับกระเป๋ากุญแจเดี่ยวเป๊ะ ๆ multisig ไม่ได้เพิ่มการเข้ารหัสแบบใหม่ตรงนี้เลย เพียงแต่ต้องการลายเซ็นมากกว่าหนึ่งดอก

Bitcoin Script และ OP_CHECKMULTISIG

กติกาเรื่องเกณฑ์คือโปรแกรมในภาษาแบบสแต็กของ Bitcoin โดย OP_CHECKMULTISIG จะไล่ตรวจรายการลายเซ็นเทียบกับรายการกุญแจสาธารณะ และผ่านก็ต่อเมื่อตรวจถูกต้องครบ M ดอก

P2SH, P2WSH และ P2TR

ชนิดของ output เป็นตัวกำหนดว่าสคริปต์ถูกผูกเข้ากับที่อยู่อย่างไร และถูกเปิดเผยตอนใช้จ่ายอย่างไร P2SH แฮชด้วย HASH160 ส่วน P2WSH ของ SegWit ใช้ SHA-256 และย้ายสคริปต์ไปไว้ใน witness ขณะที่ Taproot ซ่อนมันได้ทั้งก้อน

BIP32 และ descriptor

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

PSBT

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

Schnorr และ MuSig2

Taproot เพิ่มลายเซ็นแบบ Schnorr ซึ่งรวมกันได้ เมื่อใช้ MuSig2 กลุ่มผู้ร่วมเซ็นจะผลิตลายเซ็นเดียวที่บนเชนดูเหมือนการใช้จ่ายด้วยกุญแจเดี่ยว ขนาดเล็กกว่า ถูกกว่า และไม่เปิดเผยนโยบาย

แต่ละชิ้นล้วนเป็นมาตรฐานที่เผยแพร่ไว้ นี่คือเหตุผลที่ฮาร์ดแวร์วอลเล็ตต่างยี่ห้อกันสามารถร่วมเซ็นธุรกรรมเดียวกันได้:

standards
BIP 11    ธุรกรรมมาตรฐานแบบ m-of-n              2011
BIP 16    P2SH — จ่ายไปยังค่าแฮชของสคริปต์        2012
BIP 32    กระเป๋าแบบลำดับชั้นเชิงกำหนด
BIP 45    เส้นทางอนุพัทธ์สำหรับหลายฝ่าย
BIP 48    เส้นทางอนุพัทธ์แยกตามชนิดสคริปต์
BIP 67    การเรียงกุญแจเชิงกำหนด (sortedmulti)
BIP 141   segregated witness, P2WSH
BIP 174   PSBT — ธุรกรรมที่เซ็นบางส่วน
BIP 341   Taproot
BIP 327   การรวมกุญแจแบบ MuSig2
BIP 380+  output script descriptor
💡
มาตรฐานเหล่านี้ไม่ต้องขออนุญาตใครทั้งสิ้น กระเป๋าใดก็ตามที่รองรับ descriptor และ PSBT ก็เข้าร่วมชุด multisig ที่มีอยู่แล้วได้ นั่นคือสิ่งที่ทำให้คุณไม่ถูกล็อกไว้กับผู้ผลิตรายเดียว

ความเสี่ยง และมันกัดเราตรงไหน

Multisig กำจัดจุดล้มเหลวจุดเดียวออกไป แล้วแทนที่ด้วยจุดเล็ก ๆ หลายจุด และการสูญเงินใน multisig เกือบทุกกรณีมาจากความผิดพลาดในการใช้งาน ไม่ใช่ลายเซ็นที่ถูกเจาะ

⚠️

ทำ descriptor หาย

สาเหตุการสูญเงินทั้งก้อนที่พบบ่อยที่สุด ลำพัง seed phrase สร้างกระเป๋า multisig กลับมาไม่ได้ เพราะต้องมีเกณฑ์ กุญแจสาธารณะทุกดอก และเส้นทางอนุพัทธ์ที่ถูกต้องด้วย ให้เก็บ descriptor ไว้คู่กับที่สำรองทุกชุด

⚠️

ตั้งเกณฑ์ไว้ตึงจนไม่เหลือที่หายใจ

2-of-2 และ 3-of-3 ไม่มีเผื่อไว้เลย อุปกรณ์พังหนึ่งตัว ที่สำรองหายหนึ่งชุด หรือหุ้นส่วนหนึ่งคนไม่ยอมร่วมมือ เหรียญก็ถูกแช่แข็งตลอดกาล ถ้าต้องการเผื่อไว้ N ต้องมากกว่า M

⚠️

กุญแจที่พังพร้อมกัน

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

⚠️

ผู้ประสานงานที่ถูกเจาะสลับที่อยู่ปลายทาง

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

⚠️

ค่าธรรมเนียมสูงขึ้นและชิ้นส่วนเยอะขึ้น

input ของ multisig พกลายเซ็นหลายดอกและสคริปต์ทั้งก้อนไปด้วย จึงใหญ่กว่า input แบบกุญแจเดี่ยวมาก บางทีค่าธรรมเนียมต่างกันหลายเท่า การรวม UTXO ก้อนเล็ก ๆ จำนวนมากจากกระเป๋า multisig จึงแพงขึ้นเร็วมาก

⚠️

ความเป็นส่วนตัวและความซับซ้อนที่รั่วออกไป

ก่อนยุค Taproot การใช้จ่ายจะเปิดเผยนโยบายของคุณบนเชน ใคร ๆ ก็เห็นว่าเป็น 2-of-3 การใช้ที่อยู่ซ้ำก็เชื่อมโยงเงินของคุณเข้าด้วยกัน และผู้ร่วมเซ็นทุกคนที่เพิ่มเข้ามาคือคนหรือบริการอีกหนึ่งรายที่อาจหายไป ถูกบีบบังคับ หรือสมคบกันได้

⚡
ซ้อมกู้คืนก่อนที่จะไว้ใจมัน ล้างอุปกรณ์สักตัว กู้กระเป๋ากลับมาจาก descriptor กับ seed phrase ล้วน ๆ แล้วลองใช้จ่ายจำนวนน้อย ๆ ดู ตัวสำรองที่ยังไม่เคยกู้คืนสำเร็จ ยังเป็นแค่สมมติฐาน ไม่ใช่ตัวสำรอง

ทำไมเรื่องนี้ถึงสำคัญกับ Bitcoin

Multisig เปลี่ยน “ห้ามทำกุญแจหาย” จากความเสี่ยงร้ายแรงจุดเดียว ให้กลายเป็นโจทย์วิศวกรรมที่ออกแบบรับมือได้

ถือเองโดยไม่มีจุดล้มเหลวจุดเดียว

2-of-3 ที่กระจายไว้ในตู้เซฟที่บ้าน ฮาร์ดแวร์วอลเล็ต และที่สำรองไกลบ้าน รอดได้ทั้งไฟไหม้บ้าน อุปกรณ์ถูกขโมย หรือโดนย่องเบา อย่างใดอย่างหนึ่งโดยที่เหรียญไม่หาย

คลังเงินขององค์กร

3-of-5 ที่กระจายในหมู่ผู้บริหาร แปลว่าไม่มีพนักงานคนเดียวขยับเงินบริษัทได้ และการลาออกหรือถูกเจาะของคนเดียวก็ไม่ทำให้คลังเงินถูกล็อกตาย

มรดกและการกู้คืน

มอบกุญแจหนึ่งดอกให้คนในครอบครัวหรือบริการช่วยกู้คืน เขาใช้จ่ายเองไม่ได้ แต่เมื่อรวมกับตัวสำรองของคุณก็กู้เงินคืนได้หากคุณไม่อยู่แล้ว

Taproot และ MuSig2

ตั้งแต่ Taproot (2021) ผู้ร่วมเซ็นสามารถรวมกุญแจเข้าด้วยกันเป็นลายเซ็นเดียวได้ บนเชนจะดูเหมือนการใช้จ่ายด้วยกุญแจเดี่ยวธรรมดา ค่าธรรมเนียมถูกกว่าและไม่เปิดเผยนโยบายการเซ็นที่อยู่เบื้องหลัง

✨
Multisig คือตัวอย่างที่ชัดที่สุดว่าชั้นสคริปต์ของ Bitcoin ให้อะไรกับเรา นั่นคือนโยบายการใช้จ่ายที่ไม่ต้องเชื่อใจสถาบันไหนให้ทำตาม เพราะโหนดอิสระนับพันตรวจซ้ำให้ในทุก ๆ ธุรกรรม

บทเรียนที่เกี่ยวข้อง