ออราเคิลแบบสุ่มตามลายเซ็นดิจิทัลในบล็อคเชน

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

ออราเคิลแบบสุ่มตามลายเซ็นดิจิทัลในบล็อคเชน

ความคิด

ในฤดูใบไม้ร่วงปี 2018 ได้มีการรวมบล็อคเชน Waves ไว้ด้วย เปิดใช้งานสัญญาอัจฉริยะครั้งแรกคำถามก็เกิดขึ้นทันทีเกี่ยวกับความเป็นไปได้ที่จะได้รับ ตัวเลขสุ่มเทียมที่คุณสามารถไว้วางใจได้

เมื่องงกับคำถามนี้ ในที่สุดฉันก็ได้ข้อสรุปว่า บล็อกเชนใดๆ ก็คือเซลล์ เป็นไปไม่ได้ที่จะได้รับแหล่งเอนโทรปีที่เชื่อถือได้ในระบบปิด

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

แพลตฟอร์มบล็อกเชน Waves ใช้รูปแบบลายเซ็น กศน การเลือก Ed25519. ในรูปแบบนี้ลายเซ็นประกอบด้วยค่า R และ S โดยที่ R ขึ้นอยู่กับค่าสุ่มและ S คำนวณตามข้อความที่เซ็นชื่อคีย์ส่วนตัวและตัวเลขสุ่มเดียวกันกับ R ปรากฎว่า ไม่มีการพึ่งพาที่ไม่ซ้ำกันสำหรับสิ่งเดียวกัน มีลายเซ็นที่ถูกต้องจำนวนมากสำหรับข้อความผู้ใช้

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

แต่เมื่อปรากฏออกมาแล้ว ก็เป็นไปได้ที่จะกำหนดไว้ได้จริง

ฉันมีความหวังอย่างมาก ฟังก์ชั่นสุ่มที่ตรวจสอบได้ (VRF)แต่หลังจากศึกษาฮาร์ดแวร์แล้ว ฉันก็ต้องละทิ้งตัวเลือกนี้ แม้ว่า VRF จะเสนอลายเซ็นและการพิสูจน์ในเวอร์ชันที่กำหนด แต่ก็มีจุดแปลกในอัลกอริทึมที่เปิดหลุมดำเพื่อจัดการ oracle กล่าวคือเมื่อคำนวณค่าของ k (ส่วนที่ 5.1) มีการใช้คีย์ส่วนตัว ซึ่งผู้ใช้ยังไม่ทราบ ซึ่งหมายความว่าผู้ใช้ไม่สามารถตรวจสอบความถูกต้องของการคำนวณ k ได้ ซึ่งหมายความว่า oracle สามารถใช้ค่าใดก็ได้ของ k ที่ต้องการ และในขณะเดียวกันก็รักษาฐานข้อมูลการติดต่อสื่อสาร ของ k และข้อมูลที่ลงนามเพื่อให้สามารถคำนวณผลลัพธ์ที่ถูกต้องอีกครั้งจากมุมมองของ VRF หากคุณเห็นภาพวาดตาม VRF โดยไม่เปิดเผยคีย์ส่วนตัว คุณสามารถฉลาดได้: ระบุความจำเป็นในการเปิดเผยคีย์ หรือแยกออกจากการคำนวณ k จากนั้นคีย์ส่วนตัวจะเปิดเผยตัวเองโดยอัตโนมัติเมื่อลายเซ็นแรกปรากฏขึ้น . โดยทั่วไปดังที่ได้กล่าวไปแล้ว โครงการแปลก ๆ สำหรับออราเคิลแบบสุ่ม

หลังจากคิดสักนิดและขอความช่วยเหลือจากนักวิเคราะห์ในพื้นที่ โครงการการทำงานของ VECRO ก็ถือกำเนิดขึ้น

VECRO เป็นตัวย่อของ Verifiable Elliptic Curve Random Oracle ซึ่งในภาษารัสเซียหมายถึง Verifiable Random Oracle บนเส้นโค้งรูปไข่

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

