Блокчэйн дэх тоон гарын үсэг дээр суурилсан санамсаргүй oracle

Санаанаас хэрэгжүүлэх хүртэл: бид одоо байгаа зууван муруй дижитал гарын үсгийн схемийг тодорхойлогч байхаар өөрчилдөг бөгөөд үүн дээр үндэслэн бид блокчейн дотор шалгах боломжтой псевдо санамсаргүй тоо авах функцуудыг хангадаг.

Блокчэйн дэх тоон гарын үсэг дээр суурилсан санамсаргүй oracle

Санаа

2018 оны намар Waves блокчейн багтсан анхны ухаалаг гэрээг идэвхжүүлсэн, олж авах боломжийн тухай асуулт нэн даруй гарч ирэв псевдор санамсаргүй тоогэдэгт итгэж болно.

Энэ асуултын талаар толгойгоо гашилгаж, би эцэст нь ийм дүгнэлтэд хүрсэн: аливаа блокчейн бол эс бөгөөд хаалттай системд энтропийн найдвартай эх үүсвэрийг олж авах боломжгүй юм.

Гэхдээ надад нэг санаа таалагдсан: хэрэв санамсаргүй таамаглал нь хэрэглэгчийн өгөгдөлд детерминистик алгоритмаар гарын үсэг зурах бөгөөд дараа нь хэрэглэгч нийтийн түлхүүрийг ашиглан ийм гарын үсгийг үргэлж шалгах боломжтой бөгөөд үр дүнд нь гарсан утга нь өвөрмөц гэдэгт итгэлтэй байх болно. Оракул хичнээн их хүссэн ч юуг ч өөрчлөх боломжгүй; алгоритм нь хоёрдмол утгагүй үр дүнг гаргадаг. Үндсэндээ хэрэглэгч үр дүнг тэмдэглэдэг боловч oracle үүнийг нийтлэх хүртэл үүнийг мэддэггүй. Та oracle-д огт итгэж болохгүй, гэхдээ түүний ажлын үр дүнг шалгаарай. Дараа нь амжилттай баталгаажуулсан тохиолдолд ийм гарын үсэг нь псевдор санамсаргүй тооны энтропийн эх үүсвэр гэж үзэж болно.

Waves блокчэйн платформ нь гарын үсэг зурах схемийг ашигладаг EdDSA сонголт Ed25519. Энэ схемд гарын үсэг нь R ба S утгуудаас бүрдэх бөгөөд R нь санамсаргүй утгаас хамаардаг ба S нь гарын үсэг зурсан мессеж, хувийн түлхүүр, R-тэй ижил санамсаргүй тоон дээр үндэслэн тооцоологддог. ижил төстэй хамаарал байхгүй Хэрэглэгчийн зурваст олон хүчинтэй гарын үсэг байдаг.

Мэдээжийн хэрэг, цэвэр хэлбэрээр ийм гарын үсгийг псевдо санамсаргүй тоонуудын эх үүсвэр болгон ашиглах боломжгүй, учир нь энэ нь тодорхойгүй тул oracle амархан удирдаж болно.

Гэхдээ үүнийг тодорхой болгох нь үнэндээ боломжтой юм.

Би маш их итгэл найдвар тавьж байсан баталгаажуулах санамсаргүй функц (VRF), гэхдээ техник хангамжийг судалсны дараа би энэ сонголтоос татгалзах хэрэгтэй болсон. Хэдийгээр VRF нь гарын үсэг болон түүний нотолгоог тодорхойлох тодорхой хувилбарыг санал болгодог боловч алгоритмд oracle-ийг удирдах хар нүхийг нээдэг хачирхалтай газар байдаг. Тухайлбал, k-ийн утгыг тооцоолохдоо (хэсэг 5.1) хувийн түлхүүрийг ашигладаг бөгөөд энэ нь хэрэглэгчдэд мэдэгдэхгүй хэвээр байгаа бөгөөд энэ нь хэрэглэгч k-ийн тооцоолол зөв эсэхийг шалгах боломжгүй гэсэн үг бөгөөд энэ нь oracle нь өөрт хэрэгтэй k-ийн дурын утгыг ашиглаж, захидал харилцааны мэдээллийн санг хадгалах боломжтой гэсэн үг юм. VRF-ийн үүднээс зөв үр дүнг дахин тооцоолох боломжтой байхын тулд k болон гарын үсэг зурсан өгөгдөл. Хэрэв та хувийн түлхүүрийг задлахгүйгээр VRF-д суурилсан зургийг харвал ухаалаг байж болно: түлхүүрийг нээх эсвэл k-ийн тооцоололд оруулахгүй байх шаардлагатайг зааж өг, дараа нь анхны гарын үсэг гарч ирэхэд хувийн түлхүүр автоматаар гарч ирнэ. . Ерөнхийдөө, аль хэдийн дурьдсанчлан, санамсаргүй харааны хачирхалтай схем.

