รู้เบื้องต้นเกี่ยวกับ zk-SNARKs

บล็อก 1NewsDevelopersEnterpriseBlockchain ExplainedEvents and ConferencesPressจดหมายข่าว

สมัครรับจดหมายข่าวของเรา.

ที่อยู่อีเมล

เราเคารพความเป็นส่วนตัวของคุณ

หน้าแรกบล็อกการพัฒนา Blockchain

รู้เบื้องต้นเกี่ยวกับ zk-SNARKs

ภาพรวมของการพิสูจน์ความรู้แบบศูนย์และวิธีการรวม zk-SNARK เข้ากับ Ethereum โดย ConsenSys มีนาคม 27, 2017 โพสต์เมื่อมีนาคม 27, 2017

บ้านฮีโร่


ในโพสต์นี้เรามุ่งหวังที่จะให้ภาพรวมของ zk-SNARKs จากมุมมองที่ใช้งานได้จริง เราจะถือว่าคณิตศาสตร์จริงเป็นกล่องดำและพยายามพัฒนาสัญชาตญาณบางอย่างเกี่ยวกับวิธีที่เราสามารถใช้มันได้ นอกจากนี้เราจะนำเสนอแอปพลิเคชันง่ายๆสำหรับงานล่าสุดใน การรวม zk-SNARK ใน Ethereum.

การพิสูจน์ความรู้ที่เป็นศูนย์

เป้าหมายของการพิสูจน์แบบไม่มีความรู้คือเพื่อให้ผู้ตรวจสอบสามารถโน้มน้าวตัวเองว่าผู้สุภาษิตมีความรู้เกี่ยวกับพารามิเตอร์ลับที่เรียกว่าพยานสร้างความพึงพอใจให้กับความสัมพันธ์บางอย่างโดยไม่ต้องเปิดเผยพยานต่อผู้ตรวจสอบหรือบุคคลอื่น.

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

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

ตัวอย่างโปรแกรม

สมมติว่า Bob ได้รับแฮช H ที่มีค่าบางค่าและเขาต้องการพิสูจน์ว่าอลิซรู้ค่าที่แฮชต่อ H โดยปกติแล้วอลิซจะพิสูจน์สิ่งนี้โดยการให้ s กับ Bob หลังจากนั้น Bob จะคำนวณแฮชและตรวจสอบว่า มันเท่ากับ H.

อย่างไรก็ตามสมมติว่าอลิซไม่ต้องการเปิดเผยคุณค่าของบ็อบ แต่เธอแค่ต้องการพิสูจน์ว่าเธอรู้คุณค่า เธอสามารถใช้ zk-SNARK สำหรับสิ่งนี้.

เราสามารถอธิบายสถานการณ์ของ Alice โดยใช้โปรแกรมต่อไปนี้ซึ่งเขียนเป็นฟังก์ชัน Javascript:

ฟังก์ชัน C (x, w) {return (sha256 (w) == x);} ภาษารหัส: JavaScript (javascript)

กล่าวอีกนัยหนึ่ง: โปรแกรมใช้แฮชสาธารณะ x และค่าลับ w และส่งกลับจริงถ้าแฮช SHA – 256 ของ w เท่ากับ x.

การแปลปัญหาของอลิซโดยใช้ฟังก์ชัน C (x, w) เราจะเห็นว่าอลิซจำเป็นต้องสร้างข้อพิสูจน์ว่าเธอมีคุณสมบัติเช่นนั้น C (H, s) == จริงโดยไม่ต้องเปิดเผย s นี่คือปัญหาทั่วไปที่ zk-SNARKs แก้ไขได้.

คำจำกัดความของ zk-SNARK

zk-SNARK ประกอบด้วยสามอัลกอริทึม G, P, V ที่กำหนดดังต่อไปนี้:

ตัวสร้างคีย์ G ใช้พารามิเตอร์ลับแลมด้าและโปรแกรม C และสร้างคีย์ที่เปิดเผยต่อสาธารณะสองคีย์ pk พิสูจน์คีย์และคีย์การตรวจสอบ vk คีย์เหล่านี้เป็นพารามิเตอร์สาธารณะที่ต้องสร้างเพียงครั้งเดียวสำหรับโปรแกรม C ที่กำหนด.

สุภาษิต P ใช้เป็นอินพุตคีย์พิสูจน์ pk อินพุตสาธารณะ x และพยานส่วนตัว w อัลกอริทึมสร้างหลักฐาน prf = P (pk, x, w) ที่ผู้ประกาศรู้จักพยาน w และพยานนั้นเป็นไปตามโปรแกรม.

