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

Идеята
През есента на 2018 г. в блокчейна Waves бяха , веднага възникна въпросът за възможността за получаване на , на които може да се вярва.
Размишлявайки по този въпрос, окончателно стигнах до извода: всеки блокчейн е клетка, получаването на надежден източник на ентропия в затворена система е невъзможно.
Но една идея ми допадна: ако прави подписването на потребителски данни с детерминиран алгоритъм, потребителят винаги ще може да провери такъв подпис по публичен ключ и ще бъде сигурен, че получената стойност е уникална. Оракулът, при всички положения, не може да промени нищо, алгоритъмът дава недвусмислен резултат. По същество потребителят фиксира резултата, но не знае какъв е той, докато оракулът не го публикува. Получава се, че не е нужно да се доверяваме на оракула, а да проверяваме резултата от неговата работа. Тогава, в случай на успешно проверяване, такъв подпис може да се счита за източник на ентропия за псевдослучайно число.
В блокчейн платформата Waves се използва схема на подпис вариант . В тази схема подписът се състои от стойности R и S, където R зависи от случайна стойност, а S се изчислява на базата на подписваното съобщение, частния ключ и същата случайна стойност, от която произтича и R. Получава се, че няма ясно определена зависимост, за едно и също потребителско съобщение съществуват множество валидни подписи.
Очевидно е, че в чист вид такъв подпис не може да се използва като източник на псевдослучайни числа, тъй като той е недетерминиран и следователно може лесно да бъде подложен на манипулации от оракула.
Но, както се оказа, всъщност е възможно да се направи детерминиран.
Големи надежди имах върху , но след като проучихме материята, от този вариант се наложи да се откажем. Въпреки че VRF предлага детерминиран вариант на подписа и неговото доказателство, в алгоритъма присъства странно място, което отваря черна дупка за манипулации от страна на оракула. А именно, при изчисляването на стойността k () се използва частен ключ, който остава неизвестен за потребителя, следователно потребителят не може да провери коректността на изчислението на k, тъй като оракулът може да използва всяка стойност k, която му е необходима, и едновременно да води база данни със съответствията на k и подписваните данни, за да може винаги да повторно изчисли правилния резултат от гледна точка на VRF. Ако видите разиграване на основата на VRF без разкриване на частния ключ, можете да направите забележка: да посочите необходимостта да се разкрие ключа, или да го изключите от изчислението на k, тогава частният ключ автоматично ще се разкрие при появата на първата подпис. В общи линии, както вече казахме, странна схема за случаен оракул.
След малко размисли и с подкрепата на местните анализатори, се роди схемата на работа на VECRO.
VECRO е съкращение от Verifiable Elliptic Curve Random Oracle, което на български означава проверим случаен оракул на елиптични криви.
Всичко се оказа доста просто, за да се постигне детерминираност е необходимо да се фиксира стойността R преди появата на подписваното съобщение. Ако R е фиксирано и е част от подписваното съобщение, което допълнително гарантира фиксирането на R в самото подписвано съобщение, стойността S недвусмислено се определя от потребителското съобщение и следователно може да бъде използвана като източник за псевдослучайни числа.
В такава схема не е важно по какъв начин се фиксира R, това остава в рамките на отговорността на оракула. Важно е, че S недвусмислено се определя от потребителя, но неговата стойност е неизвестна, докато оракулът не я публикува. Всичко е така, както желаем!
Говорейки за фиксирано R, обърнете внимание, че При подписването на различни съобщения, той недвусмислено разкрива частния ключ в схемата EdDSA. За собственика на оракула е изключително важно да изключи възможността за повторно използване на R за подписването на различни съобщения от потребителя. Тоест, при каквито и да е манипулации или заговор, оракулът винаги рискува да загуби своя частен ключ.
И така, оракулът трябва да предоставя на потребителите две функции: инициализация, която фиксира стойността на R, и подпис, който връща стойността на S. При това двойката R, S е обикновен проверяем подпис на потребителското съобщение, съдържащо фиксирана стойност R и произволни данни от потребителя.
Може да се възрази, че тази схема за блокчейн не е нищо повече от обикновена . По същността си, да, това е точно тя. Но има няколко нюанса. Първо, оракулът винаги работи със същия ключ в всички операции, например, това е удобно за използване в контрактите. На второ място, съществува риск от загуба на частния ключ от оракула при неправилно поведение, например, оракулът позволява вземане на проби на резултатите, така че е достатъчно да направи само две проби, за да научи частния ключ и да получи пълен достъп до портфейла. На трето място, нативно проверяемият подпис в блокчейна, който е източник на случайност — това е красиво.
Полгода идеята за реализиране на проекта тлееше в ума ми, докато накрая не се появи мотивация под формата на . С голям грант идва и голяма отговорност, следователно проектът трябва да се реализира!
Реализация
И така, в този проект на блокчейн Waves в режим запитване-отговор с помощта на трансферни транзакции между потребителя и оракула. При това на акаунта на оракула е инсталиран скрипт, който контролира работата в строго съответствие с описаната по-горе логика. Транзакциите на оракула преминават проверка с възстановяване на цялата верига на взаимодействие с потребителя. В проверката на крайната стойност участват всичките четири транзакции, смарт-контрактът ги нанизва на строго проверителна нишка, стъпка по стъпка проверявайки всички стойности и не оставяйки място за манипулации.
Още веднъж, за да се запомни и да бъде по-разбрано. Оракулът не просто работи по предложената схема. Неговата работа се контролира напълно на ниво блокчейн. . Стъпка наляво и транзакцията просто няма да премине. Така че, ако транзакцията е попаднала в блокчейн, потребителят дори не трябва да проверява нищо, всичко вече е проверено от стотици възли на мрежата.
В момента в основната мрежа Waves е стартиран един VECRO (можете да стартирате свой, не е трудно, просто ). Текущият код работи на PHP (на , за който ).
За да използвате услугата на оракула, е необходимо:
- Да фиксирате R;
- Да изпратите минимум 0.005 Waves на алиас на оракула init@vecr;
- Да получите R-code в полето attachment при трансфера на 1 R-vecr токен от оракула на потребителя;
- Да получите подпис;
- Да изпратите минимум 0.005 Waves на алиас на оракула random@vecr, а също така ЗАДЪЛЖИТЕЛНО да посочите в полето attachment полученото преди това R-code и допълнителни потребителски данни;
- Да получите S-code в полето attachment при трансфера на 1 S-vecr токен от оракула на потребителя;
- Да използвате S-code като източник на псевдослучайно число.
Нюанси на текущата реализация:
- Изпратените на оракула Waves се използват като такса за обратно трансфериране на потребителя, до максимум 1 Waves;
- R-code е конкатенация на байта на символа ‘R’ и 32-байтовата стойност R в кодировка base58;
- R-code в attachment трябва да бъде на първо място, потребителските данни вървят след R-code;
- S-code е конкатенация на байта на символа ‘S’ и 32-байтовата стойност S в кодировка base58;
- S е резултат от делене по модул, затова не може да се използва S като полноценен 256-битов псевдослучайно число (това число може да се счита максимум за 252-битово псевдослучайно число);
- Най-простият вариант е да се използва хеш от S-code като псевдослучайно число.
Пример за получаване на S-code:
- Инициализация:
- Получаване на R-code:
- Изискване на резултата от подписа на R-code и потребителските данни 'random':
- Получаване на S-code:
От техническа гледна точка, оракулът е напълно готов за работа, можете смело да го използвате. От гледна точка на потребителите, не достига удобен графичен интерфейс, за който ще трябва да изчакате.
Ще се радвам да отговоря на въпроси и да приема коментари, благодаря.
Източник: habr.com
