# Coinjoin/Payjoin

## CoinJoin

{% embed url="<https://youtu.be/GxwLTP4iE34>" %}
เนิื้อหาในคลิปมีการใช้ AI ในการสร้างเสียง และเนื้อหาไม่ครบถ้วนเท่าบทความด้านล่าง จัดทำเพื่อใครที่ต้องการทำความเข้าใจแบบพื้นฐานก่อนจะลงลึก
{% endembed %}

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) ดังนี้:

1. **ผู้รับแจ้ง endpoint ของ PayJoin:** ผู้รับสร้างลิงก์ BIP21 โดยเพิ่มพารามิเตอร์ `pj=` เพื่อบอกช่องทาง (URL) ให้ผู้ส่งส่ง PSBT ต้นฉบับเข้ามายังเซิร์ฟเวอร์ของผู้รับ (เช่น `bitcoin:<address>?pj=https://merchant.example/payjoin`)
2. **ผู้ส่งสร้าง Original PSBT:** ผู้ส่งจัดเตรียม PSBT ที่มีการลงลายเซ็นสำหรับอินพุตของตนเองครบถ้วน (Original PSBT) แล้วส่ง (POST) มายัง endpoint ที่ผู้รับแจ้ง
3. **ผู้รับเพิ่มอินพุตของตน:** ผู้รับรับ PSBT ต้นฉบับมาแล้วเพิ่มอินพุตจาก UTXO ของตนเอง พร้อมกำหนดเอาต์พุตใหม่ให้เหมาะสม จากนั้นผู้รับลงลายเซ็นในอินพุตของตน (Resulting PSBT เรียกว่า Payjoin Proposal PSBT)
4. **ผู้ส่งตรวจสอบ-เซ็น-เผยแพร่:** ผู้ส่งตรวจสอบการเปลี่ยนแปลงใน 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

* [https://en.bitcoin.it/wiki/PayJoin#:\~:text=PayJoin%20%28also%20called%20pay,output%20%201](https://en.bitcoin.it/wiki/PayJoin)
* h[ttps://en.bitcoin.it/wiki/CoinJoin#:\~:text=CoinJoin%20is%20a%20trustless%20method,modification%20to%20the%20bitcoin%20protocol](https://en.bitcoin.it/wiki/CoinJoin)

บทความนี้อ้างอิงหลักการและมาตรฐานจาก Bitcoin Wiki, BIPs (เช่น BIP78) และเอกสารเทคนิคต่างๆ ที่เกี่ยวข้อง

* [https://payjoin.org/docs/how-it-works/payjoin-v1-bip-78/#:\~:text=1,Payjoin%20transaction](https://payjoin.org/docs/how-it-works/payjoin-v1-bip-78/)