ตัวตรวจสอบ V จะคำนวณ V (vk, x, prf) ซึ่งจะคืนค่าจริงหากการพิสูจน์นั้นถูกต้องและเป็นเท็จ ดังนั้นฟังก์ชั่นนี้จะคืนค่าจริงถ้าผู้ประกาศรู้พยานที่พอใจ C (x, w) == จริง.

สังเกตที่นี่พารามิเตอร์ลับแลมด้าที่ใช้ในเครื่องกำเนิดไฟฟ้า บางครั้งพารามิเตอร์นี้ทำให้ใช้ zk-SNARK ในแอปพลิเคชันในโลกแห่งความเป็นจริงได้ยาก เหตุผลก็คือใครก็ตามที่รู้พารามิเตอร์นี้สามารถสร้างหลักฐานปลอมได้ โดยเฉพาะให้โปรแกรม C และอินพุตสาธารณะ x บุคคลที่รู้จักแลมบ์ดาสามารถสร้างหลักฐาน fake_prf เพื่อให้ V (vk, x, fake_prf) ประเมินว่าเป็นจริงโดยปราศจากความรู้เกี่ยวกับความลับ w.

ดังนั้นการรันเครื่องกำเนิดไฟฟ้าต้องใช้กระบวนการที่ปลอดภัยมากเพื่อให้แน่ใจว่าไม่มีใครเรียนรู้และบันทึกพารามิเตอร์ได้ทุกที่ นี่คือเหตุผลสำหรับ พิธีที่ซับซ้อนมาก ทีม Zcash ดำเนินการเพื่อสร้างคีย์การพิสูจน์และคีย์การตรวจสอบในขณะที่ตรวจสอบให้แน่ใจว่าแลมด้าพารามิเตอร์ “ขยะพิษ” ถูกทำลายในกระบวนการ.

zk-SNARK สำหรับโปรแกรมตัวอย่างของเรา

อลิซและบ็อบจะใช้ zk-SNARK ในทางปฏิบัติอย่างไรเพื่อให้อลิซพิสูจน์ว่าเธอรู้ค่าลับในตัวอย่างด้านบน?

ก่อนอื่นตามที่กล่าวไว้ข้างต้นเราจะใช้โปรแกรมที่กำหนดโดยฟังก์ชันต่อไปนี้:

ฟังก์ชัน C (x, w) {return (sha256 (w) == x); } รหัสภาษา: JavaScript (javascript)

ขั้นตอนแรกคือให้ Bob เรียกใช้เครื่องกำเนิดไฟฟ้า G เพื่อสร้างคีย์พิสูจน์ pk และคีย์การยืนยัน vk ขั้นแรกสร้างแลมด้าแบบสุ่มและใช้เป็นอินพุต:

(pk, vk) = G (C, แลมบ์ดา)

จัดการพารามิเตอร์แลมด้าด้วยความระมัดระวังเพราะถ้าอลิซเรียนรู้คุณค่าของแลมด้าเธอจะสามารถสร้างหลักฐานปลอมได้ บ็อบจะแบ่งปัน pk และ vk กับอลิซ.

ตอนนี้อลิซจะรับบทเป็นผู้ประกาศ เธอต้องการพิสูจน์ว่าเธอรู้ค่าที่แฮชไปยังแฮช H ที่รู้จักเธอรันอัลกอริทึมการพิสูจน์ P โดยใช้อินพุต pk, H และ s เพื่อสร้างหลักฐานการพิสูจน์:

prf = P (pk, H, s)

ถัดไปอลิซนำเสนอหลักฐานการพิสูจน์แก่บ็อบผู้เรียกใช้ฟังก์ชันการตรวจสอบ V (vk, H, prf) ซึ่งจะกลับมาเป็นจริงในกรณีนี้เนื่องจากอลิซรู้ความลับอย่างถูกต้อง บ็อบมั่นใจได้ว่าอลิซรู้ความลับ แต่อลิซไม่จำเป็นต้องเปิดเผยความลับกับบ็อบ.

คีย์การพิสูจน์และการตรวจสอบที่นำกลับมาใช้ใหม่ได้

ในตัวอย่างของเราด้านบนไม่สามารถใช้ zk-SNARK ได้หาก Bob ต้องการพิสูจน์ให้ Alice รู้ว่าเขารู้ความลับเพราะ Alice ไม่สามารถรู้ได้ว่า Bob ไม่ได้บันทึกพารามิเตอร์แลมบ์ดา บ๊อบสามารถพิสูจน์หลักฐานปลอมได้.