ในรูปแบบดังกล่าว ไม่สำคัญว่า R จะได้รับการแก้ไขอย่างไร สิ่งนี้ยังคงเป็นความรับผิดชอบของ oracle สิ่งสำคัญคือผู้ใช้จะกำหนด S โดยไม่ซ้ำกัน แต่จะไม่ทราบค่าของมันจนกว่า oracle จะเผยแพร่ ทุกสิ่งที่เราต้องการ!

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

โดยรวมแล้ว ออราเคิลต้องจัดเตรียมฟังก์ชันสองอย่างให้กับผู้ใช้: การกำหนดค่าเริ่มต้นซึ่งแก้ไขค่า R และลายเซ็นซึ่งส่งคืนค่า S ในกรณีนี้ คู่ R, S คือลายเซ็นที่ตรวจสอบได้ตามปกติของข้อความผู้ใช้ที่มีฟังก์ชันคงที่ ค่า R และข้อมูลผู้ใช้โดยพลการ

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

เป็นเวลาหกเดือนที่ความคิดเรื่องการนำไปปฏิบัติถูกฝังอยู่ในหัวของฉัน จนกระทั่งในที่สุดแรงจูงใจก็ปรากฏขึ้นในรูปแบบนั้น ได้รับทุนจาก Waves Labs. ด้วยทุนก้อนโตมาพร้อมกับความรับผิดชอบที่ยิ่งใหญ่ ดังนั้นโปรเจ็กต์ก็จะอยู่ที่นั่น!

การดำเนินงาน

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

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

ปัจจุบันมี VECRO หนึ่งตัวที่รันอยู่บน Mainnet ของ Waves (คุณสามารถรันเองได้ ไม่ยาก แค่ ดูตัวอย่างการกำหนดค่า). รหัสปัจจุบันทำงานใน PHP (on เวฟคิทเกี่ยวกับเรื่องนั้น ฉันบอกคุณก่อนหน้านี้).

ในการใช้บริการ Oracle คุณต้อง:

  • แก้ไข R;
    • ส่ง Waves อย่างน้อย 0.005 ไปยัง oracle alias init@vecr;
    • รับรหัส R ในช่องไฟล์แนบในการโอนโทเค็น R-vecr 1 รายการจาก oracle ไปยังผู้ใช้
  • รับลายเซ็น;
    • ส่ง Waves อย่างน้อย 0.005 ไปยัง oracle alias Random@vecr และต้องระบุรหัส R ที่ได้รับก่อนหน้านี้และข้อมูลผู้ใช้เพิ่มเติมในช่องไฟล์แนบ
    • รับรหัส S ในช่องไฟล์แนบในการโอนโทเค็น S-vecr 1 รายการจาก oracle ไปยังผู้ใช้
  • ใช้ S-code เป็นแหล่งที่มาของตัวเลขสุ่มหลอก

ความแตกต่างของการดำเนินการในปัจจุบัน:

  • Wave ที่ส่งไปยัง oracle จะถูกใช้เป็นค่าคอมมิชชันสำหรับการส่งคืนธุรกรรมให้กับผู้ใช้ สูงสุดไม่เกิน 1 Waves
  • R-code คือการต่อไบต์ของอักขระ 'R' และค่า R ที่เข้ารหัส base32 ขนาด 58 ไบต์
  • รหัส R ในไฟล์แนบควรอยู่อันดับแรก ข้อมูลผู้ใช้จะอยู่หลังรหัส R
  • S-code คือการต่อไบต์ของอักขระ 'S' และค่าที่เข้ารหัส base32 ขนาด 58 ไบต์ของ S
  • S เป็นผลลัพธ์ของการหารแบบโมดูโล ดังนั้นคุณจึงไม่สามารถใช้ S เป็นตัวเลขสุ่มเทียมขนาด 256 บิตแบบเต็มได้ (ตัวเลขนี้ถือเป็นตัวเลขสุ่มเทียมที่มีขนาดสูงสุด 252 บิต)
  • ตัวเลือกที่ง่ายที่สุดคือใช้แฮช S-code เป็นตัวเลขสุ่มหลอก

ตัวอย่างการรับ S-code:

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

ฉันยินดีที่จะตอบคำถามและยอมรับความคิดเห็นขอบคุณ

ที่มา: will.com

เพิ่มความคิดเห็น