Bulletproofs คือ range proof แบบ zero-knowledge ขนาดสั้นที่ให้คริปโตเคอร์เรนซีซ่อนจำนวนเงินทุกธุรกรรม ขณะที่แต่ละโหนดยังตรวจว่าไม่มีเหรียญถูกสร้างเพิ่ม คู่มือนี้อธิบาย Pedersen commitment เหตุผลที่จำนวนซ่อนต้องมี range proof วิธีที่ Bulletproofs ทำให้หลักฐานเล็ก และการใช้ในทุกเอาต์พุตของ Blocknet
Bulletproofs คืออะไร?
Bulletproofs คือหลักฐาน zero-knowledge ขนาดสั้นที่ Bünz, Bootle, Boneh, Poelstra, Wuille และ Maxwell เผยแพร่ในปี 2018 ในคริปโตเคอร์เรนซีใช้พิสูจน์ว่าจำนวนเงินที่ซ่อนอยู่ในช่วงถูกต้อง เช่น 0 ถึง 2^64 โดยไม่เผยค่า ไม่ต้องใช้ trusted setup และขนาดโตตามลอการิทึมของช่วงค่าเท่านั้น
งานวิจัย Bulletproofs: Short Proofs for Confidential Transactions and More เผยแพร่ใน IEEE Symposium on Security and Privacy ปี 2018 ผู้เขียนออกแบบสำหรับธุรกรรมแบบปกปิดที่แทนจำนวนเงินบนบล็อกเชนด้วย commitment หากจะเข้าใจว่าทำไมต้องมีหลักฐานนี้ ให้เริ่มที่ commitment
Pedersen commitment คืออะไร?
commitment คือซองปิดผนึกในรูปวิทยาการเข้ารหัส คุณใส่ตัวเลขไว้ข้างใน แสดงซองให้ทุกคน และพิสูจน์ภายหลังได้ว่าใส่อะไรไว้ ไม่มีใครอ่านตัวเลขจากซองได้ และคุณเปลี่ยนเป็นตัวเลขอื่นภายหลังไม่ได้
Pedersen commitment ซึ่ง Torben Pedersen อธิบายในปี 1991 ทำสิ่งนี้ด้วยจุดบนเส้นโค้งวงรี เพื่อผูกจำนวน v กระเป๋าเงินเลือกความลับสุ่ม r ที่เรียกว่า blinding factor แล้วคำนวณ:
C = v·G + r·H
G และ H เป็นจุดสาธารณะคงที่สองจุดบนเส้นโค้ง เลือกโดยไม่มีใครรู้วิธีเขียนจุดหนึ่งเป็นจำนวนเท่าของอีกจุด ผลลัพธ์ C เป็นจุดเดียวขนาด 32 bytes มีสองคุณสมบัติ:
- ปกปิด เพราะ
rสุ่มCจึงดูเป็นจุดสุ่ม จำนวนเงินเดียวกันทำ commitment สองครั้งให้สองค่าที่ไม่เกี่ยวกัน และ commitment อย่างเดียวไม่บอกผู้สังเกตอะไรเกี่ยวกับv - ผูกมัด เมื่อเผยแพร่
Cแล้ว กระเป๋าเงินเปิดเผยเป็นจำนวนอื่นไม่ได้ หากทำได้จะเท่ากับแก้ปัญหาลอการิทึมไม่ต่อเนื่องบนเส้นโค้งได้
โหนดตรวจธุรกรรมที่อ่านไม่ได้อย่างไร?
Pedersen commitment นำมาบวกกันได้ ผลรวมของสอง commitment คือ commitment ของผลรวมจำนวนเงิน โดยบวก blinding factor ด้วย โหนดรวม commitment ฝั่งอินพุตและฝั่งเอาต์พุตบวกค่าธรรมเนียม แล้วตรวจว่าผลรวมตรงกัน จึงยืนยันยอดสมดุลโดยไม่เห็นจำนวนเงิน
การบวกสอง commitment ได้ (v1 + v2)·G + (r1 + r2)·H ซึ่งเป็น commitment ของ v1 + v2 ผู้ส่งจัด blinding factor ให้ผลรวมฝั่งอินพุตเท่าฝั่งเอาต์พุต หากจำนวนเงินสมดุลด้วย ผลต่างระหว่างผลรวมอินพุตและเอาต์พุตจะเป็นศูนย์พอดี และทุกโหนดตรวจได้
ค่าธรรมเนียมเครือข่ายเป็นตัวเลขสาธารณะเพียงตัวเดียวในธุรกรรม โหนดแปลงเป็น commitment ที่มี blinding factor ศูนย์แล้วบวกในฝั่งเอาต์พุต การตรวจจึงเป็น: อินพุต = เอาต์พุต + ค่าธรรมเนียม
ทำไมจำนวนเงินที่ซ่อนต้องมี range proof?
เลขคณิต commitment ทำงานแบบโมดูโลจำนวนใหญ่มาก คืออันดับของกลุ่มเส้นโค้งซึ่งประมาณ 2^252 ในเลขคณิตนี้จำนวน “ติดลบ” เป็นเพียงจำนวนบวกมหาศาล คนอาจใช้หนึ่งอินพุตมูลค่า 10 เหรียญแล้วสร้างสองเอาต์พุต มูลค่า 11 และ “ลบ 1” commitment จะสมดุลพอดี แต่เกิด 1 เหรียญจากความว่างเปล่าโดยซ่อนจากผู้สังเกตทุกคน
range proof ปิดช่องนี้ โดยพิสูจน์ว่าจำนวนใน commitment อยู่ระหว่าง 0 กับ 2^64 โดยไม่บอกค่า เมื่อทุกเอาต์พุตมีขอบเขตเช่นนี้ เอาต์พุตไม่กี่รายการไม่มีทางรวมได้มากพอจะวนรอบอันดับกลุ่ม commitment ที่สมดุลจึงหมายถึงจำนวนเงินที่สมดุล
การออกแบบธุรกรรมปกปิดก่อนหน้านี้ใช้ range proof ที่ขนาดโตเชิงเส้นตามจำนวนบิต Bulletproofs โตตามลอการิทึมเท่านั้น ทำให้หลักฐาน 64-bit เหลือไม่กี่ร้อย bytes
Bulletproofs ทำงานอย่างไร?
Bulletproof พิสูจน์ช่วงค่าในสามขั้นตอน
- แยกจำนวนเป็นบิต จำนวน 64-bit กลายเป็นเวกเตอร์ 64 บิต ผู้พิสูจน์ทำ commitment ของเวกเตอร์และแสดงสองข้อ: แต่ละค่าคือ 0 หรือ 1 และเมื่อนำบิตคูณน้ำหนักกำลังสองมารวมกันจะได้จำนวนที่ทำ commitment ไว้
- แปลงข้อเท็จจริงเป็น inner product เดียว ผู้พิสูจน์ใช้ค่าท้าทายสุ่มรวมเงื่อนไขทั้งหมดเป็นข้ออ้างเดียวเกี่ยวกับ inner product ของสองเวกเตอร์ เพราะค่าท้าทายสุ่ม ข้ออ้างเท็จมีโอกาสผ่านเพียงน้อยจนละเลยได้
- พิสูจน์ inner product ด้วยการลดครึ่ง แต่ละรอบผู้พิสูจน์ส่งสองจุดบนเส้นโค้ง
LกับRแล้วพับเวกเตอร์ทั้งสองให้ยาวครึ่งหนึ่ง หลัง log2(64) = 6 รอบ จะเหลือตัวเลขเพียงคู่เดียว
การลดครึ่งคือที่มาของขนาด บทคัดย่อระบุว่าหลักฐานช่วง n บิตมีองค์ประกอบกลุ่มและฟิลด์ 2·log2(n) + 9 ตัว สำหรับ 64 บิตคือ 12 จุดจากหกรอบบวกอีก 9 รวม 21 องค์ประกอบ หรือ 672 bytes เมื่อแต่ละองค์ประกอบมี 32 bytes
หลักฐานไม่ต้องโต้ตอบ แทนที่จะมีผู้ตรวจส่งค่าท้าทายสด ทั้งสองฝั่งสร้างค่าจากแฮชบันทึกหลักฐานด้วยเทคนิคมาตรฐาน Fiat-Shamir heuristic และ Bulletproofs ไม่ต้องมี trusted setup: จุดกำเนิดเป็นสาธารณะและสร้างอย่างเปิดเผย ความปลอดภัยอาศัยเพียงสมมติฐานลอการิทึมไม่ต่อเนื่อง หลายหลักฐานรวมกันได้โดยเพิ่มจำนวนองค์ประกอบแบบลอการิทึม และตรวจแบบชุดได้
ใครใช้ Bulletproofs?
Monero เปิดใช้ Bulletproofs ในการอัปเกรดเครือข่าย 18 ตุลาคม 2018 (รีลีส v0.13.0) เพื่อลดขนาดธุรกรรม ไลบรารี Rust bulletproofs จากโครงการ dalek-cryptography ใช้งานบนกลุ่ม Ristretto ของ Curve25519 และไลบรารีเข้ารหัสของ Blocknet สร้างบนไลบรารีนี้
Blocknet ซ่อนทุกจำนวนเงินอย่างไร?
บน Blocknet ทุกเอาต์พุตของทุกธุรกรรมมี Pedersen commitment แทนจำนวนเงิน และแต่ละเอาต์พุตมี Bulletproof 64-bit ของตัวเอง ความเป็นส่วนตัวเป็นส่วนของรูปแบบธุรกรรมที่ไม่มีโหมดโปร่งใส จึงส่งการจ่ายที่แสดงจำนวนเงินไม่ได้
สิ่งที่โหนดตรวจก่อนรับธุรกรรม:
- range proof แต่ละรายการ Bulletproof ของทุกเอาต์พุตต้องตรวจผ่านกับ commitment เพื่อพิสูจน์ว่าจำนวนอยู่ระหว่าง 0 กับ 2^64 หลักฐานใช้ transcript ชื่อ “Blocknet Range Proof” ซึ่งผูกแต่ละหลักฐานกับ Blocknet
- ยอดสมดุล แต่ละอินพุตมี pseudo-output commitment และลายเซ็นแบบวงพิสูจน์ว่าผูกกับจำนวนเดียวกับเหรียญจริงที่ใช้ โดยไม่เผยว่าสมาชิกใดในวง โหนดตรวจว่า pseudo-output รวมเท่ากับเอาต์พุตบวกค่าธรรมเนียม
- เหรียญใหม่ รางวัลบล็อกตามตารางสาธารณะ สำหรับเอาต์พุตที่ขุด โหนดจึงสร้าง commitment ที่คาดสำหรับความสูงนั้นใหม่แล้วตรวจว่าตรงกัน
ดูได้บน Blocknet explorer หน้าธุรกรรมแสดงจำนวนเป็น “ซ่อนอยู่ · Pedersen commitments” และแต่ละเอาต์พุตแสดง commitment เมโมเข้ารหัส และ range proof “672 bytes · Bulletproof” ซึ่งตรงกับขนาดที่คำนวณไว้ข้างต้น
ผู้รับยังเห็นตัวเลขจริง ทุกเอาต์พุตมีจำนวนเงินเข้ารหัสด้วยความลับร่วมของกระเป๋าผู้ส่งและผู้รับ แล้วกระเป๋าผู้รับถอดด้วย private view key จำนวนเงินจึงเห็นได้เฉพาะสองคนในการจ่าย
จำนวนที่ซ่อนทำงานกับชั้นอื่นของ Blocknet: ลายเซ็นแบบวง 16 เอาต์พุตซ่อนผู้ส่ง stealth address แบบใช้ครั้งเดียว ซ่อนผู้รับ และ Dandelion++ ซ่อนว่าธุรกรรมเข้าสู่เครือข่ายจากที่ใด คู่มือคุณสมบัติความเป็นส่วนตัวของ Blocknet อธิบายแต่ละชั้น
รับ BNT ส่วนตัวของคุณเอง
วิธีง่ายๆ ในการได้เหรียญที่ซ่อนจำนวนคือขุด Blocknet ใช้ Proof of Work แบบ Argon2id ที่เป็น memory-hard และขุดบนคอมพิวเตอร์ทั่วไปได้ seine ใช้ CPU พร้อม GPU NVIDIA ที่มี และปรับจูนตัวเองโดยไม่ต้องตั้งค่า ทุกยอดจ่ายจาก bntpool.com มาถึงเป็นเอาต์พุตส่วนตัวพร้อม commitment และ Bulletproof คู่มือการขุด พาคุณจากดาวน์โหลดถึงแชร์ที่ได้รับการยอมรับในไม่กี่นาที
คำถามที่พบบ่อย
Bulletproofs ต้องใช้ trusted setup ไหม?
ไม่ Bulletproofs อาศัยเพียงสมมติฐานลอการิทึมไม่ต่อเนื่อง ซึ่งเป็นสมมติฐานเดียวกับลายเซ็นเส้นโค้งวงรี และใช้พารามิเตอร์สาธารณะที่ใครก็สร้างได้ ไม่มีพิธีตั้งค่าและไม่มีความลับที่ต้องให้ใครทำลายภายหลัง เหรียญเพื่อความเป็นส่วนตัวรวมถึง Monero และ Blocknet ใช้สำหรับ range proof
range proof ของ Bulletproofs ใหญ่เท่าไร?
Bulletproof ขนาด 64-bit หนึ่งชุดมี 2 × log2(64) + 9 = 21 องค์ประกอบ บนกลุ่ม Ristretto แต่ละองค์ประกอบใช้ 32 bytes ทุกหลักฐานจึงมี 672 bytes และ explorer ของ Blocknet แสดงขนาดนี้สำหรับแต่ละเอาต์พุต ขนาดโตตามลอการิทึมของช่วงค่า การเพิ่มจำนวนบิตเป็นสองเท่าจึงเพิ่มเพียงสององค์ประกอบ
ใครเห็นจำนวนเงินธุรกรรม Blocknet ได้?
เฉพาะผู้ส่งและผู้รับ เชนเก็บ Pedersen commitment และ range proof ในแต่ละเอาต์พุต พร้อมจำนวนเงินที่เข้ารหัสด้วยความลับร่วมของกระเป๋าเงินทั้งสอง กระเป๋าเงินผู้รับถอดรหัสด้วย private view key ค่าธรรมเนียมเครือข่ายเป็นตัวเลขสาธารณะเพียงตัวเดียว เพื่อให้โหนดรวมในการตรวจยอดสมดุล
โหนดรู้ได้อย่างไรว่าไม่ได้สร้างเหรียญเพิ่มเมื่อจำนวนเงินซ่อนอยู่?
ทุกโหนดตรวจสองเรื่องต่อธุรกรรม Pedersen commitment ต้องรวมกันได้สมดุล ให้อินพุตเท่ากับเอาต์พุตบวกค่าธรรมเนียม และทุกเอาต์พุตต้องมี range proof ที่ถูกต้องแสดงว่าจำนวนอยู่ระหว่าง 0 กับ 2^64 ทั้งสองร่วมกันป้องกันเงินเฟ้อที่ซ่อนอยู่โดยไม่เผยจำนวนเงินใด