หากโปรแกรมมีประโยชน์กับคนจำนวนมาก (เช่นตัวอย่างของ Zcash) กลุ่มอิสระที่เชื่อถือได้แยกต่างหากจาก Alice และ Bob สามารถเรียกใช้เครื่องกำเนิดไฟฟ้าและสร้าง pk คีย์พิสูจน์และคีย์การตรวจสอบ vk ในลักษณะที่ไม่มีใครเรียนรู้เกี่ยวกับแลมด้า.

ใครก็ตามที่เชื่อมั่นว่ากลุ่มไม่ได้โกงจะสามารถใช้คีย์เหล่านี้เพื่อการโต้ตอบในอนาคตได้.

zk-SNARK ใน Ethereum

นักพัฒนาได้เริ่มรวม zk-SNARK เข้ากับ Ethereum แล้ว สิ่งนี้มีลักษณะอย่างไร? คุณสามารถเพิ่มส่วนประกอบพื้นฐานของอัลกอริธึมการตรวจสอบให้กับ Ethereum ในรูปแบบของสัญญาที่รวบรวมไว้ล่วงหน้าได้ มีวิธีการดังนี้: เรียกใช้เครื่องกำเนิดไฟฟ้าแบบไม่ใช้โซ่เพื่อผลิตคีย์การพิสูจน์และคีย์การยืนยัน จากนั้นผู้หยั่งรู้ใด ๆ ก็สามารถใช้รหัสพิสูจน์เพื่อสร้างหลักฐานได้เช่นกัน จากนั้นคุณสามารถเรียกใช้อัลกอริธึมการตรวจสอบทั่วไปภายในสัญญาอัจฉริยะโดยใช้หลักฐานคีย์การตรวจสอบและอินพุตสาธารณะเป็นพารามิเตอร์อินพุต จากนั้นคุณสามารถใช้ผลลัพธ์ของอัลกอริทึมการตรวจสอบเพื่อทริกเกอร์กิจกรรมออนไลน์อื่น ๆ.

ตัวอย่าง: ธุรกรรมที่เป็นความลับ

นี่คือตัวอย่างง่ายๆว่า zk-SNARK สามารถช่วยเรื่องความเป็นส่วนตัวบน Ethereum ได้อย่างไร สมมติว่าเรามีสัญญาโทเค็นธรรมดา โดยปกติสัญญาโทเค็นจะมีการแมปจากที่อยู่ไปยังยอดคงเหลือเป็นหลัก:

การทำแผนที่ (ที่อยู่ => uint256) ยอดคงเหลือ; ภาษารหัส: JavaScript (javascript)

เราจะคงคอร์พื้นฐานเดิมไว้ยกเว้นแทนที่สมดุลด้วยแฮชของบาลานซ์:

การทำแผนที่ (ที่อยู่ => bytes32) balanceHashes; ภาษารหัส: JavaScript (javascript)

เราจะไม่ซ่อนผู้ส่งหรือผู้รับธุรกรรม แต่เราจะซ่อนยอดคงเหลือและจำนวนเงินที่ส่งไป คุณสมบัตินี้บางครั้งเรียกว่า ธุรกรรมที่เป็นความลับ.

เราจะใช้ zk-SNARK สองตัวในการส่งโทเค็นจากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง หนึ่งหลักฐานถูกสร้างขึ้นโดยผู้ส่งและอีกหนึ่งหลักฐานโดยผู้รับ.

โดยปกติในสัญญาโทเค็นสำหรับธุรกรรมที่มีมูลค่าขนาดจะถูกต้องเราจำเป็นต้องตรวจสอบสิ่งต่อไปนี้:

ยอดคงเหลือ [fromAddress] >= ค่า

zk-SNARK ของเราจำเป็นต้องพิสูจน์ว่าการระงับนี้และแฮชที่อัปเดตนั้นตรงกับยอดคงเหลือที่อัปเดตแล้ว.

แนวคิดหลักคือผู้ส่งจะใช้ยอดดุลเริ่มต้นและมูลค่าธุรกรรมเป็นอินพุตส่วนตัว ในฐานะอินพุตสาธารณะพวกเขาใช้แฮชของยอดดุลเริ่มต้นยอดดุลสิ้นสุดและมูลค่า ในทำนองเดียวกันเครื่องรับจะใช้ยอดเริ่มต้นและค่าเป็นอินพุตลับ ในฐานะอินพุตสาธารณะพวกเขาใช้แฮชของยอดดุลเริ่มต้นยอดดุลสิ้นสุดและมูลค่า.

