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