- Предыстория/Обсуждения
- Спецификации
- Истории
- Журнал
- 06/02/2022 что же делать
- 30/03/2022 rails new book, чтобы уже можно было потрогать
- 31/03/2022 chain?, начало документации, OpenPHP.js, тоториал
- 01/04/2022 проект сходу по туториалу
- 04/04/2022 настройка slim, devise, webpacker
- 06/04/2022 обновление Ruby, боремся с devise
- 07/04/2022 User creates Records
- 08/04/2022 что нового в Rails 7, JavaScript frameworks
- 09/04/2022 продолжение туториала, сам OpenPGP.js
- 11/04/2022 OpenPGP.js работает, Heroku; размышления по тестам и документации
- 29/04/2022 RoR on Termux
- 08/06/2022 терминология, примеры голосований
- 21/06/2022 потеря данных?
- 08/09/2022 довести до приличного вида
- 10/09/2022 hotwire?
- 07/10/2022 tailwindcss? cucumber!
- Devise+Turbo
- Use TailwindCSS
- Features/Specs
- Feature: Voting
- Feature: Sign record
- Tasks
- 30/04/2022 формулирование
- 01/05/2022 как идентифицировать пользователя, совместомость OpenPGP.js с GnuPG
- 02/05/2022 кнопка Sign
- 03/05/2022 обновить формат Introduction
- 06/05/2022 обновление Introduction, отвлёк Yandex Autofill, User fingerprint
- 08/05/2022 record_controller.js
- 09/05/2022 created_at == дата записи
- 10/05/2022 signature_controller.rb
- 11/05/2022 подпись пишется в книгу
- 12/05/2022 обзор сделанного, GPGME
- 18/05/2022 GPGME или как проверять подпись?
- 19/05/2022 .
- 20/05/2022 OpenPGP.js on Node.js, verify
- 24/05/2022 Record self joins
- 31/05/2022 Signed users
- 06/06/2022 Signature validation
- 07/06/2022 Review, Deploy
- Feature: Introduction
Надо ответить на вопрос, в чём в целом заключается идея.
С самого начала, в процессе первых шагов пользовательской работы с блокчейном, возникла мысль, а что если использовать этот реестр для хранения идентификационных данных. Все инструменты уже на готове. Шифрование с открытым ключём, сам открытый ключ, подписи. А потом возникла мысль, что если будут идентификационные данные, то можно и голосование провести.
Суть примерно такая.
- Голосующий создаёт кошелёк.
- Публикует открытый ключ (или просто осуществляет любую транзакцию), чтобы иметь возможность ставить свою проверяемую подпись под транзакцями других участников.
- Публикует сведения подтверждающие личность: ФИО, номер паспорта, …
- Голосует отправкой соответствующего опросу кода на соответствующий поставленному вопросу кошелёк.
- По возможности ставит свою подпись транзакциям, свидетелем которых он является.
- Голос/данные идентификации засчитывается при 2+ свидетелей.
А не так давно, подумал, зачем вообще нужен блокчейн? Может быть можно подумать над альтернативными структурами распределённого реестра. С возможностями оффлайн записей, и последующей синхронизацией.
Кажется, в похожую сторону смотрят проекты:
Сам процесс голосования с такой системой будет потенциально не ограничен временными рамками, можно будет иметь возможность проверить наличие своего голоса в реестре, самостоятельно посчитать результаты, изменить свой голос, …
Становятя не нужны центризбиркомы и прочее, как места сбора голосов. Впрочем, если они пойдут навстречу, то лишним их ресурс не будет. А так, можно хоть мобильными бригадами, ходить и собирать голоса у всех желающих. Для безопасности можно это начинать делать среди друзей и друзей друзей. Одновременно разъясняя суть процесса и вопросов повестки.
По теории 6-ти рукопожатий таким образом должны все посчитаться. Велика вероятность (100%), что будут и проблемы, с ложными свидетельствами и прочее. Для чего предусмотреть протоколы проверок.
— А какие проблемы должен решить этот сервис?
Основная — подделка результатов голосования. Побочная — гегемония центральных СМИ.
Живой фидбэк.
— Какие решения предполагается принимать с его помощью?
Любые, насколько технически это возможно.
— И наконец, как предполагается, что эти решения будут обретать юридическую силу?
Статья 3 конституции, как законное основание. Что-же касается практического его применения, то думаю, что если сервис будет фунционировать как задумано, большой проблемы с принятием его среди органов власти быть не должно.
Вот сейчас довольно остро стоит вопрос с транзитом власти от системы Путина. И несмотря на то, что многие служащие презирают её, преодолеть не могут. Ведь он как бы на законных основаниях от имени народа говорит. И даже когда Владимира Владимировича физически не станет, вряд ли цивилизованно получится договориться в существующей системе вещей. Но даже если и получится, это не даёт гарантий того, что переродившаяся правящая верхушка не скатится в прежний авторитаризм.
Регистрируемое действие.
Дерево действий.
Регистрация → Пользователя
На локальной ноде, для упрощённой работы
Действие[/Поддействие[…]]/Страна/Регион/Район/Населённый пункт/Адрес/Год/Месяц/День/Время/
Итак, продолжаю мысль о no chain решении.
Можно создать набор утилит с разными системами хранения данных. Самое простое — файловая система. Каждый может сделать свой бэкап на бесплатном облаке, и даже расшарить его.
Три дня назад задумал проект Book на Ruby on Rails.
Кажется что надо начать с этого.
Если начинать совсем вручную, то непонятно как хранить действия.
Завис на вопросе, делать ли цепочку записей?
Порисовал. Не знаю, конечно, зачем, но можно. Вряд ли это сильно усложнит на первых порах систему.
Появилась мысль ограничиться документацией.
Скучно без кода.
С чего тогда начать? Поковырять OpenPGP.js?
Видимо да.
Можно пройтись по туториалу https://medium.com/@nerdgeschoss/end-to-end-encryptionin-rails-with-stimulus-and-openpgp-js-444bafc9121e
Тупо конспектировать дальше туториал нет смысла. Надо кодить.
Можно делать это в отдельной ветке проекта, и возможно развивать это дальше.
Создал проект и задачу в гитхабе, на основе сделал ветку. Но прежде надо видимо подключить RSpec.
И Slim
И Devise с Webpacker-ом.
Вроде всё. Вернуться к статье.
Блин, крашится rspec.
Даже в мастере.
Ага, после того как настроили Devise.
Смотрим home_spec.
Devise тут не при чём. Просто крашится непонятно почему.
Обновил Ruby до 3.1.1 :)
Продолжаю добавлять пользователя.
Совершенствую среду разработки. ruby layer lsp.
Сделал. Споткнулся на:
undefined method `authenticate_user!’ for #UsersController:0x0000000000be00
Непонятно что делать.
Попробовать сначала.
Ниче не работает :/
Нашёл где собака порылась) Ошибка в статье, походу.
Вместо rails g devise:install User
должно быть rails g devise User
.
Хотя, может быть если не устанавливать до этого devise, то такая команда и сработвет.
Наконец-то добавляются пользователи и ключи к ним.
Можно завершать Issue?
Да. Только пока не отправлюсь в свободное плавание после туториала тесты писать не хочется.
Добавляются записи.
OpenPGP.js!
Походу в Rails 7 надо использовать что-то отличное от Webpacker, а его самого удалить.
Посмотреть Rails 7: The Demo.
Круто!
Для добавления OpenPGP.js просто воспользуемся importmap.
А вот для использования, видимо надо сначала вникнуть в Stimulus, и как вообще делать JavaScript на Rails 7.
https://world.hey.com/dhh/rails-7-will-have-three-great-answers-to-javascript-in-2021-8d68191b
Всю статью конспектировать не стал.
Дошёл до видоса Alpha preview: Modern JavaScript in Rails 7 without Webpack (https://www.youtube.com/watch?v=PtxZvFnL2i0)
Довольно доходчиво наглядно показываются крутые возможности последней рельсы.
Надо возвращаться к туториалу.
Можно даже конспектировать, чтобы не пропустить непонятное чего.
Продолжить.
Вопрос, что делать с ключами. Как их хранить и какие рекомендации давать пользователям для их резервного копирования?
Определённо сейчас ясно, что использование мнемонических seed фраз, во первых будет не тривиально реализовать для PGP, во вторых есть сомнения в собственно их безопасности.
Ладно, пока это отложим.
Так, как пользоваться OpenPGP.js понятно, всё работает.
Теперь надо пилить истории.
Заодно сразу отправил проект на heroku, чтобы можно было демку показать.
Посмотрел чем тестировать. Шибко нет смысла искать альтернативу RSpec.
А точнее Capybara.
С чего начать?
С документации.
https://blog.prototypr.io/software-documentation-types-and-best-practices-1726ca595c7f
Вот тут пробежаться бы хотя бы. Но лучше, конечно, конспект. Но потом.
Удалось завести проект на Android в Termux.
Так, большую таску закрыл. Что дальше?
Теперь нужно научиться голосовать.
Гуглил тему.
Беспокоит один вопрос фоном довольно давно. А что если что-то потеряется? Ну какая-нибудь запись. И кажется, будто если все эти данные находятся не в цепочке, то обнаружить это будет сложнее. Ситуация усугубляется отсутствием централизованного хранилища в архитектуре по замыслу.
Ничто не мешает делать бекапы в централизованных хранилищах распределённо.
Да, всё ок.
Что-то нужно сделать прежде чем заканчивать возможность голосования?
CSS, Dialogs/Modals, TDD, Hotwire?
Да, это всё, пожалуй.
Залип на роликах на YouTube. В основном по Hotwire тематике.
Думал с чего начать. Сначала хотел TailwindCSS. Но, возможно, есть смысл взяться за тесты.
По идее разницы никакой с чего именно.
Как-то не тянет сейчас заниматься фронтом.
- [X] Turbo Handbook
- [X] https://eagerworks.com/blog/devise-with-hotwire-utilizing-a-modal
Прежде чем что-то кодить надо пройтись по Turbo Handbook.
О, нашёл хорошую статью по теме: https://eagerworks.com/blog/devise-with-hotwire-utilizing-a-modal
Handbook!
Можно сказать, что прочитал handbook.
Теперь что там с интеграцией с Devise-ом.
Поправил поведение в соответствии со статьёй. Всё ок теперь.
- [X] Setup
- [X] tailwindcss-rails
- [X] TW-Elements? No!
- [X] Rewrite UI?
- [X] Fix forms layout
Уже успел побаловаться до этого, но не хочется в один коммит пихать всякую экспериментальную дичь. Надо хотя бы разделить по смыслу.
Так что git reset –hard и заново.
Setup
Чёт, tw-elements не хочет с полпинка заходить. Фтопку…
Если только исходники ковырять, и что-то заимствовать.
Начал пробовать править css применением стилей tailwind.
Сегодня (уже вчера) обнаружил, что нажимая на кнопку Log in в конец html добавляется сообщение от Devise. Причём не то, которое должно там быть по идее. А именно, что email не тот.
И вот, стал смотреть не проихошло ли это после добавления tailwindcss, что было бы странно, но всё же. И нет. Эта ошибка была и ранее.
И, по всей видимости, нужен какой-то хак для того чтобы заставить работать эту комбинацию (Rails+Devise+Turbo) как следует.
Вынесу в отдельную задачу.
А что сейчас?
Поправил внешний вид формочек. Думаю достаточно.
- [X] Погружение
- [-] Cucumber
- [X] bundle cucumber-rails
- [X] setup cucumber
- [X] javascript driver
- [X] first steps
- [X] user/registration.feature
- [X] opens the book
- [X] signs
- [X] fix: The action ‘show’ could not be found for UsersController
- [-] user/key_management.feature
- [X] I am logged in
- [X] Scenario: user creates key pair
- [ ] Scenario: user adds his own private key
- [X] SimpleCov
- [ ] Unit tests
Решил посмотреть что там по тестам у Diaspora. И захотелось Cucumber BDD.
Набросал основные настройки и первые шаги для тестов.
fix: The action ‘show’ could not be found for UsersController
Странно, что отличается поведение в test и development средах.
Надо проследить последовательности запросов в обеих.
Надо покрыть feature тестами всё.
Или не всё?
Вот дошёл до места где уже надо пилить модалку для ввода пароля.
Но! Вот столько времени искал как это сделать по-современному, и всё зря.
Лучше обходиться без модалок.
Всё-равно надо разделить интерфейс для этих двух сценариев.
Решил что лучше разделить с помощью табов.
А как сделать табы, подключать tailwindcss или нет?
Есть https://tailwind-elements.com/. Вроде этого должно быть достаточно для того чтобы относительно нормально оформить фронт.
Если чего-то будет нехватать, TailwindCSS классы всё-равно можно будет использовать вместо чистых стилей. Должно быть быстрее.
И https://tailwindtemplates.io/templates?category=tab.
- [X] Пропись задумки механики
- [X] Nav
- [ ] Form
Что-то не зафиксировал никакого результата. Помню про голосование в википедии. Там была табличка проведённых голосований.
Дата начала, дата итога, организаторы, тема, статус, коммантарий.
Может поэкспериментировать теперь набросками? Сразу как-то сложно всё предусмотреть. Начать с формы, …
Сначала немного подумать над процессом.
Создаётся запись темы.
Чтобы отдать голос за то или иное решение создаётся запись голоса.
Можно сделать кнопку создания голоса, как кнопку подписать.
Для верификации голоса ставится подпись.
Варианты ответов голосования?
Для просто посмотреть на внешний вид YAML:
--- тип: голосование ветка: варианты: - | aasdf asdfwer asdfawer - b - c что-нибудь ещё: okokoko
Что тогда?
nav.
Form.
Не понимаю, надо ли ещё что-то кроме топика?
Значит пока только топик.
Ничего не нравится, иду в журнал.
- [-] Если у пользователя сохранён приватный ключ, он может подписать им запись.
- [-] views
- [-] home/index
- [-] Sign button
- [X] sign_record_path
- [ ] Enabled/Disabled ~ Private Key
- [-] Sign button
- [-] home/index
- [X] fingerprint
- [X] Идентификатор записи
- [X] Хэш? 01/05/2022 19:35
- [X] record_controller.js
- [X] records/signature_controller
- [X] связать signature и record в базе
- [X] GPGME: отказаться
- [X] Read the docs
- [X] OpenPGP.js on Node.js
- [X] verify
- [X] модель
- [X] прежде чем связывать запись с подписью проверить подпись
- [X] GPGME: отказаться
- [X] отображение подписавшихся пользователей
- [ ] автоматическая подпись, в Introduction, во фронте
- [-] views
- [X] Profile
- [X] Generate fingerprint along with keys
- [X] Customize username and passphrase
- [X] User table: fingerprint
- [X] Update keys saves fingerprint
- [X] Introduction
- [X] record includes datetime
- [X] public key
- [X] fingerprint
Если у пользователя сохранён приватный ключ, он может подписать им запись.
Сначала кнопку.
Для добавления подписей в записи, нужен идентификатор записей.
Можно использовать хэш от [ pgp fingerprint, даты, контента, ].
Но для этого это всё уже должно быть в Record.
Для secure pgp fingerprint прочитать: https://mshelton.medium.com/how-to-lose-friends-and-anger-journalists-with-pgp-b5b6d078a315
А не.
Походу это просто научпоп статья.
Что завис? Смотрел что за ключи генерирует OpenPGP.js, и насколько они совместимы с KGPG.
Вроде всё ок. Можно пользоваться.
Что делать дальше?
Для начала, зафиксировать уже сделанные изменения.
А теперь?
Нужно определиться со структурой данных.
Или опять набросать.
Набросать конечно.
Сейчас нажимая на кнопку Sign, видно только success notice.
Чего бы хотелось добавить?
Прежде всего хотелось бы, чтобы добавленная запись уже была подписана автором.
И подписывать надо не только запись, но и дату. Хотя дату можно добавлять и в запись.
То есть, доделать сначала Introduction.
Подпись ставить следующей записью?
Давай думай!
Представление должно включать поле fingerprint.
Или сразу открытый ключ?
И то и другое.
Странно что в Ruby нет PGP… ну практически. upd: GPGME
Работа над профилем. Пробую сделать так, чтобы не мешал Yandex Autofill.
До конца не исправить во всех местах косяки. Забить.
User table: fingerprint
Introduction
Вот блин. А подпись то в Ruby никак не поставить. Значит автоматически это пока невозможно. upd: в бакэнде вообще подпись не поставить, ключ у клиента
Закоммитить промежуточные изменения, но сначала обновить документацию.
Для этого зарегаться шаблонным пользователем.
Ну что, теперь подпись!
Но здесь начинать надо не с Ruby, а с JavaScript.
record_controller.js upd: странное название, лучше signature_controller.js
А теперь в контроллер.
Зачем мне там надо было sha3?
А, это ссылка на запись.
А что если таких записей будет несколько? Добавить дату записи.
Где завис? А, дату одинаковую сделать надо записи. В content и created_at.
Блин, псих. Зачем? В прототипе то…
Ну надо было) Так. По джаваскрипту готово.
Теперь records_controller#sign.
Не. Надо создать records/signature_controller
Маршрут поменял. Завис на необходимости указывать id подписываемой записи.
А, указывать можно, но отправлять через параметры, а не строку запроса.
Прежде чем связывать в базе записи с подписями, закоммитить.
А прежде потыкать что получилось.
Мысли по поводу удаления записей.
Если это не чейн, то можно. Проверяя ключ спецзапросом.
Резюмировать работу по дням.
Обнаружил GPGME, и похоже там можно работать.
Зачем мне это надо было? Для проверки подписей, и на основе этой проверки связывание подписей с записью.
И что делать? Добавлять это в прототип? Не обязательно. Но… Чтобы всё было по честному, надо. А то потом окажется, что надо пилить ещё свою pgp ruby библиотеку.
Промкоммит.
Походу, чтобы понять как проверить подпись в том виде в каком у меня есть, и желательно без использования keychain, надо читать документацию по GPGME.
Всё как-то мудрёно. Ну ладно. Попробовать на высоком уровне.
Походу там без привязки к системному gnupg вообще никак…
Не нравится, чёт…
Но похоже что без вариантов. Или если использовать OpenPGP.js через Node.js, как внешнее приложение.
Как использовать OpenPGP.js прямо из Ruby с ExecJS я так и не понял. Может быть и можно, даже. Но зачем?
Короче. OpenPGP.js на Node.js.
Наваял простой скрипт, подпись верифицирует.
Надо сделать так, чтобы на Heroku можно было запускать node из рельсы.
Можно воспользоваться советом из https://stackoverflow.com/questions/18694887/rails-heroku-how-to-install-javascript-dependences-that-needs-npm-install
А можно https://devcenter.heroku.com/changelog-items/2283.
В последнем говорится, что можно package.json добавить в корень проекта и всё.
Просто засунуть всё в корень?
Надо пожалуй сразу и использовать этот скриптик.
А нет, забыл. Это несколько подзадач.
Дорабатываем модели, для ассоциаций записей с подписями.
Self joins?
Готово.
Вроде бы я проверил как это работает и всё ок.
Ага. Надо только добавить отображение пользователей, подписавших запись.
Так, какой-то рассинхрон в журнале. Похоже что я не сделал запись о последних изменениях.
Проверить.
Ага, проверка подписи последнее. И что делать в случае невалидной подписи.
Походу всё в коммитах уже.
Надо мержить. Дорабатывать до совершенства не хочется фичу, пусть будет в таком состоянии пока.
Надо только сделать ревью.
Поправить документацию.
A little more action: on public key change.
Не устанавливается npm на heroku :(
Помогла ссылка на стэковерфлоу выше.
heroku buildpacks:add --index 1 heroku/nodejs
Всё теперь работает как должно.
- [X] routes
- [X] records/introduction
- [X] new
- [X] create
- [X] records/introduction
- [X] views
- [X] home
- [X] index
- [X] nav introduction
- [X] introduction always active? yes
- [X] index
- [X] records/introduction
- [X] new
- [X] Fields
- [X] Name
- [X] Birthdate
- [X] Address
- [X] Fields
- [X] new
- [X] home
- [X] сontrollers
- [X] records/introduction
- [X] create
- [X] records/introduction
- [X] introduction format
- [X] YAML
- [X] keys
- [X] russian?
- [X] list
Истории.
Нет.
Не сейчас.
А сейчас, прототип. Прототип это не продукт, можно мусорить, и забыть о красоте.
Но! Хотя бы тесты может быть? Да ну, или?
Да, я похоже когда решил прототипировать, забыл, что нахожусь в соло проекте, и потом следовательно забыл что прототипирую всего лишь.
Поэтому увлёкся “чистотой”. Можно и побыстрее делать.
Но без историй всё-равно никуда. Хотя бы текстом.
Devise-User-Profile: https://dev.to/skrix/devise-user-profile-1f0h
На будущее. А пока чтобы совсем косячно не было при создании пары ключей.
Или ладно пока. Это не главное.
Сейчас главное определиться что дальше самое важное для прототипа сделать.
Вот! “Создание записи удостоверяющей личность”
Для этого нужны модели:
- Действие Action
- Страна
- Регион
- Район
- Населённый пункт
- Улица
Продолжить.
Когда и для чего нужен адрес?
Для верификации записей. Вводить можно на шаге представления.
Пока, пожалуй можно оформить как одно поле, чтобы не плодить моделей.
Так, для начала надо оформить желаемое в виде документации, чтобы было понятно что вообще делать.
Начать с формы или модели? С формы.
Но сначала привести в порядок текущее состояние.
Для перехода к форме Introduction использовать пока ссылку.
Routes
/records/introduction/index|new|create|show
Как-то так.
Пробежался по гайду по маршрутам.
Solargraph rocks!
Правда пока ещё далеко от того что хотелось бы в идеальном варианте. Типа автокомплит всего что только может быть в зависимости от контекста.
Как дела?
Пора записывать журнал по отдельной ветке на каждую таску.
Можно даже перенести часть настоящего журнала.
Да! Solargraph really rocks! Теперь можно переходить по определениям и знакомится с наследуемым кодом.
Итак, как всё-таки дела?
Ну примерно разложил по подзадачам, на основе кода.
Надо закончить форму.
Всё?
Допустим. Что дальше?
Дальше надо что-то делать с данными. Куда-то их девать.
Хороший вопрос.
Пока есть только таблица records
.
С одним смысловым полем content
.
По идее, я планировал именно туда и записывать все сообщения.
Вот, в формате YAML можно, отлично парсится даже по русски и читается легко.
Ну что? Не помещается в голове.
Тогда тут. А что сложного? Экспортируешь хэш как в примере, и всё?
То есть надо идти и писать контроллер.
Захардкодить названия.
Запись добавляется. Что можно сделать дальше?
Хватит.