คำเตือนความเสี่ยง: ระวังความเสี่ยงจากการระดมทุนที่ผิดกฎหมายในนาม 'สกุลเงินเสมือน' 'บล็อกเชน' — จากห้าหน่วยงานรวมถึงคณะกรรมการกำกับดูแลการธนาคารและการประกันภัย
ข่าวสาร
ค้นพบ
ค้นหา
เข้าสู่ระบบ
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt
BTC
ETH
HTX
SOL
BNB
ดูตลาด
พูดคุยเกี่ยวกับ Zero-Knowledge Proof II: Short No Interaction Proof (SNARK)
安比(SECBIT)实验室
特邀专栏作者
2020-01-07 00:06
บทความนี้มีประมาณ 8209 คำ การอ่านทั้งหมดใช้เวลาประมาณ 12 นาที
หลังจากบทความฉบับล่าสุดได้รับการตีพิมพ์ ฉันรู้สึกประหลาดใจมากที่เพื่อน ๆ หลายคนชอบหลัง

ผู้เขียนบทความนี้ Dongze เป็นหุ้นส่วนขนาดเล็กจาก Ambi Technology Community ปัจจุบันเขากำลังศึกษาอยู่ที่ Stanford University และทิศทางการวิจัยของเขาคือการเข้ารหัส บทความชุดนี้มาจากบันทึกการศึกษาของผู้เขียนเกี่ยวกับหลักสูตร Stanford ที่มีชื่อเสียง "CS 251: Cryptocurrencies และเทคโนโลยี blockchain" ผู้สอนหลักสูตรคือ Dan Boneh ปรมาจารย์ด้านการเข้ารหัส

หลังจากบทความฉบับล่าสุดได้รับการตีพิมพ์ ฉันรู้สึกประหลาดใจมากที่เพื่อน ๆ หลายคนชอบหลังจากอ่านบทความนั้น งั้นมาต่อกันที่ตอนนี้เลย! คราวนี้มาโฟกัสที่ SNARK กัน

เชื่อว่าเพื่อนๆที่อ่านบทความที่แล้วคงจะงงกันเล็กน้อยว่าทำไมเราถึงสร้างหลักฐานสั้นๆ แล้วพิสูจน์ข้อความยาวๆ ได้ล่ะ? ฉันเคยสงสัยเหมือนกันก่อนเรียน และเคยคิดว่านี่คือ "เทคโนโลยีสีดำ" แต่ฉันเชื่อว่าหลังจากอ่านบทความนี้ คุณจะรู้วิธีควบคุม "เทคโนโลยีสีดำ" นี้

ชื่อระดับแรก

การสร้างสี่ขั้นตอนของ SNARK

ชื่อเรื่องรอง

ขั้นตอนแรก: กำหนดเขตข้อมูลจำกัด

ก่อนสร้าง เราต้องกำหนดเขตข้อมูลจำกัด (Finite Field) เสียก่อน ซึ่งสามารถบรรจุตัวเลขทั้งหมดที่เราต้องการคำนวณได้ ในแง่ของคนธรรมดา เราจำเป็นต้องเลือกจำนวน p ที่สูงมาก ตรวจสอบให้แน่ใจว่าจำนวนนี้มากกว่าจำนวนทั้งหมดในปัญหาที่เราต้องการแก้ไข

เพื่อน ๆ ที่ได้เรียนรู้เกี่ยวกับการเข้ารหัส RSA มาก่อนอาจคุ้นเคยกับแนวคิดนี้ เขตจำกัด คือการเพิ่มเพดานให้กับตัวเลขทั้งหมดของเราและกำหนดพื้นที่การคำนวณของระบบคณิตศาสตร์ทั้งหมด คล้ายกับใน คอมพิวเตอร์ ถ้าเราต้องการสร้างตัวแปรที่เก็บตัวเลขเราต้องคิดว่าเรา ต้องการ uint32_t (32 บิต) หรือเหมือนกับ uint64_t (64 บิต) ค่าทั้งหมดที่เกินเขตข้อมูลจำกัดจะล้นโดยตรงจากนั้นย้อนกลับและเริ่มต้นจาก 0

ในโลกของคณิตศาสตร์ จริงๆ แล้วมีสเปซการคำนวณหลายประเภทที่ตรงตามลักษณะนี้ ที่พบมากคือ โมดูโลจำนวนเต็มบวกและจำนวนเฉพาะจำนวนมาก (integer mod p) ที่ใช้ในอัลกอริทึม RSA การหาจำนวน p ที่กล่าวถึงข้างต้นเป็นจำนวนเฉพาะที่มีค่ามาก และเราสามารถใช้มันเพื่อสร้างปริภูมิการคำนวณได้

ชื่อเรื่องรอง

ขั้นตอนที่ 2: สร้างวงจรเลขคณิต

เมื่อเราพบพื้นที่ดิจิทัล สิ่งต่อไปที่เราต้องทำคือแสดงปัญหาที่เราต้องการพิสูจน์เพื่อแก้ไขด้วยวงจรการดำเนินการทางคณิตศาสตร์

วงจรการดำเนินการทางคณิตศาสตร์คืออะไร? มาดูวงจรลอจิกดั้งเดิมกันก่อน

