---
# System prepended metadata

title: Планирование работ DAO
tags: [Collective, Meeting Note, DAO]

---

Планирование работ 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 интерфейсов

