А не попытаться ли...
Apr. 4th, 2017 03:52 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
... Оживить проект cheshirenet?
Три года назад как-то ни у кого не возникло желания поучаствовать в проекте. Потрепались, обсудили почти согласовали протокол, и успокоились на этом.
Вдруг сейчас, поскольку потребность в системе коммуникации, устойчивой ко всяким стихинйным бедствиям, включая злонамеренные действия людей, растет, у кого-то появится желание поучастововать.
Базовых идей в cheshirenet было три
1. Оффлайновый веб - то есть каждое устройство несет в себе копию интеренсного владелцу контента, внутренне провязанную гиперссылками, и по возможности синхронизирует ее с другими копиями - можно через интернет, можно через ad-hoc wi-fi между двумя мобильными устройствами и вообще как угодно.
2. Полный контроль каждого пользователя за принадлежащим ему узлом. Что хочет хранит и передает дальше, что хочет - не передает. Весь контент подписан, чтобы исключить его искажение на промежуточных узлах.
3. Ключ подписи представляет только самого себя. Т.е. сгенерировав новый ключ подписи, пользователь создает новую сетевую "личность", псевдоним. Никнеймы пользователи себе не придумывают, они алгоритмически выводятся из открытого ключа. (но сгенерированное имя вам не понравилось, вы можете сгенерировать себе другой ключ подписи).
Про сетевую личность известен только массив контента, подписанный этим ключом. (можно и рекомендуется иметь "двойника" - альтернативный пароль, при вводе которого в ваш узел чеширнета возникает другая сетевая идентичность, ни в чем кроме постинга фоточек котиков не замеченная).
Три года назад как-то ни у кого не возникло желания поучаствовать в проекте. Потрепались, обсудили почти согласовали протокол, и успокоились на этом.
Вдруг сейчас, поскольку потребность в системе коммуникации, устойчивой ко всяким стихинйным бедствиям, включая злонамеренные действия людей, растет, у кого-то появится желание поучастововать.
Базовых идей в cheshirenet было три
1. Оффлайновый веб - то есть каждое устройство несет в себе копию интеренсного владелцу контента, внутренне провязанную гиперссылками, и по возможности синхронизирует ее с другими копиями - можно через интернет, можно через ad-hoc wi-fi между двумя мобильными устройствами и вообще как угодно.
2. Полный контроль каждого пользователя за принадлежащим ему узлом. Что хочет хранит и передает дальше, что хочет - не передает. Весь контент подписан, чтобы исключить его искажение на промежуточных узлах.
3. Ключ подписи представляет только самого себя. Т.е. сгенерировав новый ключ подписи, пользователь создает новую сетевую "личность", псевдоним. Никнеймы пользователи себе не придумывают, они алгоритмически выводятся из открытого ключа. (но сгенерированное имя вам не понравилось, вы можете сгенерировать себе другой ключ подписи).
Про сетевую личность известен только массив контента, подписанный этим ключом. (можно и рекомендуется иметь "двойника" - альтернативный пароль, при вводе которого в ваш узел чеширнета возникает другая сетевая идентичность, ни в чем кроме постинга фоточек котиков не замеченная).
no subject
Date: 2017-04-05 12:40 pm (UTC)Я бы предложил использовать cheshire:article:$hash:$mime/$type для статей (постов), cheshire:reply:$articleHash:$hash:$mime/$type (hash -- sha256 от контента), для низкоуровневого хранилища sha256 от этих урлов (но это уже детали реализации)
Для файлов cheshire:fixed:$hashAlgo:$hash (например cheshire:fixed:sha256:hash-of-some-file)
(Хотя может имеет смысл завести свои mime types и не употреблять article и reply, возможно даже верхним объектом в mime должен быть машиночитаемый файл (json?) с подписями, cid "основного" контента, и какие-то еще важные вещи, типа ссылки на ключ автора, авторский выбор для рубрикатора, etc)
Узел должен иметь возможность запросить у хранилища (и другого узла разумеется) список child'ов статьи (плоский или рекурсивный -- вопрос открытый)
no subject
Date: 2017-04-05 12:44 pm (UTC)Нужно чтобы был какой-то формат, который будет позволять собрать multipart-message и назначить идентификаторы некоторым его частям.
Вообще-то я собираюсь TLV использовать, причем даже не ASN.1, хотя формат поля длины имеет смысл брать именно оттуда.
no subject
Date: 2017-04-05 01:01 pm (UTC)Я вообще не вижу, зачем там бинарные форматы где-то кроме криптографии (где лучше взять что-то максимально готовое)
Собственно предложеную мной репликой выше конструкцию можно вообще собрать на стандартной библиотеке питона (email.MimeParser, json, hashlib, что нибудь для парсинга html и переписывания урлов в нем, и все в общем-то) или любого другого языка.
no subject
Date: 2017-04-05 01:13 pm (UTC)А оставшаяся часть все равно должна быть подписана. Поэтому криптография там везде.
TLV на питоне реализовать - это будет гораздо меньше кода, чем MIME. У меня в свое время 70 строк получилось.
no subject
Date: 2017-04-05 01:45 pm (UTC)Аналог есть в 99% современных языков в стандартной библиотеке.
MIME на питоне УЖЕ написан. Предлагаю им пользоваться где надо, и не пользоваться где не надо.
(то есть сделать поддержку опциональной). Для совсем первого прототипа сойдет и mime encoded html c css и юзерпиком внутри.
Предлагаю сделать максимально просто и тупо, из готовых кусков -- когда у нас будет 2-3 реализации на разных языках, мы сможем потестировать их совместимость и основные грабли. Сможем пощупать простейшую синхронизацию по http. Будет понятно, стоит ли оно выделки.
no subject
Date: 2017-04-05 02:05 pm (UTC)ну и задача канонизации json-представления (чтобы после десериализации-сериализации хэш сошелся) тоже та еще.
Кстати S к S/MIME вот-та-а-а-кенными гвоздями прибито и то все время оторваться норовит. У всех текстовых форматов огромные проблемы с электронной подписью.
Почему-то вы из всех имеющихся в доступе готовых кусоков всегда выбираете наиименее подходящий и наиболее кривой.
TLV - это тоже готовый кусок. Применяется в куче мест, например, в сотовой телефонии и Smart Card API.
Нужно просто расширять свою эрудицию. Простой и тривиальный ASN.1 ему боль, а git - не боль.
no subject
Date: 2017-04-05 02:34 pm (UTC)Блобы оставить блобами в виде fixed хешей, пусть будут видны по http прямо из хранилища.
Зачем сериализовывать обратно десериализованое?
я json вспомнил исключительно на случай если мы хотим внутрь положить какие-то хорошо структурированые метаданные.
Впрочем десяток килобайт текста с разметкой я тоже не думая сунул бы json.
Если хочется чтобы сериализовалось -- aterm сериализуется обратно с удалением незначащих пробелов.
Я когда-то имел дело с ip телефонией, и ASN.1 в частности, втч с кишками парсеров, и спецификациями под мегабайт.
Так что с эрудицией касательно этого у меня все ок, просто хочу чтобы это конкретное изделие ITU-T похоронили.
Но я готов обсудить вариант с TLV, и посмотреть на вашу (и другие) реализации, вдруг это так же просто и удобно как json и/или mime.
no subject
Date: 2017-04-05 03:04 pm (UTC)Поэтому сообщения должны быть самодостаточны, и если ссылаться на другие объекты, то только на сообщения обладающие всеми свойствами сообщения (т.е. embedded метаинформацией и электронной подписью автора).
MIME - Это жутко неудобно. Постоянные проблемы с тем как терминируются строки в разных операционных системах и прочие вопросы канонической сериализации, необходимой при вычислении хэша. А хэш у нас не только электронная подпись. но и идентификатор документа.
Опять же, необходимость работать с объектами, длина которых превосходит 232байтов в сочетании с тем, что длина большинства объектов менее 216, а длина большинства полей - меньше 27.
У меня была идея испоьзовать в качестве поля длины не BER-длину а utf-8. Т.е. считать что поля тэга и длины представляют собой UTF-8 символы. Но текущий стандарт UTF-8 поддерживает только коды от 0 до 231. Для размера видео в байтах этого мало. Вот 36 бит, пожалуй бы хватило. Но 7-байтовые последовательнности, начинающиеся с 0xFE валидным utf-8 не являются. И ядро питона их обрабатывать не будет. Вообще максимальный символ юникода, с которым у меня питон справился это
0x0010ffff. Поэтому придется все-таки длину брать как в BER.
no subject
Date: 2017-04-05 08:17 pm (UTC)no subject
Date: 2017-04-05 08:51 pm (UTC)На этапе раннего прототипа я бы считал что мы можем показать все хранилище на FS через http, или дать rest api к нему (идеальным я бы считал прямой RO доступ, и RW чере апи)
Случаи когда есть только двунаправленый линк без http (или даже tcp) я бы рассматривал отдельно. Возможно там имеет смысл гонять бандлы (которые вообще transport agnostic)
Синхронизатор должен уметь работать с двумя хранилищами (либо на fs/fs+http, либо через апи). Потом можно будет добавить и свой протокол (для тех кому хочется/надо), и бандлы.
storage (формат) + синхронизатор + генератор статики по сообщениям базы + что-то динамически работающее с базой (просмотр/ответы) -- это уже тянет на MVP, особенно если есть хотя бы две реализации хранилища на разных языках.
Вот по моему -- 1 файл на сообщение -- это тоже самоцель, во первых мы теряем возможность (дешевой) дедупликации аттачей/медиаконтента. 50 человек решат сделать пост с гигабайтным видео с котиком, и мы имеем 50 гиг трафика на ровном месте.
И 50гиг на хранилищах у всех в эпсилон окрестности. (дедупликация на том же zfs -- это очень дорого по CPU и памяти, ОЧЕНЬ, я пробовал этот кактус на вкус)
во вторых -- мы теряем возможность протаскивать важное и актуальное через узкие линки -- если у нас упал терабитный спутниковый канал, и есть только модем лександ на 1200 бод, у нас поедут только тексты и метаданные. А видео с котиками приедут через неделю, когда прилетит новый спутник.
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2017-04-05 02:25 pm (UTC)Хэш-алгоритм однажды придётся поменять, поэтому название алгоритма разумно указать в ссылке. Далее, может быть полезно иметь возможность указать несколько хешей сразу. Ну и если хешей несколько, то пригодится всегда указывать и самую простую "хеш-сумму" - размер объекта.
Даже стандарт похожий есть: https://ru.wikipedia.org/wiki/Magnet-ссылка
no subject
Date: 2017-04-05 02:33 pm (UTC)Скорее наоборот, может быть стоит заложиться на то, чтобы избежать необходимости его смены при появлении эффективного генератора коллизий.
А то у нас слишком много на завязано на этот хэш - и content addressable storage, и электронная подпись всех документов и алгоритм генерации никнеймов из открытого ключа.
no subject
Date: 2017-04-05 08:03 pm (UTC)no subject
Date: 2017-04-06 04:55 am (UTC)no subject
Date: 2017-04-06 08:28 pm (UTC)no subject
Date: 2017-04-07 04:10 am (UTC)no subject
Date: 2017-04-05 08:19 pm (UTC)Я хочу свой никнейм, а не abracadabra.generated.
То есть он может быть, а может быть и well known псевдоним, или реальное паспортное имя -- как угодно держателю ключа.
no subject
Date: 2017-04-05 08:33 pm (UTC)no subject
Date: 2017-04-05 08:45 pm (UTC)no subject
Date: 2017-04-05 08:55 pm (UTC)А вот бложек посвященный программировнию на б-жественном хаскеле, я всячески буду увязывать с собой паспортным и своим линкедин профилем, потому что хочу таки наняццо писать на хаскеле (ну или пилить nixos за деньги)
no subject
Date: 2017-04-05 09:09 pm (UTC)В Москве, Дамаске и Тегеране - нет.
no subject
Date: 2017-04-05 09:26 pm (UTC)Такие дела.
no subject
Date: 2017-04-06 04:52 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2017-04-05 09:11 pm (UTC)no subject
Date: 2017-04-05 02:43 pm (UTC)base32(sha256(f)) по моему достаточно, но в принципе ничто не мешает включить его (хеш) и в строку (для fixed файлов это и так предлагается сделать)