รูปด้านบนอธิบายถึงวงจรเกท NAND (NAND) สิ่งที่เราพบได้ก็คือสัญญาณอินพุตสองชุดผ่านลอจิกเกตพื้นฐานสองตัวของ AND และ OR ตามลำดับ โดยไม่ทราบมากเกินไปเกี่ยวกับประโยชน์ของวงจร ลอจิกเกตพื้นฐาน เช่น AND และ OR เป็นหน่วยการสร้างพื้นฐานของวงจรลอจิก และเราสามารถใช้ลอจิกที่ซับซ้อนใดๆ ก็ได้โดยการประกบและซ้อนกัน

เช่นเดียวกับวงจรการดำเนินการทางคณิตศาสตร์ ยกเว้นว่าโมดูลพื้นฐานได้เปลี่ยนจากลอจิกเกตเป็นการดำเนินการทางคณิตศาสตร์ เนื่องจากการบวกและการคูณเป็นการดำเนินการทางคณิตศาสตร์พื้นฐานที่สุด โดยการบวกและการคูณ เราสามารถใช้วิธีการคำนวณอื่นๆ ได้เกือบทั้งหมด เราจึงสามารถเลือก "เกทการบวก" และ "เกทการคูณ" เป็นโมดูลพื้นฐานของวงจรการดำเนินการทางคณิตศาสตร์ของเรา เราสามารถสร้าง "วงจร" ของพหุนามเชิงซ้อนได้โดยการซ้อนเกทเลขคณิต

เพื่อให้เข้าใจเกทการทำงานได้ดีขึ้น ลองแปลงเกท NAND ข้างต้นจากวงจรลอจิกเป็นวงจรการดำเนินการทางคณิตศาสตร์ (สมมติว่า Inp0 และ Inp1 เหมือนกันกับวงจรลอจิกดั้งเดิม พวกเขายังคงป้อนสัญญาณลอจิก 1/0)

มาดูเกท AND ก่อน: AND นั้นง่ายมาก เพราะผลลัพธ์ของ AND จะเป็น 1 ก็ต่อเมื่อทั้ง Inp0 และ Inp1 เป็น 1 เราค้นพบอย่างรวดเร็วว่าประตูทวีคูณจะแทนที่เกท AND ได้อย่างสมบูรณ์แบบ: ผลลัพธ์ของการคูณจะเป็น 1 ต่อเมื่ออินพุตทั้งสองเป็น 1

หลังจากแก้ AND แล้ว เรามาแปลง NOT กัน: จริงๆ แล้ว NOT นั้นง่ายมาก เนื่องจากสัญญาณอินพุตสามารถเป็น 0 หรือ 1 เท่านั้น ตราบใดที่สัญญาณอินพุตถูกลบออกจาก 1 ผลลัพธ์จะตรงกันข้าม โปรดทราบว่ามีปัญหาเนื่องจากเรามีเพียงการบวกและการคูณ ดังนั้นหากเราจำเป็นต้องใช้การลบ เราต้องคูณสัญญาณอินพุตด้วยค่าคงที่ -1 ก่อน

หลังจากการแปลงดังกล่าว เราได้แปลงวงจรลอจิกเป็นวงจรลอจิกดิจิทัลเรียบร้อยแล้ว ในเวลาเดียวกัน เนื่องจากเรารู้วิธีสร้าง AND และ NO อยู่แล้ว เราจึงสามารถทำให้สองส่วนนี้เป็นโมดูลตามทฤษฎีและเชื่อมโยงตรรกะที่ซับซ้อนใดๆ เข้าด้วยกัน

เมื่อเห็นสิ่งนี้ คุณอาจรู้สึกว่าวงจรเลขคณิตนั้นง่ายมาก และการแปลงเป็นวงจรลอจิกก็ตรงไปตรงมามากเช่นกัน แต่ความจริงแล้ว เป็นเพราะเราสันนิษฐานว่าอินพุตของวงจรเลขคณิตเหมือนกับวงจรลอจิก นั่นคือ 0 หรือ 1 ในสถานการณ์จริง ค่าอินพุตของเกทการทำงานอาจมีขนาดใหญ่มาก (ขึ้นอยู่กับขนาดของตัวเลือกฟิลด์จำกัดของเรา) เราจึงต้องหาวิธีจำกัด การป้อนข้อมูลให้กับวงจรการทำงานของเราเพื่อให้ไม่เพียงทำหน้าที่เหมือนกับวงจรลอจิกเท่านั้น แต่ยังรับค่าอินพุตได้เฉพาะตัวเลขสองตัว [0,1] เท่านั้น

แต่จะใช้ประตูเลขคณิตเพื่อแสดงความสัมพันธ์ดังกล่าวได้อย่างไร? เนื่องจากวงจรการดำเนินการทางคณิตศาสตร์เป็นพหุนามเชิงซ้อน (เช่น วงจร NAND ในรูปด้านบนจะกลายเป็น Out = 1 - Inp0 * Inp1) เราจึงสามารถแปลงคำถามนี้: เราสามารถสร้างพหุนามได้หรือไม่เฉพาะเมื่ออินพุตตรงกับช่วงค่าของ [0,1] เท่านั้น เอาต์พุตจะออกมาเป็น 0 หรือไม่ในที่สุด เราพบว่ามีพหุนามที่สามารถตอบสนองความต้องการนี้:

สตริงนิพจน์ด้านบนหมายความว่าเฉพาะเมื่อจำนวน n อยู่ในช่วงนี้ พหุนามต่อไปนี้จะแสดงผลเป็น 0 กล่าวอีกนัยหนึ่ง เราสามารถเชื่อมต่อ Inp0 และ Inp1 ที่กล่าวถึงข้างต้นเข้ากับวงจรการทำงานที่แปลงจากพหุนามนี้ตราบใดที่ผลลัพธ์เอาต์พุตของวงจรการทำงานนี้เป็น 0 เราก็มั่นใจได้ว่าเอาต์พุตของวงจรการทำงาน NAND ข้างต้นนั้นถูกต้องเช่นกัน