Бага зэрэг бодож, орон нутгийн шинжээчдийн дэмжлэгийг авсны дараа VECRO-ийн ажлын схем гарч ирэв.

VECRO гэдэг нь Verfiable Elliptic Curve Random Oracle гэсэн үгийн товчлол бөгөөд оросоор зууван муруй дээр шалгах боломжтой санамсаргүй oracle гэсэн утгатай.

Бүх зүйл маш энгийн болсон; детерминизмд хүрэхийн тулд гарын үсэг зурах мессеж гарч ирэхээс өмнө R-ийн утгыг засах хэрэгтэй. Хэрэв R нь гарын үсэг зурж буй мессежийн нэг хэсэг бөгөөд энэ нь гарын үсэг зурж буй мессежэнд R-ийг оруулсан эсэхийг баталгаажуулдаг бол S-ийн утга нь хэрэглэгчийн мессежээр тодорхойлогддог тул псевдор санамсаргүй тоонуудын эх сурвалж болгон ашиглаж болно.

Ийм схемд R-ийг хэрхэн засах нь хамаагүй, энэ нь oracle-ийн үүрэг хэвээр байна. S нь хэрэглэгч өөрөө тодорхойлогддог байх нь чухал боловч oracle үүнийг нийтлэх хүртэл түүний үнэ цэнэ тодорхойгүй байна. Бидний хүссэн бүх зүйл!

Тогтмол R-ийн тухай ярихдаа үүнийг анхаарна уу дахин ашигласан Р янз бүрийн мессежүүдэд гарын үсэг зурахдаа EdDSA схем дэх хувийн түлхүүрийг өвөрмөц байдлаар харуулдаг. Oracle эзэмшигчийн хувьд өөр өөр хэрэглэгчийн мессежүүдэд гарын үсэг зурахын тулд R-г дахин ашиглах боломжийг арилгах нь маш чухал юм. Өөрөөр хэлбэл аливаа заль мэх, хуйвалдааны үед oracle үргэлж хувийн түлхүүрээ алдах эрсдэлтэй байдаг.

Нийтдээ oracle нь хэрэглэгчдэд R утгыг засдаг эхлүүлэх, S утгыг буцаадаг гарын үсэг гэсэн хоёр функцээр хангах ёстой. Энэ тохиолдолд R, S хос нь тогтмол мэдээллийг агуулсан хэрэглэгчийн мессежийн ердийн баталгаажуулах гарын үсэг юм. R утга ба дурын хэрэглэгчийн өгөгдөл.

Блокчэйний энэхүү схем нь энгийн зүйлээс өөр зүйл биш гэж маргаж болно commit-expand схем. Үндсэндээ, тийм ээ, энэ бол тэр. Гэхдээ хэд хэдэн нюансууд байдаг. Нэгдүгээрт, oracle нь бүх үйл ажиллагаанд үргэлж ижил түлхүүрээр ажилладаг, жишээлбэл, үүнийг гэрээнд ашиглахад тохиромжтой. Хоёрдугаарт, хэрэв oracle буруу ажиллавал хувийн түлхүүрээ алдах эрсдэлтэй, жишээлбэл, oracle нь үр дүнгийн дээжийг гаргах боломжийг олгодог бол хувийн түлхүүрийг олж мэдэхийн тулд зөвхөн хоёр тест хийхэд л хангалттай. түрийвч рүү нэвтрэх. Гуравдугаарт, блокчэйн дээр анхлан шалгах боломжтой, санамсаргүй байдлын эх сурвалж болох гарын үсэг нь үзэсгэлэнтэй юм.

Зургаан сарын турш хэрэгжүүлэх санаа миний толгойд эргэлдэж, эцэст нь хүсэл эрмэлзэл хэлбэрээр гарч ирэх хүртэл Waves Labs-ийн тэтгэлэг. Их хэмжээний буцалтгүй тусламжаар том хариуцлага ирдэг тул төсөл тэнд байх болно!

