Bulletproofs ตรวจจำนวนเงินที่ซ่อนอย่างไร

· อ่าน 6 นาที

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 มีสองคุณสมบัติ:

โหนดตรวจธุรกรรมที่อ่านไม่ได้อย่างไร?

คำตอบสั้นๆ

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 พิสูจน์ช่วงค่าในสามขั้นตอน

  1. แยกจำนวนเป็นบิต จำนวน 64-bit กลายเป็นเวกเตอร์ 64 บิต ผู้พิสูจน์ทำ commitment ของเวกเตอร์และแสดงสองข้อ: แต่ละค่าคือ 0 หรือ 1 และเมื่อนำบิตคูณน้ำหนักกำลังสองมารวมกันจะได้จำนวนที่ทำ commitment ไว้
  2. แปลงข้อเท็จจริงเป็น inner product เดียว ผู้พิสูจน์ใช้ค่าท้าทายสุ่มรวมเงื่อนไขทั้งหมดเป็นข้ออ้างเดียวเกี่ยวกับ inner product ของสองเวกเตอร์ เพราะค่าท้าทายสุ่ม ข้ออ้างเท็จมีโอกาสผ่านเพียงน้อยจนละเลยได้
  3. พิสูจน์ 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 ของตัวเอง ความเป็นส่วนตัวเป็นส่วนของรูปแบบธุรกรรมที่ไม่มีโหมดโปร่งใส จึงส่งการจ่ายที่แสดงจำนวนเงินไม่ได้

สิ่งที่โหนดตรวจก่อนรับธุรกรรม:

ดูได้บน 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 ทั้งสองร่วมกันป้องกันเงินเฟ้อที่ซ่อนอยู่โดยไม่เผยจำนวนเงินใด