Coinjoin/Payjoin
บทความนี้จะอธิบายหลักการทำงานของ CoinJoin และ PayJoin โดยเปรียบเทียบข้อดี ข้อจำกัด และกรณีการใช้งาน เพื่อให้เข้าใจว่าทั้งสองเทคนิคนี้สามารถเสริมความเป็นส่วนตัวให้กับผู้ใช้ Bitcoin ได้อย่างไรในเชิงเทคน
CoinJoin
CoinJoin เป็นวิธีการรวมธุรกรรม (UTXO) ของผู้ใช้หลายคนเข้าด้วยกันในหนึ่งธุรกรรมเดียว โดยไม่มีการแก้ไขโปรโตคอล Bitcoin ทำให้ยากต่อการตามรอยการจ่ายเงินของแต่ละคน หลักการคือผู้ใช้จำนวนหนึ่งตกลงร่วมกันเลือกรายการอินพุต (UTXO ของตัวเอง) และสร้างเอาต์พุตขึ้นใหม่ที่มีรูปแบบเหมือนกัน (เช่น ขนาด X BTC จำนวน N รายการ) จากนั้นแต่ละคนลงลายมือชื่ออินพุตของตนแยกกันและรวมไว้ในธุรกรรมเดียว เนื่องจากลายเซ็นของแต่ละอินพุตอิสระจากกัน ผู้ใช้ทุกคนจึงสามารถลงนามแยกกันได้ Transaction จะถูกส่งออกไปยังเครือข่ายก็ต่อเมื่อมีลายเซ็นครบทุกอินพุตเท่านั้น
การทำงานทางเทคนิคของ CoinJoin
ในทางปฏิบัติ CoinJoin ทำงานโดยมีผู้ประสาน (coordinator) หรือวิธีการรวมกลุ่มผู้ใช้ให้มาร่วมกัน โดยทั่วไปขั้นตอนคล้ายกันคือ:
ผู้ใช้แต่ละคนระบุจำนวนเงินที่จะผสมและ UTXO ของตน จากนั้นผู้ประสานรวบรวมรายการอินพุตและเอาต์พุต (กำหนดค่าเอาต์พุตให้มีขนาดเท่ากันเพื่อพรางตัว)
แต่ละคนสร้าง PSBT (Partially Signed Bitcoin Transaction) หรือชุดข้อมูลคร่าวๆ ของธุรกรรม แล้วลงลายเซ็นลงในอินพุตของตน
รวบรวม PSBT จากทุกคน เพื่อนำลายเซ็นของทุกอินพุตมารวมกันในธุรกรรมเดียว
ส่งธุรกรรมสุดท้ายไปยังเครือข่าย เมื่อครบทุกลายเซ็น Transaction จึงถูกยอมรับและบันทึกในบล็อกเชน
ด้วยวิธีนี้ CoinJoin จะสร้างธุรกรรมที่มีหลายอินพุตจากหลายเจ้าของ และหลายเอาต์พุตที่มีมูลค่าเท่ากัน (ตัวอย่างเช่น ผู้ใช้ N คนตกลงกำหนดเอาต์พุตขนาด X BTC ผลลัพธ์คือเอาต์พุต N ตัวขนาด X BTC บวกเอาต์พุตเงินทอน N ตัวหากผู้ใช้บางคนมีมูลค่าเกิน X BTC) ทำให้ผู้สังเกตไม่สามารถบอกได้ว่าอินพุตใดไปจ่ายเอาต์พุตใด
ตัวอย่าง CoinJoin
สมมติว่ามีผู้ใช้สามคน A, B, C ต้องการ CoinJoin กัน โดย A มี UTXO 5 BTC, B มี 7 BTC, C มี 3 BTC. พวกเขาตกลงให้สร้างเอาต์พุต 3 BTC จำนวน 3 ตัว (เท่ากับ N=3) และผู้ใช้แต่ละคนจะต้องจ่ายเป็นจำนวนขั้นต่ำ 3 BTC หากใครมีส่วนเกินก็จะได้ “เงินทอน” กลับ (เช่น A ได้เงินทอน 2 BTC, B ได้ 4 BTC) ธุรกรรมสุดท้ายจึงมีอินพุต 3 รายการ (5, 7, 3) และเอาต์พุต 3 รายการ (3, 3, 3) บวกเอาต์พุตเงินทอนตามส่วนเกินเมื่อจำเป็น ผู้ใช้ A, B, C ต่างลงลายเซ็นต์ในอินพุตของตนทั้งหมดก่อนที่ธุรกรรมนั้นจะถูกแพร่กระจาย การสร้างธุรกรรมลักษณะนี้ช่วยให้แม้จะทราบยอดเข้า-ออกทั้งหมด แต่ผู้วิเคราะห์บล็อกเชนก็ไม่สามารถเชื่อมโยงได้ง่ายว่าใครจ่ายใคร เนื่องจากมีหลายอินพุตหลายเอาต์พุตที่เหมือนกัน
การใช้งานและข้อจำกัดของ CoinJoin
ในเชิงการนำไปใช้ CoinJoin ไม่ได้เป็นส่วนหนึ่งของโปรโตคอล Bitcoin จึงไม่มี BIP มาตรฐานเฉพาะโดยตรง แต่มีการพัฒนาโปรแกรมและกระเป๋าที่รองรับ เช่น JoinMarket (desktop) ที่ถือเป็นการใช้งาน CoinJoin แบบ peer-to-peer แห่งแรก, Wasabi Wallet (desktop) ซึ่งใช้โปรโตคอล ZeroLink/WabiSabi ทำ CoinJoin แบบไม่ต้องเชื่อใจคนกลาง, และ Samourai Wallet (มือถือ) ที่มีฟีเจอร์ Whirlpool (ZeroLink variant) แต่ปัญหาสำคัญในการใช้งานได้แก่ความซับซ้อนของการประสานงานผู้เข้าร่วม จำนวนผู้ร่วมที่เพียงพอ และการจัดการ “เงินทอนที่เป็นพิษ” (toxic change) ในเวอร์ชันเก่าของ CoinJoin (ซึ่ง WabiSabi ใน Wasabi 2.0 ได้พยายามแก้ไขด้วยการสร้าง transaction พรี-มิกซ์เพื่อลดเงินทอน)
อีกหนึ่งจุดต้องระวังคือ การโจมตีแบบ DOS (Denial of Service) ในกระบวนการ CoinJoin: หากผู้เข้าร่วมคนใดคนหนึ่งปฏิเสธที่จะลงลายเซ็นต์ให้ธุรกรรม หรืออาจใช้ UTXO ของตนซ้ำก่อนจะเสร็จ (double-spend) ก็ทำให้การทำ Coin join ครั้งนั้นล่มได้ โดย CoinJoin ทั่วไปมักรับมือด้วยการตั้งเวลา หากมีคนไม่ส่งลายเซ็นภายในเวลาที่กำหนดก็จะยกเลิกผู้เข้าร่วมนั้นและเริ่มต้นใหม่ ซึ่งช่วยลดความเสี่ยงลง ในทางปฏิบัติ หากพยายามหลายครั้งก็ไม่มีการสูญเสียเงินจริง แต่อาจทำให้เกิดความล่าช้าหรือค่าใช้จ่ายมากขึ้นได้
PayJoin
PayJoin (หรือ Pay-to-EndPoint, P2EP) เป็นรูปแบบหนึ่งของ CoinJoin ที่เกิดขึ้นระหว่างผู้ส่งและผู้รับในการทำธุรกรรมเดียวกัน โดยผู้รับจะ “จ่ายเข้าร่วม” ไปใน transaction เดียวกับผู้ส่ง ทำให้ transaction สุดท้ายดูเหมือนธุรกรรมปกติทั่วไป แต่อินพุตของผู้ส่งและผู้รับถูกผสมรวมกัน ตัวอย่างเช่น ธุรกรรมหนึ่งอาจมีอินพุต 2 BTC (เป็นของผู้รับ) และ 5 BTC (เป็นของผู้ส่ง) กับเอาต์พุต 3 BTC และ 4 BTC จากภายนอกอาจตีความได้ว่าเป็นผู้ส่งจ่ายผู้รับ 1 BTC มีเงินทอน หรือเป็น PayJoin ระหว่างผู้ส่งและผู้รับก็ได้ ไม่มีวิธีใดบอกได้แน่นอน ผลลัพธ์คือ PayJoin ช่วยทำลายสมมติฐาน common-input-ownership (ซึ่งว่าทุกอินพุตในธุรกรรมปกติเป็นของเจ้าของคนเดียว) และเพิ่มความเป็นส่วนตัวในการจ่ายเงิน ในขณะที่ transaction ดูเหมือนการจ่ายเงินปกติทั่วไปจึง “ไม่ถูกมองว่าเป็น CoinJoin” อย่างชัดเจน
การทำงานทางเทคนิคของ PayJoin
มาตรฐาน PayJoin ปัจจุบันอยู่ใน BIP78 (Pay-to-EndPoint v1) ซึ่งกำหนดวิธีการสร้าง CoinJoin ระหว่างผู้ส่ง (Alice) และผู้รับ (Bob) ดังนี้:
ผู้รับแจ้ง endpoint ของ PayJoin: ผู้รับสร้างลิงก์ BIP21 โดยเพิ่มพารามิเตอร์
pj=
เพื่อบอกช่องทาง (URL) ให้ผู้ส่งส่ง PSBT ต้นฉบับเข้ามายังเซิร์ฟเวอร์ของผู้รับ (เช่นbitcoin:<address>?pj=https://merchant.example/payjoin
)ผู้ส่งสร้าง Original PSBT: ผู้ส่งจัดเตรียม PSBT ที่มีการลงลายเซ็นสำหรับอินพุตของตนเองครบถ้วน (Original PSBT) แล้วส่ง (POST) มายัง endpoint ที่ผู้รับแจ้ง
ผู้รับเพิ่มอินพุตของตน: ผู้รับรับ PSBT ต้นฉบับมาแล้วเพิ่มอินพุตจาก UTXO ของตนเอง พร้อมกำหนดเอาต์พุตใหม่ให้เหมาะสม จากนั้นผู้รับลงลายเซ็นในอินพุตของตน (Resulting PSBT เรียกว่า Payjoin Proposal PSBT)
ผู้ส่งตรวจสอบ-เซ็น-เผยแพร่: ผู้ส่งตรวจสอบการเปลี่ยนแปลงใน PSBT ของผู้รับ พร้อมลงลายเซ็นในอินพุตที่เหลือให้ครบ จากนั้นจึง Finalize และเผยแพร่ธุรกรรมสุดท้ายไปยังเครือข่าย
วิธีนี้ทำให้เงินที่ผู้รับได้ถูกจ่ายใน transaction เดียวกันที่ผู้ส่งสร้างขึ้น โดยไม่มีใครสามารถบอกได้จากธุรกรรมในบล็อกเชนว่าเป็น PayJoin (ดูเหมือนธุรกรรมจ่ายธรรมดา) และการใช้ PSBT (BIP174) ช่วยให้ทำได้ง่ายและปลอดภัย
ตัวอย่าง PayJoin
ตัวอย่างหนึ่งของ PayJoin ได้แก่กรณีผู้ส่งต้องการจ่ายผู้รับ 1 BTC และผู้รับมี UTXO 2 BTC อยู่แล้ว: ผู้ส่งสร้าง PSBT จ่าย 1 BTC (และมีเงินทอน 4 BTC จาก 5 BTC ที่มี) ส่งให้ผู้รับ ผู้รับเพิ่มอินพุต 2 BTC ของตนเองเข้า PSBT และลดเอาต์พุต (เช่นลดเอาต์พุตเงินทอนของผู้ส่งจาก 4 BTC ลงเหลือ 3 BTC เพื่อจ่ายให้ตนเอง 1 BTC เพิ่มเติม) เมื่อผู้ส่งรับ PSBT กลับ ก็ตรวจสอบและ Finalize ตัวอย่างนี้จะได้ธุรกรรมสุดท้ายมีอินพุต 5 BTC + 2 BTC และเอาต์พุต 3 BTC + 4 BTC ทำให้ไม่สามารถแยกแยะได้แน่นอนว่าเป็น PayJoin หรือไม่
การใช้งานและข้อจำกัดของ PayJoin
มาตรฐานหลักของ PayJoin คือ BIP78 (ซิงโครนัส) โดยทั่วไปมีการสนับสนุนในหลายโซลูชัน เช่น Sparrow Wallet, BlueWallet, JoinMarket และ Wasabi Wallet (อัปเดตปี 2020) ที่รองรับ BIP78 นอกจากนี้ยังมี BIP77 ซึ่งเสนอ PayJoin แบบอะซิงโครนัส (serverless) โดยไม่ต้องมีเซิร์ฟเวอร์ของผู้รับ ในทางปฏิบัติ การใช้ PayJoin ต้องอาศัยทั้งผู้ส่งและผู้รับสนับสนุนโปรโตคอลนี้พร้อมกัน: ผู้รับจะต้องใช้ hot wallet หรือบริการออนไลน์เพื่อรับและประมวลผล PSBT อยู่เสมอ ข้อจำกัดของ PayJoin v1 ได้แก่ต้อง สื่อสารแบบ synchronous คือผู้รับต้องเปิดเซิร์ฟเวอร์รอรับ PSBT ตลอดเวลา ทำให้ผู้รับต้องเก็บเงินในกระเป๋าที่เชื่อมต่อเน็ตเสมอ ซึ่งเพิ่มความเสี่ยงเรื่องความปลอดภัยและอาจเป็นอุปสรรคต่อการใช้งาน
อีกข้อควรระวังคือ PayJoin ทำให้ “การจ่ายเงินด้วย UTXO ของผู้รับ” กลายเป็นส่วนหนึ่งของธุรกรรม ซึ่งอาจเปิดโอกาสให้ผู้ส่ง (หรือใครก็ตามกลางทาง) ทำการโจมตีตรวจสอบข้อมูล UTXO ของผู้รับได้ (เรียกว่า UTXO probing attack) ซึ่งในขณะนี้มีการหารือแนวทางป้องกันเพิ่มเติม เช่น สัญญาณ BIP21 พิเศษ (pjos=0
) ที่บอกให้ผู้ส่งห้ามเปลี่ยนแปลงเอาต์พุตชำระเงินหลัก เพื่อป้องกันการโจรกรรมเงินที่อาจเกิดขึ้น (แต่กลไกนี้เป็นรายละเอียดของ BIP78 ซึ่งอาจจะนำมาอธิบายในอนาคต)
การเปรียบเทียบ CoinJoin และ PayJoin
ความเป็นส่วนตัว: CoinJoin มีความได้เปรียบเรื่อง anonymity set ที่สามารถขยายได้ขึ้นกับจำนวนผู้เข้าร่วมจำนวนมาก (ยิ่งผู้เข้าร่วมเยอะยิ่งยากที่จะเชื่อมโยง) แต่ธุรกรรม CoinJoin มักมีรูปแบบเด่นชัด (เช่น เอาต์พุตหลายรายการขนาดเท่ากัน) จึงอาจถูกตรวจจับว่าเป็นการผสมเหรียญได้ง่าย ในขณะที่ PayJoin เสนอความเป็นส่วนตัวด้วยวิธีที่ต่างไป โดยใส่อินพุตของผู้รับเข้าไปใน transaction ผู้ส่ง ทำให้ transaction ดูเหมือนปกติ จึงทำให้ heuristic ทั่วไป (เช่น common-input-ownership) หักล้างได้ง่ายกว่า นอกจากนี้ PayJoin มีข้อได้เปรียบที่ไม่ทิ้งลายนิ้วมือของ CoinJoin เนื่องจากไม่มีเอาต์พุตหลายรายการขนาดเท่ากันตามแบบ CoinJoin ปกติ อย่างไรก็ตาม PayJoin มี anonymity set เล็กกว่า (โดยทั่วไปมีผู้เข้าร่วมสองฝ่าย) ในขณะที่ CoinJoin อาจผสมกันหลายคนหลาย UTXO.
ความสะดวกใช้งาน: CoinJoin มักต้องพึ่งพาผู้ประสานหรือระบบจับคู่ผู้ใช้หลายคน (เช่น coordinator ของ Wasabi หรือตลาดของ JoinMarket) ทำให้ขั้นตอนยุ่งยากกว่า ผู้ใช้ต้องรอเพื่อนร่วม CoinJoin จำนวนหนึ่งจึงจะเริ่มได้ และขั้นตอนโดยรวมค่อนข้างซับซ้อน ในทางกลับกัน PayJoin เป็นลักษณะ "ฝั่งซื้อฝั่งขายร่วมกันลงนาม" ในธุรกรรมเดียว จึงทำงานคล้ายกับการจ่ายเงินปกติของ Bitcoin ปกติ เพียงแต่ทั้งสองฝ่ายต้องรองรับโปรโตคอล BIP78 ด้วย สำหรับผู้ซื้อ-ผู้ขายทั่วไป PayJoin จะสะดวกกว่าเพราะไม่ต้องเริ่มกระบวนการผสมเหรียญเพิ่มเติมหลังจ่ายเงินเหมือน CoinJoin (แค่ใช้กระเป๋าที่รองรับ PayJoin ก็พอ)
ความต้านทานต่อการตรวจจับ: ธุรกรรม CoinJoin แบบดั้งเดิมมักจะถูกตรวจจับได้ง่ายจากรูปแบบ เช่น เอาต์พุตหลายรายการขนาดเท่ากัน หรือ heuristic อื่น ๆ ในทางตรงกันข้าม PayJoin ถูกออกแบบมาให้ ไม่สามารถตรวจจับได้ชัดเจน ว่าเป็น CoinJoin เพราะ transaction ดูเหมือนธุรกรรมทั่วไป โดยนักวิเคราะห์บล็อกเชนจึงไม่สามารถระบุได้แน่ชัด (PayJoin จึงทำให้ common-input-ownership heuristic ไม่ใช้การได้ตามเจตนา)
การใช้งานจริง: ปัจจุบัน CoinJoin เป็นวิธีที่มีการใช้งานอย่างแพร่หลาย ในฐานะฟีเจอร์ของ wallet หลายเจ้า (เช่น Wasabi, Samourai, JoinMarket) ที่มีผู้ใช้งานอยู่มาก PayJoin เป็นแนวคิดที่ได้รับความสนใจเพิ่มขึ้นในช่วงหลัง และหลายกระเป๋าเริ่มรองรับแล้ว (เช่น Sparrow, BlueWallet, JoinMarket, Wasabi) อย่างไรก็ดี การตรวจสอบปริมาณการใช้งาน PayJoin นั้นยากเพราะไม่สามารถแยกได้จากบล็อกเชน บล็อกข้อมูลต่าง ๆ ชี้ว่า BIP78 ยังเป็นมาตรฐานที่ใช้กันมากที่สุดในกลุ่ม PayJoin และ PayJoin ยังถือว่ามีการใช้งานไม่สูงเท่า CoinJoin แต่ก็เริ่มมีการใช้อย่างชัดเจนมากขึ้น (เช่น ในระบบ BTCPay Server) ทั้งนี้หากมีผู้ใช้ PayJoin มากขึ้นก็จะส่งผลให้ heuristic ทั่วไปเช่น common-input-ownership ถูกทำให้ใช้การไม่ได้อย่างมีนัยสำคัญ
อ้างอิง: CoinJoin และ PayJoin เป็นกลไกความเป็นส่วนตัวทางเทคนิคยอดนิยมบน Bitcoin บนเลเยอร์หลัก (on-chain) โดยไม่เกี่ยวข้องกับ Lightning Network
บทความนี้อ้างอิงหลักการและมาตรฐานจาก Bitcoin Wiki, BIPs (เช่น BIP78) และเอกสารเทคนิคต่างๆ ที่เกี่ยวข้อง
Last updated