Реализация

Тиймээс, энэ төсөлд VECRO хэрэгжсэн Waves блокчейн дээр хэрэглэгч болон oracle хоорондын шилжүүлгийн гүйлгээг ашиглан хүсэлт-хариу горимд. Үүний зэрэгцээ дээр дурдсан логикийн дагуу ажлыг нарийн хянадаг скриптийг oracle дансанд суулгасан болно. Oracle-ийн гүйлгээг баталгаажуулж, хэрэглэгчийн харилцан үйлчлэлийн гинжин хэлхээг бүхэлд нь сэргээдэг. Дөрвөн гүйлгээ нь эцсийн утгыг баталгаажуулахад оролцдог; ухаалаг гэрээ нь тэдгээрийг баталгаажуулах хатуу хэлхээтэй холбож, бүх утгыг алхам алхмаар шалгаж, ямар ч залилан хийх зай үлдээдэггүй.

Дахиад нэг хойш тавьж, илүү ойлгомжтой болгохын тулд. Оркул нь зөвхөн санал болгож буй схемийн дагуу ажилладаггүй. Түүний ажлыг блокчейн түвшинд бүрэн хянадаг ухаалаг гэрээгээр нягт. Зүүн тийш алхвал гүйлгээ зүгээр л бүтэхгүй. Тиймээс, хэрэв гүйлгээг блокчэйнд оруулсан бол хэрэглэгч юу ч шалгах шаардлагагүй, олон зуун сүлжээний зангилаа түүний төлөө бүх зүйлийг аль хэдийн шалгасан байна.

Одоогийн байдлаар Waves үндсэн сүлжээнд нэг VECRO ажиллаж байна (та өөрөө ажиллуулж болно, энэ нь хэцүү биш, зүгээр л тохиргооны жишээг харна уу). Одоогийн код нь PHP дээр ажилладаг (on WavesKit, аль тухай Би чамд түрүүн хэлсэн).

Oracle үйлчилгээг ашиглахын тулд та:

  • R засах;
    • Oracle alias init@vecr руу дор хаяж 0.005 долгион илгээх;
    • Oracle-аас хэрэглэгч рүү 1 R-vecr жетон шилжүүлэхдээ хавсралтын талбарт R-код хүлээн авах;
  • гарын үсэг авах;
    • Random@vecr-д дор хаяж 0.005 долгион илгээх, мөн хавсралт талбарт өмнө нь хүлээн авсан R-код болон хэрэглэгчийн нэмэлт мэдээллийг ЗААВАЛ зааж өгөх ёстой;
    • Oracle-аас хэрэглэгч рүү 1 S-vecr жетон шилжүүлэхдээ хавсралтын талбарт S-код хүлээн авах;
  • Pseudo-санамсаргүй тооны эх үүсвэр болгон S-код ашиглана уу.

Одоогийн хэрэгжилтийн нюансууд:

  • Oracle руу илгээсэн долгионыг хэрэглэгч рүү буцаах гүйлгээний шимтгэл болгон ашигладаг, дээд тал нь 1 долгион;
  • R-код нь 'R' тэмдэгтийн байт ба 32 байт суурь58 кодлогдсон R утгын холболт юм;
  • Хавсралт дахь R-код эхлээд байх ёстой, хэрэглэгчийн мэдээлэл R-кодын дараа ирдэг;
  • S-код нь 'S' тэмдэгтийн байт ба S-ийн 32 байт суурь58 кодлогдсон утгыг холбох явдал юм;
  • S нь модулийн хуваагдлын үр дүн тул та S-г бүрэн 256 бит псевдор санамсаргүй тоо болгон ашиглах боломжгүй (энэ тоог дээд тал нь 252 битийн псевдор санамсаргүй тоо гэж үзэж болно);
  • Хамгийн энгийн сонголт бол S-кодын хэшийг псевдо санамсаргүй тоо болгон ашиглах явдал юм.

S-код хүлээн авах жишээ:

Техникийн үүднээс авч үзвэл oracle ажиллахад бүрэн бэлэн байгаа тул та үүнийг аюулгүй ашиглаж болно. Энгийн хэрэглэгчийн хэрэглээний үүднээс харахад тохиромжтой график интерфэйс байхгүй тул хүлээх хэрэгтэй болно.

Би асуултанд хариулж, санал хүсэлтийг хүлээж авахдаа баяртай байх болно, баярлалаа.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх