Произволен оракул, базиран на цифров подпис в блокчейн

От идея до реализация: ние модифицираме съществуващата схема за цифров подпис с елиптична крива, така че да е детерминистична и въз основа на нея предоставяме функции за получаване на псевдослучайни числа, които могат да бъдат проверени в блокчейна.

Произволен оракул, базиран на цифров подпис в блокчейн

Идея

През есента на 2018 г. се включи блокчейнът Waves активирани първи интелигентни договори, веднага възникна въпросът за възможността за получаване псевдослучайни числаможете да се доверите.

Замисляйки се над този въпрос, най-накрая стигнах до заключението: всеки блокчейн е клетка; невъзможно е да се получи доверен източник на ентропия в затворена система.

Но все пак ми хареса една идея: ако случаен оракул ще подпише потребителски данни с детерминистичен алгоритъм, след което потребителят винаги ще може да провери такъв подпис с помощта на публичния ключ и ще бъде сигурен, че получената стойност е уникална. Оракулът, колкото и да иска, не може да промени нищо, алгоритъмът дава недвусмислен резултат. По същество потребителят записва резултата, но не го знае, докато оракулът не го публикува. Оказва се, че изобщо не можете да се доверите на оракула, а да проверите резултата от работата му. След това, в случай на успешна проверка, такъв подпис може да се счита за източник на ентропия за псевдослучайно число.

Блокчейн платформата Waves използва схема за подписване EdDSA вариант Ed25519. В тази схема подписът се състои от стойностите R и S, където R зависи от произволна стойност, а S се изчислява въз основа на подписваното съобщение, частния ключ и същото произволно число като R. Оказва се, че няма уникална зависимост за едно и също Има много валидни подписи за потребителско съобщение.

Очевидно в чистата си форма такъв подпис не може да се използва като източник на псевдослучайни числа, тъй като е недетерминиран и следователно може лесно да бъде манипулиран от оракула.

Но, както се оказа, всъщност е възможно да го направим детерминистичен.

Имах големи надежди за проверима случайна функция (VRF), но след като проучих хардуера, трябваше да се откажа от тази опция. Въпреки че VRF предлага детерминистична версия на подписа и неговото доказателство, има странно място в алгоритъма, което отваря черна дупка за манипулиране на оракула. А именно, когато се изчислява стойността на k (секция 5.1) използва се частен ключ, който остава неизвестен за потребителя, което означава, че потребителят не може да провери правилността на изчислението на k, което означава, че оракулът може да използва всяка стойност на k, от която се нуждае, и в същото време да поддържа база данни от съответствия на k и подписаните данни, за да можете винаги да преизчислите правилния резултат от гледна точка на VRF. Ако видите чертеж, базиран на VRF, без да разкривате частния ключ, можете да бъдете умни: посочете необходимостта или да разкриете ключа, или да го изключите от изчисляването на k, тогава частният ключ автоматично ще се разкрие, когато се появи първият подпис . Като цяло, както вече споменахме, странна схема за произволен оракул.

След кратък размисъл и привличане на подкрепата на местни анализатори се роди схемата за работа на VECRO.

VECRO е съкращение от Verifiable Elliptic Curve Random Oracle, което на руски означава проверим случаен оракул върху елиптични криви.

Всичко се оказа доста просто; за да постигнете детерминизъм, трябва да фиксирате стойността на R, преди да се появи съобщението, което трябва да бъде подписано. Ако R е ангажиран и е част от съобщението, което се подписва, което допълнително гарантира, че R е ангажиран в съобщението, което се подписва, стойността на S се определя еднозначно от съобщението на потребителя и следователно може да се използва като източник за псевдослучайни числа.

В такава схема няма значение как е фиксиран R; това остава отговорност на оракула. Важно е S да се определя еднозначно от потребителя, но стойността му да е неизвестна, докато оракулът не го публикува. Всичко, което искахме!

Говорейки за фиксиран R, имайте предвид, че повторно използван R при подписване на различни съобщения разкрива уникално частния ключ в схемата EdDSA. За собственика на оракула става изключително важно да елиминира възможността за повторно използване на R за подписване на различни потребителски съобщения. Тоест, при всяка манипулация или тайно споразумение, оракулът винаги ще рискува да загуби личния си ключ.

