2015-05-31

GitTorrent для доступа к Git-репозиториям при помощи BitTorrent

Несмотря на децентрализованный характер Git, для первичного получения исходных текстов требуется сервер, занимающийся отдачей кода. Например, блокирование доступа или сбой в работе GitHub перекроет возможность загрузить код и вынудит искать зеркала, несмотря на то, что данный код может присутствовать в локальных git-репозиториях сотен и тысяч разработчиков. Крис Болл (Chris Ball), долгое время занимавший пост главного инженера проекта One Laptop Per Child, предложил использовать технологии BitTorrent для решения данной проблемы. Кроме общей концепции Крис подготовил и опубликовал под лицензией MIT прототип дополнения для git с реализаций транспорта, загружающего данные через BitTorrent, а также специальный демон, отдающий содержимое локального git-репозитория через BitTorrent.

Идея проекта достаточно проста - по аналогии, как BitTorrent позволяет сформировать распределённую сеть для хранения файлов, GitTorrent даёт возможность сформировать распределённую сеть для содержимого Git-репозиториев, отключение отдельных участников в которой не скажется на доступности данных, за счёт наличия в отдаче реплицированных копий. Для определения отдающих искомый репозиторий узлов и узла для отправки коммитов применяется DHT (распределённая хеш-таблица). Организованное при помощи DHT хранилище в формате ключ/значение используется как система для определения профиля пользователя и информации о том, какие у него имеются репозитории и свежие git-хэши изменений.

Начальное согласование соединения производится при помощи специального расширения BitTorrent. При обращении к узлу, на котором установлено данное расширение, создаётся специальный архив, включающий запрошенные git-объекты. На основании SHA1-хэша данного архива начинается его загрузка с использованием обычного BitTorrent и задействованием распараллеливания по сидам, которые имеют в раздаче аналогичный набор git-объектов. После загрузки и распаковки архива производится проверка подлинности git-объектов через верификацию цепочки коммитов в репозитории.

Вместо прямого обращения к GitHub по SSH пользователь может выполнить "git clone gittorrent://github.com/someuser/somerepo" и загрузить репозиторий от участвующих в его раздаче узлов при помощи BitTorrent. В случае использования имени хоста с репозиторием (github.com/someuser/somerepo) будет отправлен запрос к github.com и получен хэш последнего коммита в репозитории. После этого через распределённую хэш-таблицу будут выявлены узлы, которые содержат данный коммит. Затем, соединившись с одним из таких узлов и запросив у него список необходимых файлов, будет сформирован архив с нужными коммитами и передан его хэш, на основании которого начнётся загрузка при помощи штатного BitTorrent.

Стадию обращения к GitHub для получения данных о коммитах можно исключить, указав при обращении SHA1-хэш владельца репозитория. Так как метод использования хэшей не слишком удобен, предусмотрена возможность регистрации читаемых имён, используя методы, применяемые для регистрации имён пользователей в Bitcoin. Для прямой отдачи своего репозитория через BitTorrent достаточно запустить gittorrentd. Возможно совершение не только операций fetch и clone, но и внесение изменений через операцию push. Синхронизация полученных коммитов между участвующими в раздаче узлами производится через отправку архивов с необходимыми git-объектами при помощи специального расширения протокола BitTorrent.


source1
source2

Комментариев нет:

Отправить комментарий