## Подготовительная работа SLAP ###### tags: `SLAP` `L2` ## Мотивация Для распаралеливания процесса разработки приложений второго слоя - нужен хороший язык программирования. > Техническое название проекта: SLAP(Пощечина) - Second Layer Application Protocol. Определить трудоемкость модификации [Vyper](https://github.com/vyperlang/vyper), ввести в Vyper примитив среды исполнения и примитив среды компиляции: 1. Функции среды компиляции(их нет в виртуальной машине) - они должны обеспечить упрощение в работе с ABI(Бинарным интерфейсом виртуальной машины первого слоя): https://vyper.readthedocs.io/en/stable/built-in-functions.html 2. Функции среды исполнения(это примитив среды выполнения скомпилированного кода) - они должны обеспечить возможность работы с разными криптографическими примитивами: https://vyper.readthedocs.io/en/stable/built-in-functions.html, в виртуальной машине, в текущей версии EVM1 9 контрактов, в контракте эмуляции EVM1 в контексте WASM(L2.VM) - 10: ```rust= pub fn precompile(id: u64) -> Box<dyn Impl> { match id { 1 => Box::new(EcRecover) as Box<dyn Impl>, 2 => Box::new(Sha256) as Box<dyn Impl>, 3 => Box::new(Ripemd160) as Box<dyn Impl>, 4 => Box::new(Identity) as Box<dyn Impl>, 5 => Box::new(ModexpImpl) as Box<dyn Impl>, 6 => Box::new(Bn128AddImpl) as Box<dyn Impl>, 7 => Box::new(Bn128MulImpl) as Box<dyn Impl>, 8 => Box::new(Bn128PairingImpl) as Box<dyn Impl>, 9 => Box::new(Blake2FImpl) as Box<dyn Impl>, 10 => Box::new(Sign) as Box<dyn Impl>, _ => panic!("Invalid builtin ID: {}", id), } } ``` **Стратегические цели** - ввести по всей системе, как в ~~L2.VM~~`L2.Processor`, так и во всех эмулируемых контрактах общий контекст `context`, расширяющий все среды выполнения общим саб-сетом примитивов. Это позволит предоставить интуитивно понятный крипто-интерфес для не знакомых с криптографией сторонних разработчиков снизив тем самым стоимость создания кодовой базы, общей для всех цепочек(Подписи, ZKP, шифрование) `=>` ZKP = ЭЦП+Шифрование, в релизе останется несколько примитивов в яп и обертки для удобного использования сторонними разработчиками. Те мы уберем для сторонних разработчиков работу с хешами в контексте ЭЦП, с телом сообщения в контексте шифрования/пере-шифрования/вычислений над зашифрованным сообщением. С технической точки зрения, это введение через функцию мета-компиляции(компиляции в разное время в разных средах) обобщенных контрактов: * **`signature`** - работа с доступными протоколами ЭЦП, см ниже * **`encoder`** - работа с шифрованием, требуется для выполнения сервисных функций в недоверенной среде * **`signature_generator`** - работа с протоколами ZKP, те генерация протоколов ЭЦП на основе пользовательской функции **Тактические цели** - обеспечить разработчикам высокоуровневый, интуитивно понятный интерфейс для работы с классической схемой ЭЦП(`ECDSA`, `EdDSA`, `BLS` = генерация общего ключа, генерация ЭЦП, валидация ЭЦП). * **`signature.verify( context.message ) -> true/false`** > Проверка ЭЦП, на входе используется context.message.signature_protocol, context.message.sender и context.message.payload * **`signature.validate( context.message ) -> true/false`** > Проверка ЭЦП без доступа к контенту сообщения, на входе context.message.signature_protocol, context.message.sender и context.message.digest * **`signature.generate( context.message ) -> context`** > Генерация ЭЦП, на входе context.message.signature_protocol и context.message.payload, на выходе context.message.digest * **`signature.pair( context.processor , context.account ) -> true/false`** > Генерация общего ключа, для выработки общего для учетной записи ключа ## Задачи спецификации добавить примитив `sign`, как ссылка на один из предкомпилированных контрактов, на ряду с `ecrecovery`. У контракта есть адрес - bigint -> он должен хардкодится в компиляторе 1. найти где и **ввести** в компилятор `sign` 2. понять на сколько трудоемко дальнейшие модификации - **подготовится к колу**, этот аспект обсудим на часовом коле. 3. понять в каком виде я должен предоставить виртуальную машину для модификации языка(не уверен что она вообще нужна - но логика подсказывает что нужна) - **написать мне об этом в телеге**. 4. скомпилировать и запустить тестовый контракт, по работе с примитивом `sign` - генерация и проверка подписи для абстрактного сообщения.