## Подготовительная работа 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` - генерация и проверка подписи для абстрактного сообщения.