บางคนอาจถามว่าพหุนามที่จำกัดค่าด้านบนจำกัดได้เพียงหนึ่งอินพุต แต่เรามีสองอินพุต จะจำกัดช่วงค่าพร้อมกันได้อย่างไร อันที่จริง คำตอบนั้นง่ายมาก แค่คัดลอกพหุนามที่เหมือนกันแล้วบวกทั้งสองเข้าด้วยกัน

ด้วยสองวงจรนี้ เราเพียงต้องแน่ใจว่าเอาต์พุตของวงจรจำกัดเป็น 0 จากนั้นวงจรเกท NAND จะทำงานตามปกติ

สิ่งหนึ่งที่ควรทราบก็คือ เนื่องจากลอจิกเกตของเราสร้างขึ้นจากเกตทางเลขคณิต เราจะพบว่าลอจิกการทำงานช้ามากชื่อเรื่องรอง

ขั้นตอนที่ 3: แปลงเป็นวงจรการดำเนินการทางคณิตศาสตร์ที่พิสูจน์ได้

เมื่อเรามีแนวคิดเกี่ยวกับวงจรคอมพิวเตอร์ดิจิทัล เราสามารถต่อโมดูลวงจรต่างๆ เข้าด้วยกันเพื่อสร้างวงจรคอมพิวเตอร์ที่สามารถใช้เป็นเครื่องพิสูจน์ได้

ขั้นแรกให้กำหนดวงจรการทำงานแบบดิจิตอล C(x,w) ที่สามารถใช้เป็นหลักฐานได้โครงสร้างเฉพาะมีดังนี้:

พูดง่ายๆ วงจร C นี้มีอินพุตสองชุด

เราเรียกอินพุตชุดแรกที่มีป้ายกำกับว่า xการป้อนข้อมูลสาธารณะซึ่งหมายความว่าทุกคนจะรู้ค่าของ x โดยทั่วไป x นี้จะแสดงลักษณะของปัญหาที่คุณต้องการพิสูจน์และตัวแปรสภาพแวดล้อมคงที่บางตัว

อินพุตชุดที่สองมีชื่อว่า w ซึ่งเราเรียกว่าข้อมูลลับหรือเรียกอีกอย่างว่าพยาน ข้อมูลชุดนี้เป็นคำตอบของฝ่ายที่ส่งหลักฐานจริง และมีเพียงฝ่ายที่ส่งหลักฐานเท่านั้นที่จะรู้ และไม่มีใครสามารถรับได้

เมื่อเรามีวงจร C เป้าหมายของเราคือพิสูจน์ว่า C(x, w) = 0. กล่าวอีกนัยหนึ่ง เนื่องจาก A และ B รู้ว่าเอาต์พุตของวงจรการดำเนินการทางคณิตศาสตร์ C เป็น 0 และอินพุตสาธารณะคือ x ดังนั้น A จำเป็นต้องพิสูจน์ว่าเธอรู้ค่าอินพุตส่วนตัว w ที่ประกอบเป็นเอาต์พุตนี้

หากเราแทนแนวคิดของ C(x, w) ลงในตัวอย่างเกท NAND ที่กล่าวถึงข้างต้น เราจะพบว่าเกท NAND เพียงอย่างเดียวไม่เพียงพอที่จะเป็นวงจรสำหรับการพิสูจน์ เราสามารถกำหนดปัญหาที่เราต้องการพิสูจน์ใหม่ได้:ถ้าเรารู้ว่าเอาต์พุตของเกท NAND เป็น 0 และหนึ่งในอินพุต Inp0 คือ 1A ต้องการพิสูจน์ว่าเธอรู้ค่าของอินพุตอื่น Inp1 ในกระบวนการพิสูจน์นี้ ไม่เพียงแต่ต้องแน่ใจว่าเอาต์พุตของเกท NAND นั้นถูกต้อง แต่ยังต้องแน่ใจว่าค่าอินพุตทั้งหมดอยู่ในช่วงที่เราตกลงกันไว้ล่วงหน้า

เรารวมโครงร่างที่กล่าวถึงข้างต้น เชื่อมต่อเอาต์พุตวงจร NAND และวงจรจำกัดค่าของเราเข้าด้วยกันเพื่อสร้างวงจรการทำงาน C, x คือ Inp0, w คือ Inp1 และเราจำกัดเอาต์พุตเป็น 0 จึงสร้างความเป็นส่วนตัวของเกท NAND อย่างสมบูรณ์ เข้าสู่ ระบบการรับรอง

เมื่อเราได้วงจรพิสูจน์ขั้นสุดท้าย C เราสามารถคำนวณความซับซ้อนของวงจรการทำงานนี้ได้

หากเราต้องการทราบว่าวงจรการทำงานแบบดิจิตอล C นั้นยากเพียงใด เราสามารถอธิบายความซับซ้อนของมันได้ด้วยจำนวนประตูการทำงานที่อยู่ในนั้น โดยทั่วไปเราจะใช้เพื่อแสดง เช่นเดียวกับวงจรพิสูจน์ NAND ที่กล่าวถึงข้างต้น ก็น่าจะประมาณ 10