ด้านล่างนี้คือโปรแกรมที่เราจะใช้สำหรับผู้ส่ง zk-SNARK โดยที่ก่อนหน้านี้ x แสดงถึงอินพุตสาธารณะและ w หมายถึงอินพุตส่วนตัว.

ฟังก์ชัน senderFunction (x, w) {return (w.senderBalanceBefore > w.value && sha256 (w.value) == x.hashValue && sha256 (w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256 (w.senderBalanceBefore – w.value) == x.hashSenderBalanceAfter)} ภาษารหัส: JavaScript (javascript)

โปรแกรมที่ผู้รับใช้อยู่ด้านล่าง:

ฟังก์ชัน receiverFunction (x, w) {return (sha256 (w.value) == x.hashValue && sha256 (w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256 (w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter)} ภาษารหัส: JavaScript (javascript)

โปรแกรมตรวจสอบว่ายอดเงินที่ส่งมีค่ามากกว่าค่าที่ส่งรวมทั้งตรวจสอบว่าแฮชทั้งหมดตรงกันหรือไม่ กลุ่มคนที่เชื่อถือได้จะสร้างคีย์การพิสูจน์และยืนยันสำหรับ zk-SNARK ของเรา มาเรียกพวกเขาว่า confTxSenderPk, confTxSenderVk, confTxReceiverPk และ confTxReceiverVk.

การใช้ zk-SNARK ในสัญญาโทเค็นจะมีลักษณะดังนี้:

การถ่ายโอนฟังก์ชัน (ที่อยู่ _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter ไบต์ zkProofSender ไบต์ zkProofReceiver) {bytes32 hashSenderBalanceBefore = balanceHashes [msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes [_to]; bool senderProofIsCorrect = zksnarkverify (confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify (confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); ถ้า (senderProofIsCorrect && receiverProofIsCorrect) {balanceHashes [msg.sender] = hashSenderBalanceAfter; balanceHashes [_to] = hashReceiverBalanceAfter; }} รหัสภาษา: JavaScript (javascript)

ดังนั้นการอัปเดตเดียวใน blockchain คือแฮชของยอดคงเหลือไม่ใช่ยอดคงเหลือในตัวเอง อย่างไรก็ตามเราสามารถทราบได้ว่ายอดคงเหลือทั้งหมดได้รับการอัปเดตอย่างถูกต้องเนื่องจากเราสามารถตรวจสอบตัวเองได้ว่ามีการตรวจสอบหลักฐานแล้ว.

รายละเอียด

รูปแบบการทำธุรกรรมที่เป็นความลับข้างต้นส่วนใหญ่เป็นการให้ตัวอย่างที่ใช้ได้จริงว่าเราสามารถใช้ zk-SNARK บน Ethereum ได้อย่างไร ในการสร้างแผนการทำธุรกรรมที่เป็นความลับที่มีประสิทธิภาพเราจำเป็นต้องแก้ไขปัญหาหลายประการ:

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

จดหมายข่าวสมัครรับจดหมายข่าวของเราเพื่อรับข่าวสารล่าสุดของ Ethereum โซลูชันระดับองค์กรทรัพยากรสำหรับนักพัฒนาและอื่น ๆ ที่อยู่อีเมลเนื้อหาพิเศษวิธีสร้างผลิตภัณฑ์ Blockchain ที่ประสบความสำเร็จการสัมมนาผ่านเว็บ

วิธีสร้างผลิตภัณฑ์ Blockchain ที่ประสบความสำเร็จ

วิธีการตั้งค่าและเรียกใช้โหนด Ethereumการสัมมนาผ่านเว็บ

วิธีการตั้งค่าและเรียกใช้โหนด Ethereum

วิธีสร้าง Ethereum API ของคุณเองการสัมมนาผ่านเว็บ

วิธีสร้าง Ethereum API ของคุณเอง

วิธีสร้างโซเชียลโทเค็นการสัมมนาผ่านเว็บ

วิธีสร้างโซเชียลโทเค็น

การใช้เครื่องมือรักษาความปลอดภัยในการพัฒนาสัญญาอัจฉริยะการสัมมนาผ่านเว็บ

การใช้เครื่องมือรักษาความปลอดภัยในการพัฒนาสัญญาอัจฉริยะ

อนาคตของการเงินสินทรัพย์ดิจิทัลและ DeFiการสัมมนาผ่านเว็บ

อนาคตของการเงิน: สินทรัพย์ดิจิทัลและ DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me