เราสานต่อซีรีส์ของเราเกี่ยวกับบล็อกเชน Monero และบทความในวันนี้จะมุ่งเน้นไปที่โปรโตคอล RingCT (Ring Confidential Transactions) ซึ่งแนะนำธุรกรรมที่เป็นความลับและลายเซ็นวงแหวนใหม่ น่าเสียดายที่มีข้อมูลเพียงเล็กน้อยบนอินเทอร์เน็ตเกี่ยวกับวิธีการทำงาน และเราพยายามเติมเต็มช่องว่างนี้
เราจะพูดถึงวิธีที่เครือข่ายซ่อนจำนวนเงินโอนโดยใช้โปรโตคอลนี้ เหตุใดพวกเขาจึงละทิ้งลายเซ็นวงแหวน cryptonote แบบคลาสสิก และเทคโนโลยีนี้จะพัฒนาต่อไปอย่างไร
เนื่องจากโปรโตคอลนี้เป็นหนึ่งในเทคโนโลยีที่ซับซ้อนที่สุดใน Monero ผู้อ่านจะต้องมีความรู้พื้นฐานเกี่ยวกับการออกแบบบล็อกเชนนี้ และความรู้ผ่านเกี่ยวกับการเข้ารหัสแบบเส้นโค้งวงรี (เพื่อทบทวนความรู้นี้ คุณสามารถอ่านบทแรกของเราได้ บทความก่อนหน้านี้เกี่ยวกับ
โปรโตคอล RingCT
หนึ่งในการโจมตีสกุลเงิน cryptonote ที่เป็นไปได้คือการวิเคราะห์บล็อคเชนตามความรู้เกี่ยวกับจำนวนและเวลาของธุรกรรมที่ส่ง สิ่งนี้ช่วยให้
เป็นที่น่าสังเกตว่าแนวคิดในการซ่อนจำนวนเงินไม่ใช่เรื่องใหม่ Greg Maxwell ผู้พัฒนา Bitcoin Core เป็นหนึ่งในคนกลุ่มแรก ๆ ที่อธิบายสิ่งนี้ในตัวเขา
เหนือสิ่งอื่นใด โปรโตคอลช่วยขจัดปัญหาในการผสมฝุ่น - เอาต์พุตจำนวนเล็กน้อย (โดยปกติจะได้รับในรูปแบบของการเปลี่ยนแปลงจากธุรกรรม) ซึ่งสร้างปัญหามากกว่าที่ควรจะเป็น
ในเดือนมกราคม 2017 ฮาร์ดฟอร์คของเครือข่าย Monero เกิดขึ้น ทำให้สามารถเลือกใช้ธุรกรรมที่เป็นความลับได้ และในเดือนกันยายนของปีเดียวกัน ด้วยฮาร์ดฟอร์กเวอร์ชัน 6 ธุรกรรมดังกล่าวจึงกลายเป็นธุรกรรมเดียวที่ได้รับอนุญาตบนเครือข่าย
RingCT ใช้กลไกหลายอย่างพร้อมกัน: ลายเซ็นกลุ่มที่ไม่เปิดเผยตัวตนที่เกิดขึ้นเองที่เชื่อมโยงหลายชั้น (ลายเซ็นกลุ่มที่ไม่เปิดเผยตัวตนที่เกิดขึ้นเองแบบหลายชั้นที่เชื่อมโยงได้ซึ่งต่อไปนี้จะเรียกว่า MLSAG) รูปแบบความมุ่งมั่น (ความมุ่งมั่นของ Pedersen) และการพิสูจน์ช่วง (คำนี้ไม่มีการแปลที่เป็นที่ยอมรับเป็นภาษารัสเซีย) .
โปรโตคอล RingCT แนะนำธุรกรรมที่ไม่ระบุชื่อสองประเภท: แบบง่ายและเต็มรูปแบบ กระเป๋าเงินจะสร้างรายการแรกเมื่อธุรกรรมใช้มากกว่าหนึ่งอินพุต ส่วนรายการที่สองจะเกิดขึ้นในสถานการณ์ตรงกันข้าม โดยมีความแตกต่างกันในการตรวจสอบความถูกต้องของจำนวนธุรกรรมและข้อมูลที่ลงนามด้วยลายเซ็น MLSAG (เราจะพูดถึงเรื่องนี้เพิ่มเติมด้านล่าง) นอกจากนี้ ธุรกรรมประเภทเต็มสามารถสร้างขึ้นได้ด้วยอินพุตจำนวนเท่าใดก็ได้ โดยไม่มีความแตกต่างพื้นฐาน ในหนังสือ
ลายเซ็น MLSAG
โปรดจำไว้ว่าอินพุตธุรกรรมที่ลงนามคืออะไร แต่ละธุรกรรมใช้จ่ายและสร้างรายได้บางส่วน การสร้างเงินทุนเกิดขึ้นโดยการสร้างเอาท์พุตธุรกรรม (การเปรียบเทียบโดยตรงคือตั๋วเงิน) และเอาท์พุตที่ธุรกรรมใช้ไป (ท้ายที่สุดแล้วในชีวิตจริงเราใช้ธนบัตร) กลายเป็นอินพุต (ระวังมันง่ายมากที่จะสับสน ที่นี่).
อินพุตอ้างอิงเอาต์พุตหลายตัว แต่ใช้เพียงอันเดียว จึงสร้าง "สโมคสกรีน" เพื่อทำให้ยากต่อการวิเคราะห์ประวัติการแปล หากธุรกรรมมีอินพุตมากกว่าหนึ่งรายการ โครงสร้างดังกล่าวสามารถแสดงเป็นเมทริกซ์ โดยที่แถวเป็นอินพุต และคอลัมน์เป็นเอาต์พุตแบบผสม เพื่อพิสูจน์ให้เครือข่ายเห็นว่าธุรกรรมใช้เอาต์พุตอย่างแน่นอน (รู้รหัสลับ) อินพุตจะถูกเซ็นชื่อด้วยลายเซ็นวงแหวน ลายเซ็นดังกล่าวรับประกันว่าผู้ลงนามรู้รหัสลับสำหรับองค์ประกอบทั้งหมดของคอลัมน์ใดๆ
ธุรกรรมที่เป็นความลับไม่ใช้ธุรกรรมแบบคลาสสิกอีกต่อไป
พวกเขาถูกเรียกว่าหลายชั้นเพราะพวกเขาลงนามหลายอินพุตในคราวเดียวซึ่งแต่ละอันผสมกับอินพุตอื่น ๆ หลายอย่างเช่น เมทริกซ์ถูกเซ็นชื่อและไม่ใช่แถวเดียว ดังที่เราจะได้เห็นในภายหลัง ซึ่งจะช่วยประหยัดขนาดลายเซ็น
มาดูกันว่าลายเซ็นวงแหวนเกิดขึ้นได้อย่างไร โดยใช้ตัวอย่างของธุรกรรมที่ใช้เอาต์พุตจริง 2 รายการ และใช้สุ่ม m - 1 จากบล็อกเชนเพื่อผสม ให้เราแสดงกุญแจสาธารณะของผลลัพธ์ที่เราใช้
และรูปภาพสำคัญสำหรับพวกเขาตามลำดับ: ดังนั้นเราจึงได้เมทริกซ์ขนาด 2 x ม. ขั้นแรก เราต้องคำนวณความท้าทายที่เรียกว่าสำหรับเอาต์พุตแต่ละคู่:
เราเริ่มการคำนวณด้วยผลลัพธ์ซึ่งเราใช้โดยใช้กุญแจสาธารณะ:และตัวเลขสุ่มเป็นผลให้เราได้รับค่าต่อไปนี้:
ซึ่งเราใช้ในการคำนวณความท้าทาย
เอาต์พุตคู่ถัดไป (เพื่อให้ง่ายต่อการเข้าใจสิ่งที่เรากำลังทดแทนโดยที่เราได้เน้นค่าเหล่านี้ด้วยสีที่ต่างกัน) ค่าต่อไปนี้ทั้งหมดคำนวณเป็นวงกลมโดยใช้สูตรที่ให้ไว้ในภาพประกอบแรก สิ่งสุดท้ายที่ต้องคำนวณคือความท้าทายสำหรับเอาต์พุตจริงคู่หนึ่ง
ดังที่เราเห็น คอลัมน์ทั้งหมดยกเว้นคอลัมน์ที่มีเอาต์พุตจริงใช้ตัวเลขที่สร้างขึ้นแบบสุ่ม. สำหรับ π- คอลัมน์ เราก็ต้องการมันเช่นกัน มาแปลงร่างกันเถอะใน:
ลายเซ็นนั้นคือสิ่งอันดับของค่าเหล่านี้ทั้งหมด:
ข้อมูลนี้จะถูกเขียนลงในธุรกรรม
ดังที่เราเห็น MLSAG มีเพียงความท้าทายเดียวเท่านั้น c0ซึ่งช่วยให้คุณประหยัดขนาดลายเซ็น (ซึ่งต้องใช้พื้นที่มากอยู่แล้ว) นอกจากนี้ผู้ตรวจสอบใด ๆ โดยใช้ข้อมูลคืนค่าค่า c1,…, cm และตรวจสอบว่า. ดังนั้นแหวนของเราจึงถูกปิดและลายเซ็นได้รับการตรวจสอบแล้ว
สำหรับธุรกรรม RingCT แบบเต็ม จะมีการเพิ่มอีกหนึ่งบรรทัดในเมทริกซ์ที่มีเอาต์พุตแบบผสม แต่เราจะพูดถึงเรื่องนี้ด้านล่างนี้
Pedersen ความมุ่งมั่น
สัญญาผูกมัด Monero ใช้เพื่อซ่อนจำนวนเงินโอน และใช้ตัวเลือกที่พบบ่อยที่สุด - ข้อผูกมัด Pedersen อย่างไรก็ตามข้อเท็จจริงที่น่าสนใจ - ในตอนแรกนักพัฒนาเสนอให้ซ่อนจำนวนเงินโดยการผสมแบบธรรมดานั่นคือการเพิ่มผลลัพธ์สำหรับจำนวนที่กำหนดเองเพื่อทำให้เกิดความไม่แน่นอน แต่แล้วพวกเขาก็เปลี่ยนไปใช้ข้อผูกพัน (ไม่ใช่ความจริงที่ว่าพวกเขาประหยัดได้ ขนาดธุรกรรมดังที่เราจะเห็นด้านล่าง)
โดยทั่วไปความมุ่งมั่นมีลักษณะดังนี้:
ที่ไหน C — ความหมายของความมุ่งมั่นนั้นเอง a - จำนวนเงินที่ซ่อนอยู่ H เป็นจุดคงที่บนเส้นโค้งรูปไข่ (ตัวสร้างเพิ่มเติม) และ x — หน้ากากตามอำเภอใจบางชนิด ซึ่งเป็นปัจจัยการซ่อนที่สร้างขึ้นแบบสุ่ม จำเป็นต้องมีหน้ากากที่นี่เพื่อให้บุคคลที่สามไม่สามารถคาดเดาคุณค่าของความมุ่งมั่นได้
เมื่อมีการสร้างเอาต์พุตใหม่ กระเป๋าเงินจะคำนวณข้อผูกมัดสำหรับมัน และเมื่อใช้ไปแล้ว ระบบจะใช้มูลค่าที่คำนวณระหว่างการสร้างหรือคำนวณใหม่ ขึ้นอยู่กับประเภทของธุรกรรม
RingCT ง่าย
ในกรณีของธุรกรรม RingCT แบบธรรมดา เพื่อให้แน่ใจว่าธุรกรรมสร้างเอาต์พุตเท่ากับจำนวนอินพุต (ไม่ได้ผลิตเงินจากอากาศ) จำเป็นที่ผลรวมของข้อผูกพันของข้อแรกและข้อที่สองจะเป็น เหมือนกันนั่นคือ:
ค่าคอมมิชชั่นที่มีความมุ่งมั่นจะพิจารณาให้แตกต่างออกไปเล็กน้อย - โดยไม่มีหน้ากาก:
ที่ไหน a — จำนวนค่าคอมมิชชันนั้นเปิดเผยต่อสาธารณะ
วิธีการนี้ช่วยให้เราสามารถพิสูจน์ให้ฝ่ายที่เกี่ยวข้องทราบว่าเราใช้จำนวนเงินเท่ากันโดยไม่ต้องเปิดเผยข้อมูลเหล่านั้น
เพื่อให้สิ่งต่าง ๆ ชัดเจนยิ่งขึ้น ลองดูตัวอย่าง สมมติว่าธุรกรรมใช้เอาต์พุตสองรายการ (หมายความว่ากลายเป็นอินพุต) ที่ 10 และ 5 XMR และสร้างเอาต์พุตสามรายการมูลค่า 12 XMR: 3, 4 และ 5 XMR ในเวลาเดียวกัน เขาจ่ายค่าคอมมิชชั่น 3 XMR ดังนั้น จำนวนเงินที่ใช้ไปบวกจำนวนเงินที่สร้างขึ้นและค่าคอมมิชชั่นจะเท่ากับ 15 XMR ลองคำนวณข้อผูกพันและดูความแตกต่างในจำนวนเงิน (จำคณิตศาสตร์ไว้):
ต่อไปนี้เราจะเห็นว่าเพื่อให้สมการมาบรรจบกัน เราต้องการผลรวมของมาสก์อินพุตและเอาท์พุตให้เท่ากัน ในการทำเช่นนี้ กระเป๋าเงินจะสร้างแบบสุ่ม x1, y1, y2 และ y3และส่วนที่เหลือ x2 คำนวณดังนี้:
การใช้มาสก์เหล่านี้ทำให้เราสามารถพิสูจน์ให้ผู้ตรวจสอบทราบว่าเราไม่ได้สร้างรายได้มากกว่าที่เราใช้ไป โดยไม่เปิดเผยจำนวนเงิน ต้นฉบับใช่ไหม?
RingCT เต็มแล้ว
ในการทำธุรกรรม RingCT แบบเต็ม การตรวจสอบจำนวนเงินโอนจะซับซ้อนกว่าเล็กน้อย ในธุรกรรมเหล่านี้ กระเป๋าเงินจะไม่คำนวณข้อผูกพันสำหรับอินพุตใหม่ แต่ใช้สิ่งที่คำนวณเมื่อถูกสร้างขึ้น ในกรณีนี้ เราต้องถือว่าเราจะไม่ได้รับผลต่างของผลรวมเท่ากับศูนย์อีกต่อไป แต่จะได้รับผลต่างแทน:
ที่นี่ z — ความแตกต่างระหว่างมาสก์อินพุตและเอาต์พุต ถ้าเราพิจารณา zG เป็นกุญแจสาธารณะ (ซึ่งโดยพฤตินัยแล้ว) z คือคีย์ส่วนตัว ดังนั้นเราจึงรู้กุญแจสาธารณะและกุญแจส่วนตัวที่เกี่ยวข้อง ด้วยข้อมูลนี้ในมือ เราสามารถใช้มันในลายเซ็นวงแหวน MLSAG พร้อมกับคีย์สาธารณะของเอาต์พุตที่ถูกผสม:
ดังนั้น ลายเซ็นวงแหวนที่ถูกต้องจะช่วยให้มั่นใจได้ว่าเรารู้คีย์ส่วนตัวทั้งหมดของคอลัมน์ใดคอลัมน์หนึ่ง และเราจะรู้ได้เฉพาะคีย์ส่วนตัวในแถวสุดท้ายเท่านั้น หากธุรกรรมไม่ได้สร้างรายได้มากกว่าที่ใช้ไป อย่างไรก็ตาม นี่คือคำตอบสำหรับคำถามที่ว่า "เหตุใดจำนวนข้อผูกพันจึงไม่ทำให้ความแตกต่างกลายเป็นศูนย์" - ถ้า zG = 0จากนั้นเราจะขยายคอลัมน์ด้วยผลลัพธ์จริง
ผู้รับเงินจะรู้ได้อย่างไรว่าส่งเงินไปให้เขาจำนวนเท่าใด? ทุกอย่างเป็นเรื่องง่ายที่นี่ - ผู้ส่งธุรกรรมและคีย์การแลกเปลี่ยนของผู้รับโดยใช้โปรโตคอล Diffie-Hellman โดยใช้คีย์ธุรกรรมและคีย์มุมมองของผู้รับและคำนวณความลับที่แชร์ ผู้ส่งเขียนข้อมูลเกี่ยวกับจำนวนเอาต์พุตที่เข้ารหัสด้วยคีย์ที่ใช้ร่วมกันนี้ในช่องพิเศษของธุรกรรม
การพิสูจน์ช่วง
จะเกิดอะไรขึ้นหากคุณใช้จำนวนลบเป็นจำนวนเงินในข้อผูกพัน สิ่งนี้อาจนำไปสู่การสร้างเหรียญเพิ่มเติม! ผลลัพธ์นี้เป็นสิ่งที่ยอมรับไม่ได้ ดังนั้นเราจึงต้องรับประกันว่าจำนวนเงินที่เราใช้นั้นไม่เป็นลบ (แน่นอนว่าโดยไม่เปิดเผยจำนวนเงินเหล่านี้ ไม่เช่นนั้นจะมีงานมากมายและไร้ประโยชน์) กล่าวอีกนัยหนึ่ง เราต้องพิสูจน์ว่าผลรวมอยู่ในช่วง [0, 2น - 1].
เมื่อต้องการทำเช่นนี้ ผลรวมของแต่ละเอาต์พุตจะถูกแบ่งออกเป็นเลขฐานสอง และข้อผูกพันจะถูกคำนวณสำหรับแต่ละหลักแยกกัน เป็นการดีกว่าที่จะดูว่าสิ่งนี้เกิดขึ้นได้อย่างไรด้วยตัวอย่าง
สมมติว่าปริมาณของเรามีขนาดเล็กและพอดีกับ 4 บิต (ในทางปฏิบัติคือ 64 บิต) และเราสร้างเอาต์พุตมูลค่า 5 XMR เราคำนวณข้อผูกพันสำหรับแต่ละหมวดหมู่และข้อผูกพันรวมสำหรับจำนวนเงินทั้งหมด:
ต่อไป แต่ละข้อผูกพันจะผสมกับตัวแทน (ซี-2ไอเอช) และลงนามเป็นคู่กับลายเซ็นแหวน Borromeo (ลายเซ็นแหวนอื่น) เสนอโดย Greg Maxwell ในปี 2015 (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้
เมื่อนำมารวมกัน สิ่งนี้เรียกว่าการพิสูจน์ช่วง และช่วยให้คุณมั่นใจได้ว่าข้อผูกพันจะใช้จำนวนในช่วง [0, 2น - 1].
ทำอะไรต่อไป
ในการใช้งานปัจจุบัน การพิสูจน์ช่วงจะใช้พื้นที่มาก - 6176 ไบต์ต่อเอาต์พุต สิ่งนี้นำไปสู่การทำธุรกรรมที่ใหญ่กว่าและค่าธรรมเนียมที่สูงขึ้น เพื่อลดขนาดของธุรกรรม Monero นักพัฒนากำลังแนะนำระบบกันกระสุนแทนลายเซ็น Borromeo ซึ่งเป็นกลไกการพิสูจน์ช่วงโดยไม่มีข้อผูกมัดระดับบิต
ถามคำถามของคุณ แนะนำหัวข้อสำหรับบทความใหม่เกี่ยวกับเทคโนโลยีในด้านสกุลเงินดิจิทัล และสมัครสมาชิกกลุ่มของเราด้วย
ที่มา: will.com