ชื่อเรื่องรอง

ขั้นตอนที่ 4: ระบบพิสูจน์อักษรสั้นแบบไม่โต้ตอบ (SNARK)

เมื่อเราได้รับวงจรพิสูจน์ขั้นสุดท้าย C และ x และ w ที่สอดคล้องกันจนถึงขั้นตอนที่สาม การเตรียมการของเราก็ใกล้จะเสร็จแล้ว ส่วนที่เหลือ เราสามารถส่งมอบให้กับอัลกอริธึม SNARK เพื่อสร้างและตรวจสอบหลักฐานของเรา

อันดับแรก มาดูคำจำกัดความอย่างเป็นทางการของระบบการพิสูจน์แบบไม่โต้ตอบทั้งหมด

ระบบ SNARK มักจะประกอบด้วยอัลกอริธึมหลักสามอย่าง: ตั้งค่า พิสูจน์ และยืนยัน

  • สร้างการตั้งค่าอัลกอริทึม:

    อัลกอริทึมการตั้งค่าจะนำวงจร C ที่เรากำหนดไว้เข้าสู่ชุดของการประมวลผลล่วงหน้า (การประมวลผลล่วงหน้า) และสร้างพารามิเตอร์สองชุด Sp เป็นพารามิเตอร์สำหรับผู้พิสูจน์ และ Sv สำหรับผู้ตรวจสอบ จุดประสงค์ของพารามิเตอร์เหล่านี้คือเพื่ออำนวยความสะดวกทั้งสองฝ่ายในการสร้างและตรวจสอบการพิสูจน์แบบสั้น โดยทั่วไป ความซับซ้อนของอัลกอริธึมการสร้างจะแปรผันตามความซับซ้อนของวงจร C, O(|C|)

  • อัลกอริทึมการพิสูจน์พิสูจน์:

    ไม่จำเป็นต้องพูดถึงขั้นตอนวิธีการพิสูจน์ ผู้พิสูจน์ จะใช้อัลกอริทึมการพิสูจน์เพื่อสร้างหลักฐานแล้วส่งหลักฐานไปยังผู้ตรวจสอบ อัลกอริทึมการพิสูจน์จะใช้ข้อมูลเกือบทั้งหมดในการสร้างการพิสูจน์ใหม่: ข้อมูลที่ประมวลผลล่วงหน้า Sp, อินพุตสาธารณะ x และอินพุตส่วนตัว w การพิสูจน์ที่ได้นั้นมีความซับซ้อนของพื้นที่สั้นมาก: |Π| = O(log|C|)

  • อัลกอริทึมการยืนยัน ตรวจสอบ:

    อัลกอริทึมการยืนยันยังตรงไปตรงมามาก ผู้ตรวจสอบ จะใช้อัลกอริทึมการยืนยันเพื่อตรวจสอบหลักฐานที่เราได้รับ อัลกอริทึมนี้จะส่งคืนค่า 1/0 ซึ่งแสดงว่าการตรวจสอบผ่านหรือไม่ ในกระบวนการตรวจสอบ นอกจากหลักฐานที่ได้รับจากอีกฝ่ายแล้ว เรายังจำเป็นต้องประมวลผลข้อมูลล่วงหน้าและอินพุตสาธารณะ x ความซับซ้อนในการตรวจสอบยังน้อยมาก โดยทั่วไปคือ O(|x| + log|C|)

ด้วยอัลกอริธึมทั้งสามนี้ เราสามารถใช้ไดอะแกรมง่ายๆ เพื่ออธิบายระบบการพิสูจน์ทั้งหมด

ชื่อระดับแรก

ตัวอย่าง: ช่วงอินพุตและเอาต์พุตของธุรกรรมส่วนตัว (Range Proof)

เพื่อนๆ ที่อ่านบทความที่แล้วคงจำได้ว่าหากเราต้องการทำธุรกรรมส่วนตัว (Confidential Transaction) เราต้องแนบหลักฐาน 3 ชุดท้ายการทำธุรกรรมดังนี้

  • กลุ่มแรกคือคำสัญญาของพีเดอร์สันพิสูจน์ความสัมพันธ์ทางคณิตศาสตร์ระหว่างอินพุตและเอาต์พุต

  • กลุ่มที่สองคือพิสูจน์ช่วงเวลาจำเป็นต้องพิสูจน์ว่าค่าของอินพุตและเอาต์พุตทั้งหมดอยู่ในช่วงของจำนวนเต็มบวก

  • กลุ่มที่สามคือหลักฐานการเป็นเจ้าของเพื่อพิสูจน์ว่าผู้ริเริ่มธุรกรรมมีโทเค็นจำนวนมากเป็นอินพุตจริงๆ

การปฏิบัติตามคำสัญญาของ Pederson ได้ถูกกล่าวถึงแล้วในบทความก่อนหน้านี้ ตอนนี้เราเข้าใจโครงสร้างสี่ขั้นตอนของการพิสูจน์แบบสั้นแล้ว เราสามารถดูรายละเอียดวิธีการนำไปใช้ได้พิสูจน์ช่วงเวลา

ก่อนอื่นเราต้องหาวงจรคณิตศาสตร์ที่เหมาะสมเพื่ออธิบายสิ่งที่เราต้องการพิสูจน์ (เราใช้ฟิลด์จำกัดของจำนวนเต็มบวกโดยค่าเริ่มต้น และเลือกจำนวนเฉพาะ p ที่มากสำหรับโมดูโล)