Като цяло оракулът трябва да предостави на потребителите две функции: инициализация, която фиксира стойността R, и подпис, който връща стойността S. В този случай двойката R, S е обичайният проверим подпис на потребителско съобщение, съдържащо фиксирана стойност R и произволни потребителски данни.

Може да се твърди, че тази схема за блокчейн не е нищо повече от обикновена схема за ангажиране-разгъване. По същество да, това е тя. Но има няколко нюанса. Първо, оракулът винаги работи с един и същ ключ във всички операции, например, това е удобно за използване в договори. Второ, съществува риск оракулът да загуби частния ключ, ако се държи неправилно, например оракулът ви позволява да правите проби от резултата, тогава е достатъчно да направите само два теста, за да откриете частния ключ и да получите пълен достъп до портфейла. Трето, красив е подпис, който може да се провери естествено в блокчейна и е източник на случайност.

В продължение на шест месеца идеята за внедряване кипеше в главата ми, докато най-накрая се появи мотивация във формата грант от Waves Labs. Голямата субсидия идва с голяма отговорност, така че проектът ще бъде там!

Изпълнение

И така, в този проект Внедрена е VECRO на блокчейна на Waves в режим на заявка-отговор, използвайки трансферни транзакции между потребителя и оракула. В същото време в акаунта на oracle се инсталира скрипт, който контролира работата стриктно в съответствие с логиката, описана по-горе. Транзакциите на Oracle се проверяват и цялата верига на потребителско взаимодействие се възстановява. И четирите транзакции участват в проверката на крайната стойност; интелигентният договор ги свързва заедно със стриктна нишка за проверка, като проверява всички стойности стъпка по стъпка и не оставя място за никакви манипулации.

Още веднъж, за да го оставя настрана и да стане по-ясно. Оракулът не работи само по предложената схема. Работата му е напълно контролирана на ниво блокчейн от установените тясно с интелигентен договор. Стъпете наляво и транзакцията просто няма да премине. Така че, ако транзакция е включена в блокчейна, потребителят дори не трябва да проверява нищо; стотици мрежови възли вече са проверили всичко вместо него.

В момента има един VECRO, работещ в основната мрежа на Waves (можете да стартирате свой собствен, не е трудно, просто разгледайте примера за конфигурация). Текущият код се изпълнява в PHP (на WavesKit, за кое Казах ти по-рано).

За да използвате услугата oracle трябва:

  • Поправете R;
    • Изпратете най-малко 0.005 вълни до псевдоним на оракул init@vecr;
    • Получаване на R-код в полето за прикачен файл при прехвърлянето на 1 R-vecr токен от оракула към потребителя;
  • Вземете подпис;
    • Изпратете най-малко 0.005 вълни до псевдонима на оракул random@vecr и също ТРЯБВА да посочите получения преди това R-код и допълнителни потребителски данни в полето за прикачен файл;
    • Получаване на S-код в полето за прикачен файл при прехвърлянето на 1 S-vecr токен от оракула към потребителя;
  • Използвайте S-код като източник на псевдослучайно число.

Нюанси на текущото изпълнение:

  • Вълните, изпратени до оракула, се използват като комисионна за транзакцията за връщане към потребителя, до максимум 1 вълна;
  • R-кодът е конкатенацията на байт от знака 'R' и 32-байтова R стойност, кодирана с base58;
  • R-кодът в прикачения файл трябва да е първи, потребителските данни идват след R-кода;
  • S-кодът е конкатенацията на байт от знака 'S' и 32-байтова base58-кодирана стойност на S;
  • S е резултат от модулно деление, така че не можете да използвате S като пълно 256-битово псевдослучайно число (това число може да се счита за максимум 252-битово псевдослучайно число);
  • Най-простият вариант е да използвате хеша на S-кода като псевдослучайно число.

Пример за получаване на S-код:

От техническа гледна точка оракулът е напълно готов за работа, можете безопасно да го използвате. От гледна точка на използване от средния потребител, липсва удобен графичен интерфейс, това ще трябва да почака.

Ще се радвам да отговоря на въпроси и да приема коментари, благодаря.

Източник: www.habr.com

Добавяне на нов коментар