Планирование работ DAO
===
###### tags: `DAO` `Meeting Note` `Collective`
:::info
- **Location:** Офис
- **Date:** Aug 14, 2020 12:30 PM (MSK)
- **Agenda**
1. Введение в substrate `25min`
> [name=IK]
2. Офф-чейн данные DID, IPFS, 3BOX `25min`
3. CSO(fairmint.io) `20min`
- **Participants:**
- Ivan (IK)
- Andrey (AK)
- Alexander (AB)
- **Host:** IK
- **Reference:** - [Fairmint](https://fairmint.co/), [3BOX](https://3box.io/), [IPFS](ipfs.io), [DID-JWT](https://github.com/decentralized-identity/did-jwt), [Substrate Tutorial](https://substrate.dev/docs/en/tutorials/create-your-first-substrate-chain/interact)
:::
## 1. CSO(fairmint.io)
### 1.1. Экономический контекст:
* [Контракты выпуска ценных бумаг](https://github.com/Fairmint/c-org)
* [Непрерывные организации](https://github.com/c-org/whitepaper)
### 1.2. Быстро про блокчейн
Транзакции в модели учетной записи - это блоки кода, которые вызывают функции контрактов учетных записей в сети, они выполняют произвольные действия и считывают данные. **Транзакции должны быть криптографически подписаны пользователем** - это единственный способ инициировать любые изменения состояния в учетной записи. Код, хранящийся в учетной записи, может вызывать код других учетных записей, но этот вызов должен быть инициирован транзакцией, отправленной пользователем. Это вся магия.
Базовый примитив(абстракция на основе которой все строится) - инстанция контракта учетной записи, ее обычно называют **токен или ресурс или идентити(resource/token/identity).** Все это название уникальной сущности, описывающей атрибуты(данные) и функции объекта реального мира(по науке: сущность репрезентующая владельца бизнес-процесса).
📍**САМОЕ ВАЖНОЕ:** Есть два типа учетных записей - взаимозаменяемые(**FT**) и не-взаимозаменяемые(**NFT**), второй тип это вырожденный случай первого, вырожденность заключается в максимальном количестве минтинга = 1.
Минимальный набор атрибутов и функций **FT** токена описывает стандарт [ERC20](https://eips.ethereum.org/EIPS/eip-20)
Минимальный набор атрибутов и функций **NFT** токена описывает стандарт [ERC721](https://eips.ethereum.org/EIPS/eip-721)
**PS** Важно принимать во внимание дикую производительность виртуальных машин - текущая версия evm1 дает > 300к tps, замеры предыдущей команды L2 давали 17m tps на контракте обмена без проверки подписей. У нас будет ± 1m tps.
### 1.3. Контракты
- [ ] ==1== **NFT** токен DAO(👨👨👦👦 ) - репрезентует коллектив, те любую группу лиц принимающих согласованное решение по заранее определенным правилам: компания, колхоз, банда -> пох -> все это одно и тоже.
- [ ] ==2== **NFT** токен человека(👨💻) - инвестор он или стартапер или вообще левый перец -> пох -> все это одно и тоже.
- [ ] ==3== **NFT** токен голосования(📈) - репрезентует этапы голосования, например ишьюс в гитхабе.
- [ ] ==4== **FT** токен акции DAO(📄) - репрезентует силу голоса при голосовании по любому вопросу в DAO(у кого больше акций = у того сильнее голос).
- [ ] ==5== **FT** токен долларов(💵) - репрезентует фиатные деньги(доллар выбран для большей конверсии этой доки среди ее читателей).
> **PS** Для снижение сложности на старте я умолчал про токены валидаторов(держателей белых/черных списков) - на данном этапе этим можно принебречь
### 1.4. Процессы
В проекте DAO.vc нам нужно минтить токены при достижении предикатов(заранее заданных условий).
В данном проекте мы оперируем следующими токенами:
#### 1.4.1. Модель взаимодействия при регистрации пользователя
предикат минтинга **NFT(👨💻)** = NULL(будет федеративная авторизация в фейсбуке, но не сейчас)
По русски говоря минтим всем кто просит
#### 1.4.2. Модель взаимодействия при краудфандинге(продаже акций за деньги)
предикат минтинга **FT(📄)** фабрикой **NFT(👨👨👦👦 )**:
1. перевод права собственности на **FT(💵)** любым **NFT(👨💻)** в сумме > 10000(в крипте только целые числа - те $100.00 это 10000 токенов).
пользователь вызывает две функции:
```
1. FT(💵)->allowance(to: NFT(👨👨👦👦), vol:x)
2. NFT(👨👨👦👦)->mint_shares()
```
#### 1.4.3. Модель взаимодействия при голосовании
> Процесс принятия решений через голосования разобран на атомы в моей ноте [l2/dao](https://hackmd.io/eSNoPZCXTC-ZbMmHRn99HQ)
Голосование - это (**A**)выпуск токена голосования и (**B**)прием голосов от акционеров с разными атрибутами перевода и (**C**) смена состояния токена голосования.
**A.** предикат минтинга **NFT(📈)** фабрикой **NFT(👨👨👦👦 )**:
* перевод права перевода токена **FT(📄)** любым **NFT(👨💻)** в адрес **NFT(👨👨👦👦 )**
пользователь вызывает:
```
1. FT(📄)->allowance(to: NFT(👨👨👦👦), vol:x)
2. NFT(👨👨👦👦)->mint_vote(vote_options:[1,2,3,4])
```
**B.** предикат голосования **NFT(📈)**:
* перевод права перевода токена **FT(📄)** любым **NFT(👨💻)** в адрес **NFT(📈)**.
пользователь вызывает:
```
1. FT(📄)->allowance(to: NFT(📈), vol:x)
2. NFT(📈)->vote(vote_options:[1,2,3,4])
```
**C.** предикат смены состояния **NFT(📈)**:
* достижении блока >=X и/или суммы любого из инкрементов накопителя голосования >=Y
пользователь вызывает:
```
1. NFT(📈)->change_state()
```
#### 1.4.4. Модель взаимодействия KYC/AML
**TBA** - тут нужно офф-чейн хранилище IPFS
**PS** Как можно заметить почти все интерактивные процессы в системе - вызов одной или нескольких функций разных токенов, не сложно догадатся, что все неинтерактивные процессы - это считывание атрибутов токенов.
### 1.5. GUI Интерфейсы
- [ ] ==1== Онборардинг пользователя(рега) -> (1)Деплой контракта учетной записи через вызов фабрики пользователей корневой DAO(NFT токена DAO.vc).
- [ ] ==2,3,4,5,6,7== Дашбоард учетной записи(личный кабинет) -> (2)KYC/AML любой учетной записи, (3)Пополнение счета любой учетной записи, (4)Отображение текущих голосований (5)запуск нового голосования (6)голосование (7)смена состояния голосования.
- [ ] ==8,9== Карточка учетной записи стартапа -> (8)Отображение атрибутов учетной записи стартапа(неавторизованный доступ), (9)Покупка токенов акций
#### 1.5.1. Доноры интерфейсов
Импортирование интерфейсов с farmint.co
* Онбоардинг => https://matcha.xyz/
* KYC/AML => https://invest.fairmint.co/home
* Дашборд учетной записи => https://invest.fairmint.co/home
* Карточка учетной записи стартапа => https://invest.fairmint.co/offering-summary
* Голосование => **TBA**
## 2. Decentralized Identity(DID)
> 📍 DID, IPFS, 3BOX требуют разработки на фронте и расширении - эти пункты не опробованны мной
DID это стандартизированный способ идентифицировать себя
DID это URI:
> `did:dao:5DhxCaKjtptz7S4GxMEriqkUeFTtjVmm2R4HJwQcPv4mLvsP`
URI от [AWS](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html):
> `arn:aws:iam::123456789012:user/Development/product_1234/*`
DID => JWT:
> JS для использования DID в токенах авторизации: [DID-JWT](https://github.com/decentralized-identity/did-jwt)
## 3. Офф-чейн данные IPFS, 3BOX
Нетранзакционные данные(например фотографии документов) нужно хранить вне цепочки, для этого созданна IPFS
IPFS это хранилище структурированных данных с абсолютной адресацией:
> `ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/wiki/Vincent_van_Gogh.html`
IPFS это сериализация/десериализация + транспорт(libp2p)
Подробнее про установку и использование IPFS: https://docs.ipfs.io/
Одноранговая БД над IPFS => [orbit-db](https://github.com/orbitdb/orbit-db)
Для совсем ленивых 3box - готовая библиотека по работе с профилями и p2p чатом [3box-js](https://github.com/3box/3box-js) [3BOX/Docs](https://docs.3box.io/)
## 4. Введение в Substrate & Polkadot
> Почему не Ethereum? => Для игр с голосованием нужны бесплатные транзакции, нам нужен WASM, нам нужен перенос токенов из других сетей, нам нужен позитивный пример. Все это нужно чтоб не сделать еще один keyless.
[Substrate](https://substrate.dev/) - фреймворк для написания блокчейнов, включенных в [Polkadot](https://polkadot.network/)
**Для начала установить кошелек в [Chrome](https://chrome.google.com/webstore/detail/polkadot%7Bjs%7D-extension/mopnmbcafieddcagagdcbnhejhlodfdd?hl=en)**
У них есть отличный дашборд: https://polkadot.js.org/apps/#/explorer
Для него есть хорошая документация [polkadot-js](https://polkadot.js.org/)
У польки есть кошелек: https://github.com/polkadot-js/extension
У субстрата есть кошелек: https://github.com/paritytech/substrate-light-ui
У субстрата есть туториал по запуску и расширению фронта для своей ноды: [substrate.dev/docs/en/tutorials/create-your-first-substrate-chain/interact](https://substrate.dev/docs/en/tutorials/create-your-first-substrate-chain/interact)
У субстрата есть полная документация, включающая в том числе и фронт https://substrate.dev/recipes/
Пример онбоардинга и выпуска токена проекта схожего с нами, использующего did: https://tokenstudio.polymesh.live/
**PS.** Важно осознать - мы стартуем с одной сети, как добьемся функционирования 1.3 и 1.5 => добавляем в токен доллара функционал переноса состояния между цепочками для импорта ликвидны токенов из A. ethereum, B. bitcoin C. фиатного процессинга. Для переноса состояний потребуется кошелек L2 и L2-VM в браузере пользователя - опыт который наработаем на этом проекте оч потребуется для l2.app(я надеюсь получить компактный wasm рантайм для замены текущей версии L2-VM).
## 5. Контейнерная среда разработки
Смысл: директория с кодом на хосте, в контенере все остально что нужно для разработки и компиляции + ide
1. В качестве основы предлагаю взять готовые контейнеры с средой на базе браузерной IDE: https://github.com/theia-ide/theia-apps
2. В них-же предлагаю прокинуть vs-code: https://code.visualstudio.com/docs/remote/remote-overview
3. Не понятно что с веб-сервером, но если нужен пример: https://github.com/keylessone/oxa-web
```dockerfile=
FROM node as build-deps
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
COPY . ./
RUN npm run build
FROM nginx
RUN rm -rf /etc/nginx/conf.d
COPY nginx /etc/nginx
COPY --from=build-deps /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
```
:closed_book: Задачи
--
- [ ] ==5== Собрать контейнерную среду разработки(я ужасный девопс)
- [ ] ==2,3,4== Завести DID от 3BOX + IPFS + Substrate через расширение(еще не менял интерфейс ноды)
- [ ] ==1.3== Разработка контрактов и RPC к ним
- [ ] ==1.5== Разработка GUI интерфейсов