ถ้าเรามีตัวเลข w และเราต้องการพิสูจน์ว่าตัวเลขนี้ไม่ใช่จำนวนลบ ก่อนอื่นเราสามารถพิสูจน์ได้ว่าตัวเลขนั้นต้องอยู่ในช่วงของจำนวนเต็มบวก เนื่องจากการพิจารณาว่าจำนวนเต็มบวกในระบบคอมพิวเตอร์โดยทั่วไปไม่เกิน 256 บิต เราสามารถลดปัญหาได้:พิสูจน์ว่าจำนวน w มีค่าระหว่าง 0-2^256(ตามเงื่อนไขนี้ จำนวนเฉพาะ p ที่เลือกโดยฟิลด์จำกัดต้องมากกว่า 2^256)


ตอนนี้เราได้กำหนดปัญหาที่จะแก้ไขแล้ว เราสามารถเริ่มคิดถึงวิธีแสดงความสัมพันธ์ของค่านี้ด้วยการบวกและการคูณ โปรดจำไว้ว่าในบทที่แล้ว เมื่อเราพูดถึงค่า n ระหว่าง 0 ถึง 1 เราใช้ n * (n - 1) = 0 เพื่อจำกัดช่วงค่านี้ในทำนองเดียวกัน หากเราต้องการให้ข้อจำกัดมีค่าระหว่าง 0 ถึง 5 เราสามารถจำกัดด้วยการคูณที่ยาวขึ้น:

เห็นแบบนี้แล้ว คุณอาจรู้วิธีจำกัดค่าของ w แล้ว: เราแค่ต้องใช้วิธีเดียวกันเพื่อขยายสมการนี้ และคูณไปเรื่อยๆ จาก (w - 1) ถึง (w - 2^{256}) ไม่ใช่แค่ ตกลง?

ฟังดูเหมือนง่าย แต่เพื่อนๆ ระวังจะพบว่าในวงจรสุดท้ายจะมีมี 2^256ประตูคูณ ด้วยการคูณจำนวนมากและไม่มีการเพิ่มเติม ความซับซ้อนของวงจรนี้จึงเป็นเรื่องทางดาราศาสตร์อยู่แล้ว แม้ว่าคุณจะเรียกใช้โปรแกรมติดตั้ง คุณอาจไม่รู้ว่าคุณกำลังจะเข้าสู่ปีวอก เราจึงบอกว่าวิธีการของข้อจำกัดนี้คือไม่สมจริง

มีวิธีใดที่จะจำกัดพื้นที่ของตัวเลขนี้ w? เราสามารถใช้โครงสร้างของเลขฐานสองอย่างชาญฉลาดเนื่องจากเราต้องการกำหนดว่า w เป็นจำนวนเต็มและมากกว่า 0 แต่น้อยกว่า 2^256 เราจึงทำได้ในรูปแบบเลขฐานสองแยก w ออกเป็น 256 บิต แล้วจำกัดแต่ละบิตแยกกันในกรณีนี้ ขนาดของวงจรที่เราได้รับสุดท้ายจะเป็นสัดส่วนกับจำนวนหลักเท่านั้น และจะไม่เกี่ยวข้องกับขีดจำกัดบนสูงสุดของตัวเลขนี้ ความซับซ้อนลดลงอย่างมากในทันที

มันประสบความสำเร็จได้อย่างไร? ก่อนอื่นเราแยก w ออกเป็น 256 บิต:


เนื่องจากแต่ละบิตเป็นเลขฐานสอง เราจำเป็นต้องจำกัดพื้นที่ค่าของแต่ละบิตเป็น 0 และ 1:

ข้อจำกัดนี้ต้องการ 256 สำเนา หนึ่งชุดสำหรับแต่ละบิต เมื่อเราเตรียมข้อจำกัดเหล่านี้แล้ว ในที่สุดเราก็ตรวจสอบให้แน่ใจว่าบิตทั้งหมดรวมกันสามารถกู้คืนเป็น w ดั้งเดิมได้:

เราต่อวงจรข้อจำกัด 256+1=257 ทั้งหมดที่กล่าวมาข้างต้นเข้าด้วยกันและรวมเข้าด้วยกันเป็นเอาต์พุตเดียว วงจรสุดท้ายที่สร้างขึ้นคือวงจร C ที่เราสามารถใช้เพื่อสร้างระบบพิสูจน์ หากเอาต์พุตของ C เป็น 0 ตัวเลขที่เป็นตัวแทนของอินพุตจะต้องเป็นไปตาม:

  • จำนวนนี้เป็นจำนวนเต็มบวกที่สามารถแสดงด้วยเลขฐานสอง 256 บิต

  • เลขฐานสอง 256 บิตนี้เป็นเลขฐานสองจริงๆ (รับได้เฉพาะค่า 0 หรือ 1 เท่านั้น)

  • ตัวเลขไบนารี 256 บิตทั้งหมดเหล่านี้สามารถนำมารวมกันเพื่อกู้คืนหมายเลขที่ป้อน

โดยใช้คุณลักษณะของเลขฐานสองอย่างชาญฉลาดชื่อระดับแรก

ตัวอย่าง: ความเป็นเจ้าของอินพุตธุรกรรมส่วนตัว

หลังจากแก้ไขการพิสูจน์ช่วงเวลาแล้ว เรามาดำเนินการพิสูจน์ชุดสุดท้ายของการทำธุรกรรมส่วนตัว: หลักฐานการเป็นเจ้าของ ซึ่งพิสูจน์ว่ามูลค่าอินพุตของธุรกรรมส่วนตัวนั้นสมเหตุสมผล

เพื่อนๆ ที่อ่านบทความที่แล้วน่าจะทราบกันดีว่าเราได้พูดถึงระบบการพิสูจน์ความเป็นเจ้าของธุรกรรมส่วนตัวไปแล้ว 2 ระบบ คือ

ทางออกแรกคือธุรกรรมสามารถอ้างอิงถึงผลลัพธ์ของธุรกรรมก่อนหน้าได้โดยตรง แต่สิ่งนี้จะนำมาซึ่งปัญหาไก่กับไข่: ความยากอยู่ที่วิธีสร้างธุรกรรมส่วนตัวรายการแรก วิธีที่สองคือการแนบหลักฐานใหม่เพิ่มเติมในแต่ละธุรกรรม เพื่อพิสูจน์ว่ายอดเงินในบัญชีของผู้ใช้ที่เริ่มต้นธุรกรรมมีเงินมากขนาดนั้นจริงๆ

ฉันต้องการเน้นแผนการพิสูจน์ที่สองคือการพิสูจน์ยอดเงินในบัญชีของผู้ริเริ่มธุรกรรมในสถานะโลก

ในหลาย ๆ สถานการณ์ของบล็อกเชน สถานะของทั้งโลกเป็นบัญชีแยกประเภทขนาดใหญ่ แต่ละบรรทัดของบัญชีแยกประเภทจะบันทึกยอดคงเหลือในบัญชีของผู้ใช้บางราย

เพื่อให้แสดงสถานะของโลกทั้งใบได้สะดวกยิ่งขึ้น เรามักจะใช้ Merkle tree เพื่อเปลี่ยนบัญชีแยกประเภทโลกขนาดใหญ่ให้เป็นชุดค่าแฮชของ Merkle ที่สั้นและเรียบร้อย เมื่อใดก็ตามที่ยอดเงินในบัญชีมีการเปลี่ยนแปลง แฮช Merkle นี้จะเปลี่ยนไป

ต้นไม้ Merkle เป็นต้นไม้ไบนารีจริง ๆ แต่ละโหนดจะต่อค่าของโหนดย่อยสองโหนดด้านล่างเข้าด้วยกันและคำนวณค่าแฮชที่สอดคล้องกันเป็นค่าของตัวเอง เพื่ออำนวยความสะดวกในการสร้าง Merkle tree ก่อนอื่นเราจะทำการคำนวณแฮชตามค่าสมดุลดั้งเดิมที่สุด แล้วจึงเก็บค่าแฮชไว้ที่ด้านล่างของ Merkle tree

เมื่อเราสร้าง Merkle tree ด้วยวิธีนี้ เราสามารถปฏิบัติต่อค่าแฮชของ Merkle เอาต์พุตเป็น aคำมั่นสัญญา: ตราบใดที่คำมั่นสัญญาไม่เปลี่ยนแปลง สถานะปัจจุบันของโลกจะต้องไม่เปลี่ยนแปลงในบล็อกเชน หากเราต้องการบันทึกสถานะของรายการข้อมูลขนาดยาว โดยทั่วไปเพื่อประหยัดพื้นที่ เราจะบันทึกข้อผูกมัดของ Merkle ของข้อมูลทั้งหมดบนเชน แทนที่จะเก็บข้อมูลเองในเชน

หลังจากที่เราตั้งปณิธานต่อสภาวะของโลกแล้ว คำถามตามมาก็คือถ้า A เป็นบัญชี 1 ในภาพด้านบน ตอนนี้มี 5 หยวน A พิสูจน์ให้ B เห็นได้อย่างไรว่าในสถานะทั้งโลก ยอดคงเหลือของเธอคือ 5 หยวนจริงๆ

วิธีการง่ายๆ คือ A สามารถส่งยอดคงเหลือของบัญชีทั้งหมดไปยัง B จากนั้น B จะทำการคำนวณภาระผูกพันของ Merkle ด้วยตัวเอง ตราบใดที่ภาระผูกพันที่คำนวณได้ของ B เท่ากับภาระผูกพันของรัฐโลกในปัจจุบัน และ A ยืนยันว่ายอดคงเหลือในบัญชีของเธอคือ 5 หยวนจริงๆ B ก็เชื่อได้ว่า A มีเงิน 5 หยวนจริงๆ

ดูเหมือนจะเป็นวิธีที่ดีมาก แต่ปัญหาของวิธีนี้จะเห็นได้ชัดในทันที มีผู้ใช้หลายร้อยล้านคนในโลกนี้ หาก A ต้องส่งยอดเงินฝากหลายร้อยล้านบรรทัดให้ B นับประสาอะไรกับ B ที่สามารถคำนวณข้อผูกมัดนี้ได้อย่างมีประสิทธิภาพ และวิธีการพิสูจน์ดังกล่าวจะเปิดเผยข้อมูลยอดคงเหลือของผู้ใช้ทุกคน และทุกคนไม่เต็มใจอย่างแน่นอน

แล้วจะพิสูจน์ได้อย่างไรว่ายอดเงินในบัญชี 1 เป็นของสถานะโลกปัจจุบัน? ในตอนนี้เราสามารถใช้ลักษณะของต้นเมิร์กเคิลเพื่อสร้างหลักฐานเมิร์กเคิลได้

หากเราสังเกตต้น Merkle ที่ถูกตัดอย่างละเอียดในรูปด้านบน เราจะพบว่าตราบเท่าที่เราพิสูจน์ได้ว่ายอดคงเหลือของบัญชี 1 สามารถสร้างข้อผูกพันของรัฐโลกสุดท้ายกับโหนดที่อยู่ติดกันในต้นไม้ Merkle เรายังสามารถพิสูจน์ความสมดุลของ บัญชี 1 เป็นของสถานะปัจจุบันของโลก

ทำอย่างไร? เริ่มจากยอดเงินในบัญชี 1ไปจนสุดทางขึ้นต้น Merkle

ด้วยยอดเงินในบัญชี 1 เราสามารถคำนวณ H1 ได้ หลังจากมี H1 เราพบว่าเราไม่จำเป็นต้องรู้ยอดคงเหลือในบัญชี 0 ตราบใดที่สามารถรวมค่าของ H0 เพื่อสร้าง H4 ในทำนองเดียวกัน ในที่สุดเราก็สามารถสร้างความมุ่งมั่นของ Merkle ของจุดยอด —— H6 โดยการรวมกับค่าของ H5 ในท้ายที่สุด เราจำเป็นต้องส่งเพียงสามสิ่งเพื่อดำเนินการพิสูจน์ Merkle นี้: ยอดเงินในบัญชี 1, H0 และ H5 ค่าแฮชที่เหลือทั้งหมดสามารถคำนวณได้ในระหว่างกระบวนการตรวจสอบ นี่คือข้อพิสูจน์ของ Merkle

เราสามารถลดปริมาณการพิสูจน์ได้อย่างมากผ่านการพิสูจน์ของ Merkle และเรายังสามารถรับประกันได้ว่ายอดคงเหลือของผู้ใช้รายอื่นในโลกจะไม่ถูกเปิดเผยในระหว่างกระบวนการพิสูจน์ การพิสูจน์ Merkle มีประโยชน์มากในการเข้ารหัส โดยต้องใช้ขนาด n เท่านั้นเพื่อพิสูจน์ว่ามีบางอย่างอยู่ในรายการความยาว N เรามักใช้การพิสูจน์ของ Merkle เพื่อพิสูจน์ว่าชุดข้อมูลเป็นของไฟล์ขนาดใหญ่ ผู้ใช้เป็นขององค์กรขนาดใหญ่ และอื่นๆ

หลังจากเข้าใจหลักการพิสูจน์ของ Merkle แล้ว เรามาดูวิธีพิสูจน์ว่า A สามารถพิสูจน์ยอดคงเหลือของเธอในธุรกรรมส่วนตัวได้อย่างไร

สาระสำคัญของการพิสูจน์ Merkle คือเราทำได้เริ่มจากค่าที่จะพิสูจน์ ค่าแฮชจะถูกคำนวณไปจนสุด และจะถูกรวมเข้ากับค่าแฮชของโหนดที่อยู่ติดกันอย่างต่อเนื่องแต่เราพบปัญหาที่ร้ายแรงมาก: แม้ว่าเราจะสามารถซ่อนความสมดุลของผู้อื่นในสถานะโลกได้ แต่เรายังคงคุณต้องเปิดเผยยอดเงินของคุณ(มิฉะนั้นจะไม่มีทางคำนวณค่าแฮชแรก H1 ได้) สิ่งนี้ตรงกันข้ามกับสาระสำคัญของธุรกรรมส่วนตัวของเรา!

ในเวลานี้คุณต้องใช้พลังของ SNARKชื่อเรื่องรอง

ขั้นตอนที่ 1: พิสูจน์แฮชยอดคงเหลือ

ในขั้นตอนแรก เราใช้ SNARK เพื่อพิสูจน์ว่ายอดคงเหลือของบัญชี 1 สามารถรับค่าแฮช H1 ได้หลังจากผ่านฟังก์ชันแฮช

เนื่องจากเราต้องการซ่อนยอดเงินในบัญชี 1 เราจึงแสดงตัวเลขนี้ด้วย w ก่อนที่จะใช้ SNARK เราจำเป็นต้องเปลี่ยนวิธีการอธิบายของปัญหาเพื่อให้สะดวกยิ่งขึ้นในการแสดงด้วยวงจรการดำเนินการทางคณิตศาสตร์:

สมมุติว่า A เองมีความลับ w = ยอดเงินในบัญชี 1. ทั้ง A และ B รู้ล่วงหน้าถึงค่าแฮช H1 ของยอดเงินในบัญชี 1 (เราสามารถแทนค่าด้วย x) เราสามารถสร้างวงจรการดำเนินการทางคณิตศาสตร์ C: Hash(w) - x = 0 ถ้า C(x, w) = 0 แล้ว Hash(w) = x

เพื่อให้การแสดงง่ายขึ้น เราใช้โมดูลนามธรรมเพื่อแสดงฟังก์ชันแฮชบนกราฟ ในทางปฏิบัติ โดยทั่วไปเราใช้ฟังก์ชันแฮช SHA256 หลังจากที่เราได้วงจรสุดท้าย C แล้ว เราจะใช้อัลกอริทึมการตั้งค่าเพื่อสร้างพารามิเตอร์ จากนั้นใช้อัลกอริทึมการพิสูจน์เพื่อสร้างการพิสูจน์แบบสั้น

ผ่านขั้นตอนนี้เราจะได้ x สาธารณะและหลักฐาน และค่าของ x นี้คือค่าแฮชของยอดเงินในบัญชี 1ชื่อเรื่องรอง

ขั้นตอนที่ 2: กรอกหลักฐาน Merkle จาก H1

ขั้นตอนก่อนหน้านี้ทำให้เราได้รับ H1 และยังเป็นการพิสูจน์ว่า H1 นั้นถูกสร้างขึ้นจากสถานะดั้งเดิมของโลกจริงๆ สิ่งที่เราต้องทำตอนนี้คือเริ่มจาก H1 และรวมกับ H0 และ H5 ที่อยู่ติดกันตามลำดับเพื่อสร้างความมุ่งมั่นของรัฐโลกใหม่ หากเราเปรียบเทียบข้อผูกมัดที่สร้างขึ้นกับข้อผูกมัดเก่าที่บันทึกไว้ในบล็อกเชน เราสามารถเชื่อได้ว่ายอดคงเหลือของบัญชี 1 นั้นอยู่ในสถานะโลกจริงๆ

โดยสรุป เราได้แบ่งหลักฐานการเป็นเจ้าของออกเป็นสองขั้นตอนขั้นตอนแรกคือการพิสูจน์ว่าความลับ w สามารถแปลงเป็น x ได้ด้วยฟังก์ชันแฮช จากนั้นพิสูจน์ว่า x สาธารณะเป็นของ Merkle tree ของรัฐทั้งโลกชื่อระดับแรก

สรุปธุรกรรมส่วนตัว

เมื่อเห็นสิ่งนี้ ทุกคนต้องมีความเข้าใจโดยทั่วไปว่าการทำธุรกรรมส่วนตัวเป็นอย่างไร ตอนนี้ให้ฉันสรุปสิ่งที่ A ต้องทำหากต้องการจ่ายเงินให้กับ B ในการทำธุรกรรมส่วนตัว

  • ก่อนอื่น A ต้องส่งไปยังเครือข่ายทั้งหมดส่งธุรกรรมส่วนตัวธุรกรรมนี้ประกอบด้วยผู้ริเริ่มและผู้รับเงินของธุรกรรม แต่ไม่มีปริมาณ จำนวนอินพุตและเอาต์พุตดั้งเดิมถูกแทนที่ด้วยอักขระที่อ่านไม่ออกไม่กี่สตริง

  • ภายใต้การทำธุรกรรมนี้ A จำเป็นต้องแนบข้อผูกมัดของ Pederson เพื่อพิสูจน์ว่าจำนวนอินพุตและเอาต์พุตรวมกันแล้วเท่ากัน

  • จากนั้น A ต้องต่อท้ายอีกหนึ่งรอบการพิสูจน์ช่วงเวลาสร้างโดย SNARK(Range Proof) ซึ่งพิสูจน์ว่าตัวเลขอินพุตและเอาต์พุตเป็นจำนวนเต็มบวกที่มากกว่า 0 ทั้งหมด

  • สุดท้าย A ต้องต่อท้าย Aหลักฐานการเป็นเจ้าของซึ่งพิสูจน์ได้ว่าเธอเป็นเจ้าของบัญชีที่มีเงินฝากอยู่จริงๆ หลักฐานการเป็นเจ้าของนี้แบ่งออกเป็นสองส่วน ส่วนแรกคือหลักฐานค่าแฮชที่สร้างโดย SNARK และอีกส่วนคือหลักฐานของ Merkle ซึ่งพิสูจน์ว่าค่าแฮชก่อนหน้านี้เป็นของสถานะของโลกจริงๆ

ชื่อระดับแรก

ยังมีต่อ

ด้วยเหตุผลเรื่องพื้นที่ ครั้งนี้ฉันจะหยุดที่นี่ ทุกคนน่าจะเคยเห็นสิ่งนี้และเข้าใจส่วน "การพิสูจน์" ของการพิสูจน์ความรู้เป็นศูนย์แล้ว คุณคงรู้ว่าวงจรการดำเนินการทางคณิตศาสตร์คืออะไร แล้วเราจะแปลงปัญหาในชีวิตจริงเป็นวงจรได้อย่างไร

เชื่อว่าหลายคนคงสงสัย แล้วอัลกอริทึมทั้ง 3 อย่าง Setup, Prove และ Verify ทำงานอย่างไร? ในฉบับหน้า เราจะมาเจาะลึกกันต่อเพื่อทำความเข้าใจเชิงลึกเกี่ยวกับหลักการเบื้องหลังระบบพิสูจน์ SNARK

อ่านเพิ่มเติม

ตามปกติ ส่วนหนึ่งของรายการเรื่องรออ่านจะระบุไว้ที่ส่วนท้ายของบทความ และเพื่อนๆ ที่สนใจสามารถเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ได้:

安全
ยินดีต้อนรับเข้าร่วมชุมชนทางการของ Odaily
กลุ่มสมาชิก
https://t.me/Odaily_News
กลุ่มสนทนา
https://t.me/Odaily_CryptoPunk
บัญชีทางการ
https://twitter.com/OdailyChina
กลุ่มสนทนา
https://t.me/Odaily_CryptoPunk
สรุปโดย AI
กลับไปด้านบน
หลังจากบทความฉบับล่าสุดได้รับการตีพิมพ์ ฉันรู้สึกประหลาดใจมากที่เพื่อน ๆ หลายคนชอบหลัง
ดาวน์โหลดแอพ Odaily พลาเน็ตเดลี่
ให้คนบางกลุ่มเข้าใจ Web3.0 ก่อน
IOS
Android