Концепция интернета на магнитах состоит в том чтобы не зависеть от программного обеспечения, протокола или способа передачи данных. Не важно каким образом вы получаете файл имея магнит вы можете удостоверится что получили именно то что заказывали.
Для создания и обновления магнитного сайта с множеством страниц нам понадобится электронная подпись. Нужна она чтобы обозначить источник и связать между собой страницы сайта. Для её создания и использования можно воспользоваться пакетом GnuPG.
Переводим Fingerprint в base32:
Также нам понадобится публичный ключ.
Публичный ключ позволит идентифицировать единый источник и будет служить маячком для поиска обновлений.
Получаем магнит файла публичного ключа.
Напишем две странички сайта для теста. И подпишем их.
Первая:
Страница подписана командой:
Проверяем подпись командой:
Онлайн конвертер
Подпись теперь составляет одно целое с файлом.
Ссылка на вторую страницу выглядит так:
Так как первая страница сайта создаётся раньше второй мы не можем поместить в ссылку магнит на вторую. Поэтому используется ссылка на карту сайта с id ссылки на вторую страницу.
Имя файла карты сайта:
Все внутренние страницы сайта ссылаются на карту передавая в hash идентификатор той страницы на которую должен перенаправить map. Это позволит обновлять информацию на страницах без потери связности между ними. При обновлении будет меняться только карта сайта.
Карта подписывается и публикуется где угодно (p2p, web и т.д.).
Просмотр сайта осуществляется поиском наиболее свежего файла карты, проверкой подписи и далее уже можно качать непосредственно страницы сайта.
Магнит для теста
Прямая ссылка
После клика по ней будет загружена карта сайта. Откройте её и кликните на первую страницу. После этого сотрите в адресной строке часть до magnet:? и нажмите Enter. Ваш p2p клиент должен скачать первую страницу сайта и аналогично для остальных.
Это тестовый сайт. Есть множество способов упростить жизнь посетителю при помощи JavaScript и IFrame, чтобы автоматом открывался магнит если страницы нет на диске но это будет потом.
Файлы сайта больше не зависят от протокола передачи данных и могут передаваться хоть на флешках друг другу. Проблема торрентов в том что существует дополнительная сущность а именно торрент файл. Он может быть потерян в процессе обмена и имея файл мы можем не создать на него торрент с идентичным info хешем.
Сама HTML страница будет включать в себя торрент файл. Для этого достаточно вставить код страницы в комментарий торрента при создании. В конце комментария добавляем
Это ссылка на торрент файл и тег который скроет содержимое торрент файла.
К имени полученного торрента добавляем расширение htm
Это торрент файл который генерируется из содержимого магнет ссылки.
Нам понадобится:
Размер блока в микро торренте равен размеру файла если он больше 16384 байт. Тем самым sha1 хеш блока равен sha1 хешу файла.
Микро торрент из магнет ссылки можно сгенерировать при помощи JavaScript либо его может генерировать торрент клиент.
make_micro_torrent
Такое решение подходит для небольших файлов которыми обычно являются веб страницы.
Каждое сообщение в форуме это отдельная HTML страница в которой кроме сообщения и цитаты предыдущего должна быть комбинированная ссылка на предыдущее сообщение. А также подпись автора.
Имя файла сообщения:
msg_sha1_base32 это sha1 хеш файла сообщения на который отвечает автор
Если сообщение первое в ветке то часть to заменяется на title.
Также можно комментировать файлы:
Файлы сообщений просто выкладываются в общий доступ любым способом.
Интернет на магнитах 1 — Магнит
Интернет на магнитах 2 — Гипертекст
Интернет на магнитах 3 — P2P Сайт и Форум
Для создания и обновления магнитного сайта с множеством страниц нам понадобится электронная подпись. Нужна она чтобы обозначить источник и связать между собой страницы сайта. Для её создания и использования можно воспользоваться пакетом GnuPG.
User-ID: ivan386 <magnet@ivan386.github.io>
Validity: from 2015-12-19 15:43 until forever
Certificate type: 2,048-bit RSA (secret key available)
Certificate usage: Signing EMails and Files, Encrypting EMails and Files, Certifying other Certificates
Key-ID: 50B3C3CC
Fingerprint: D359C4A5D7B46DF7A10D5FDC95997DB550B3C3CC
Переводим Fingerprint в base32:
2nm4jjoxwrw7piinl7ojlgl5wvilhq6m
Также нам понадобится публичный ключ.
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
mQENBFZ1QsUBCAC+tKNB8Ra6qsgwZjZyGBSoAwuXkTXpCM4xprzpkE2YwaVBhdNk
rtEmtsX1KjGbIHlB+uk1ZfrwPS7u9Jk36zy0Nlg8P8SkVqvMvlC6tlpKT7oYxvzX
/Bf8ZsrpKJtIxMH/cLTFVdtQoBcQx/8wbyf+DuDaqG4TxdVan1tuguJB8Xna9yeo
xbba279pZiJ4YYzykLaR1YMB0eSDP3c7XpDrz8oIaGF4QynL/0bI0u+ubA4e5O6q
GxJ3PdtPyh4ZZ042p1yKrwNjI4xo5HV/htBuDWm1nUcd+506RSkYk6zNlJ/lt96k
8VXLrGxblewPFNTIngOGGD0GECi/+7fY94S9ABEBAAG0Iml2YW4zODYgPG1hZ25l
dEBpdmFuMzg2LmdpdGh1Yi5pbz6JATkEEwEIACMFAlZ1QsUCGwMHCwkIBwMCAQYV
CAIJCgsEFgIDAQIeAQIXgAAKCRCVmX21ULPDzPVhCACbzZXP1rjIzDCgTw4wTa3m
29Nq7hm6UhZcy72RROtLiPC+bksetSmI/IMFkaaMcQubOo1W4CaYYpLG1HdRAQKN
oevHSMrGKNZIH3BCbjZhhBXM3creesvD178pz4CnD58N6E5XWzWsS99PZcgbwyS0
uL6QmsOVzbtWcf9Q4Rcq3AW/zqAjtun5EpRc/88k9PTBPKYOFBVP1i8sBAGgiXo+
UAg7G9Hp9kmWQtGUP/amBiTKw2raL4gCs2IjM19niVPHCMDCrilyF0lPaWFeuX5T
VvKxaWtLVcr8RLZqY5ExVrFJGAYUik42V6DWCuvStrCBAA61C9x5hddCPH+YCoHl
uQENBFZ1QsUBCAC+kK6SBVhuWtBdF0+Lk807PH5PYEe7eZ8DWvwGOvDTIq4A2wmW
jkelfG+Yk2h4liBHaKRJRob+pHLD/kLq5lwBtb+A3+AGQew0UDKoy51gWX/Su2hN
A277bjzZ4V+p8vK7gGFGimvtvenC61DH7L/hCNKz4vJwi9dwDkuiOwhyNVbUT7JU
9+JINanmf4liLAKDXXsj36FTQKVc+zRCyxH09nxRxadgscnrnIm0uoFQbQHhtG1S
V4kITu7VblRkJSZVNc4LzV4QC3yNWlLD358XHeOHCKvz3aozVciwg9PkLGy7yKbF
ejROI5gomN7UIT611toMje8vdzjkFK2zq0lDABEBAAGJAR8EGAEIAAkFAlZ1QsUC
GwwACgkQlZl9tVCzw8xbowgApoXx19hd/M/+jzP86Z5LBU4gSr+ab4ksHdcmc6zj
hgToR5QwNoFsC6+HvUG43XYgcjjt8srSO1peMNo3/OsewemYFd1GBK64lS2eurgf
7mhrxpetZGhGMQtO+MlEesCbDTmVrWiU87VtwVsfI+dd5VvuyeB/g6olK9x6M2ZL
kDXIwn9xW8HdDKs0YFHhw2WH2VuINCDLhcvvEYMF3Nf3st8vqH5/Na2GT2Dhka0E
e/rUoLjUC3qT1Dqw5PMDBljcjtPQSICbrs07s2PkftyxTYr22r4VvBL9YXKvSx/Z
Ryhnj3Si/La+8t0s96qpW8sKXJ4QeO32m0lMDwOcVBxzBQ==
=PnA8
-----END PGP PUBLIC KEY BLOCK-----
Публичный ключ позволит идентифицировать единый источник и будет служить маячком для поиска обновлений.
Получаем магнит файла публичного ключа.
magnet:?xt=urn:ed2k:933a52e5ede31f2c84df67794a6cd56e&xl=1736&dn=D359C4A5D7B46DF7A10D5FDC95997DB550B3C3CC.asc&xt=urn:bitprint:23ATOCUXA64AKIZQ5JAUYAM2XXEGGO2Y.WYUX7ID3KM7SMD3T6L6G7BJ3CCYW45IRWKSSZ7I&xt=urn:btih:a318690763710c6d9ce3a3de6f0b969d45bf9236
Напишем две странички сайта для теста. И подпишем их.
Первая:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
<meta charset="utf-8" />
<title>Это первая страница сайта.</title>
<pre style="white-space: pre-wrap">
<h1>Первая</h1>
<a href="">Страница 1</a>
<a href="2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-map.asc.htm#page2">Страница 2</a>
Это первая страница сайта.
<a href="2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-map.asc.htm">Карта сайта 2nm4jjoxwrw7piinl7ojlgl5wvilhq6m</a>
<a href="" download="2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-page1.asc.htm">Сохранить эту страницу</a>
<a href="D359C4A5D7B46DF7A10D5FDC95997DB550B3C3CC.asc#magnet:?xt=urn:ed2k:933a52e5ede31f2c84df67794a6cd56e&xl=1736&dn=D359C4A5D7B46DF7A10D5FDC95997DB550B3C3CC.asc&xt=urn:bitprint:23ATOCUXA64AKIZQ5JAUYAM2XXEGGO2Y.WYUX7ID3KM7SMD3T6L6G7BJ3CCYW45IRWKSSZ7I&xt=urn:btih:a318690763710c6d9ce3a3de6f0b969d45bf9236">Мой публичный ключ</a>
Подпись:
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQEcBAEBCAAGBQJWeSsaAAoJEJWZfbVQs8PMTrEH/2us1Zpkz6l0+tvOo8xXOay+
B+3V5fjNqHIUfk+8qeG0s/0ftrPAEaBUaUeBujyrPggOm1pPaBtDD3oUeRsRhpaO
8PqV+Sz2qj5jtkPy7SDNj97mHJ3PV9hm35/rJf5LPI7F8fSyZV5+qC/GSGhTpN0P
BpmTtxxW2HF7CHH4c5rNj7OqjR7OQAhsTxgwAhYox5euO8zZ6bqOwPKSGoE07Wgy
qeNtRDFGIybpnvWpqkWVjO9ngv96b5no8WerZGIKDgqnchMHGhja5uN9OGr+iQCL
voQN+Nj9MLZYToNlT3bm6j4Gb79sSbyueYFpuAtGH37qvufICV8dXUgoR4a3+oE=
=/6up
-----END PGP SIGNATURE-----
Страница подписана командой:
gpg --clearsign
Проверяем подпись командой:
gpg --with-fingerprint
gpg --with-fingerprint 2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-page1.asc.htm
gpg: 2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-page1.asc.htm: неизвестное окончание
Введите новое имя файла: t.asc
gpg: Подпись создана 12/22/15 14:51:06 Russian Standard Time ключом RSA с ID 50B3C3CC
gpg: Действительная подпись от "ivan386 <magnet@ivan386.github.io>" [абсолютное]
Отпечаток главного ключа: D359 C4A5 D7B4 6DF7 A10D 5FDC 9599 7DB5 50B3 C3CC
"D359C4A5D7B46DF7A10D5FDC95997DB550B3C3CC" == base32_to_hex("2nm4jjoxwrw7piinl7ojlgl5wvilhq6m")
Онлайн конвертер
Подпись теперь составляет одно целое с файлом.
Ссылка на вторую страницу выглядит так:
<a href="2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-map.asc.htm#page2">Страница 2</a>
Так как первая страница сайта создаётся раньше второй мы не можем поместить в ссылку магнит на вторую. Поэтому используется ссылка на карту сайта с id ссылки на вторую страницу.
Имя файла карты сайта:
2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-map.asc.htm
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
<meta charset="utf-8" />
<title>Карта сайта.</title>
<style>
:target{
diplay: block;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: white;
}
:target:before{
content: "Для перехода нажмите ссылку: "
}
</style>
<pre style="white-space: pre-wrap">
<h1>Карта сайта: 2nm4jjoxwrw7piinl7ojlgl5wvilhq6m</h1>
<a href="2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-page1.asc.htm#magnet:?xt=urn:ed2k:6adb7b11137f776a6cdcb48502dd5d05&xl=1458&dn=2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-page1.asc.htm&xt=urn:bitprint:OZCKN2HQSLCXH3ALOTHEFHOUTTM3KVUA.2ZNBFSZOJEBROWB32CMUFH2V64FPU5SLGFB4LVI&xt=urn:btih:c419daa9c44d1cb46799de3c41067346721e67ae" id="page1">Это первая страница сайта.</a>
<a href="2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-page2.asc.htm#magnet:?xt=urn:ed2k:e27b8ecd60ec9b6c5f72caafc5f74aee&xl=1458&dn=2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-page2.asc.htm&xt=urn:bitprint:SFHTWLRM5DDEJQ6LT5COOHTNYM2LAUQE.R6KIBSBC2QPQIDD6OTCXMXHOFQEFKATVMZ3P2GI&xt=urn:btih:88de33aec8d839698b5a39285ee1d43ef6b19a8c" id="page2">Это вторая страница сайта.</a>
<a href="" download="2nm4jjoxwrw7piinl7ojlgl5wvilhq6m-map.asc.htm">Сохранить</a>
<a href="D359C4A5D7B46DF7A10D5FDC95997DB550B3C3CC.asc#magnet:?xt=urn:ed2k:933a52e5ede31f2c84df67794a6cd56e&xl=1736&dn=D359C4A5D7B46DF7A10D5FDC95997DB550B3C3CC.asc&xt=urn:bitprint:23ATOCUXA64AKIZQ5JAUYAM2XXEGGO2Y.WYUX7ID3KM7SMD3T6L6G7BJ3CCYW45IRWKSSZ7I&xt=urn:btih:a318690763710c6d9ce3a3de6f0b969d45bf9236" id="publickey">Мой публичный ключ</a>
Подпись:
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQEcBAEBCAAGBQJWeSzBAAoJEJWZfbVQs8PM4JAIAItZh86ChU1mC2JHIPjDQvXk
Q1yCx+0M/d4f2Pp0QVmsfR8rwxwTI75k0zeqVsEaBBclqWlr1qWXb9Lfoz9+0ksH
rj4OJmvl42cLavFtn8zEXr7o7Ok11CPrvXZy2oVPc432rDsUDH584aChQbhlOyKf
r92/troyM9ow1OHvlWJUyMGBUTFjproL2Ur2ZICjMp6HcKAsr7cRwDzGemYS5nXM
JdrEOKRNXxKU6iFAHxVTke30vY7h9mzPQS8YGAAYCf+eIjFsqXh1aRB1ZVW/xuJe
FXC0Cz5CMNXqYrCvPfjF/zCNh5sTpNTTi9uCkRxLHSfaBg2TTRo7zEJc12H7VUs=
=Y+BA
-----END PGP SIGNATURE-----
Все внутренние страницы сайта ссылаются на карту передавая в hash идентификатор той страницы на которую должен перенаправить map. Это позволит обновлять информацию на страницах без потери связности между ними. При обновлении будет меняться только карта сайта.
Карта подписывается и публикуется где угодно (p2p, web и т.д.).
Просмотр сайта осуществляется поиском наиболее свежего файла карты, проверкой подписи и далее уже можно качать непосредственно страницы сайта.
Магнит для теста
Прямая ссылка
После клика по ней будет загружена карта сайта. Откройте её и кликните на первую страницу. После этого сотрите в адресной строке часть до magnet:? и нажмите Enter. Ваш p2p клиент должен скачать первую страницу сайта и аналогично для остальных.
Это тестовый сайт. Есть множество способов упростить жизнь посетителю при помощи JavaScript и IFrame, чтобы автоматом открывался магнит если страницы нет на диске но это будет потом.
Проблема торрентов.
Файлы сайта больше не зависят от протокола передачи данных и могут передаваться хоть на флешках друг другу. Проблема торрентов в том что существует дополнительная сущность а именно торрент файл. Он может быть потерян в процессе обмена и имея файл мы можем не создать на него торрент с идентичным info хешем.
Решение первое Torrent + HTML
Сама HTML страница будет включать в себя торрент файл. Для этого достаточно вставить код страницы в комментарий торрента при создании. В конце комментария добавляем
<a href="" download="page.torrent">Торрент файл</a>
<plaintext style="display: none;">
Это ссылка на торрент файл и тег который скроет содержимое торрент файла.
К имени полученного торрента добавляем расширение htm
Решение второе micro Torrent (не путать с известным клиентом для сети BitTorrent)
Это торрент файл который генерируется из содержимого магнет ссылки.
Нам понадобится:
- sha1 хеш файла
- размер файла
- имя файла (как совсем аварийный случай можно использовать просто имя «file»)
Размер блока в микро торренте равен размеру файла если он больше 16384 байт. Тем самым sha1 хеш блока равен sha1 хешу файла.
Микро торрент из магнет ссылки можно сгенерировать при помощи JavaScript либо его может генерировать торрент клиент.
make_micro_torrent
function make_micro_torrent(file){
if (file.name && file.size && file.hash && file.hash.sha1){
var torrent = ["data:application/x-bittorrent;,d"]
if (file.trackers && file.trackers.length>0){
torrent.push("8:announce")
push_string(file.trackers[0], torrent)
if (file.trackers.length>1){
torrent.push("13:announce-listl")
for (i = 1; file.trackers.length>i; i++){
var tracker = encodeURIComponent(decodeURIComponent(file.trackers[i]))
push_string(tracker, torrent)
}
torrent.push("e")
}
}
torrent.push("4:infod")
torrent.push("6:length")
torrent.push("i")
torrent.push(file.size)
torrent.push("e")
torrent.push("4:name")
var name = encodeURIComponent(file.name)
push_string(name, torrent)
torrent.push("12:piece%20length")
torrent.push("i")
torrent.push(file.size < 16384 ? 16384 : file.size)
torrent.push("e")
torrent.push("6:pieces")
var sha1 = file.hash.sha1
if (sha1.length < 40)
sha1 = base32_to_hex(sha1);
sha1 = sha1.replace(/[0-9A-Fa-f]{2}/g,"%$&")
push_string(sha1, torrent)
torrent.push("e")
if (file.url && file.url.length>0){
torrent.push("8:url-listl")
for (i = 0; file.url.length>i; i++){
var url = encodeURIComponent(decodeURIComponent(file.url[i]))
push_string(url, torrent)
}
torrent.push("e")
}
torrent.push("e")
return torrent.join("")
}
}
Такое решение подходит для небольших файлов которыми обычно являются веб страницы.
Форум
Каждое сообщение в форуме это отдельная HTML страница в которой кроме сообщения и цитаты предыдущего должна быть комбинированная ссылка на предыдущее сообщение. А также подпись автора.
Имя файла сообщения:
to-sha1-[msg_sha1_base32]-fp-[fingerprint_base32]-from-fp-[fingerprint-base32].asc.htm
msg_sha1_base32 это sha1 хеш файла сообщения на который отвечает автор
Если сообщение первое в ветке то часть to заменяется на title.
title-почему коровы не летают-from-fp-2nm4jjoxwrw7piinl7ojlgl5wvilhq6m.asc.htm
Также можно комментировать файлы:
to-sha1-[file_sha1_base32]-from-fp-[fingerprint-base32].asc.htm
Файлы сообщений просто выкладываются в общий доступ любым способом.
Интернет на магнитах 1 — Магнит
Интернет на магнитах 2 — Гипертекст
Интернет на магнитах 3 — P2P Сайт и Форум
Grunya_404
спасибо за статью очень подробно.
А чем описание выше отличается от project-maelstrom от bittorrent?
и вот еще от них же утилита создания торрент сайтов github.com/bittorrent/torrent-web-tools
ivan386
Наверное тем что для публикации сайта вы можете пользоваться любой технологией в том числе и перечисленными вами. Суть отвязки от протокола и среды передачи данных. Используемые магнет ссылки содержат в себе информацию для нескольких p2p сетей в том числе и BitTorrent. Также сайт может быть опубликован и на обычном веб севере с которого вы можете его скачать и раздать в Edonkey2000 например. Электронная подпись позволяет узнать источник и определить что файлы не изменены.
grey_rat
Может ли браузер загружать элементы страницы с одного или более источников?
Например, в магнет ссылке для торрента перечисление веб-сидов: .....ws=http.......&ws=http… Торрент-клиент может загружать части одного файла с нескольких http источников.
ivan386
Разные элементы с разных источников может. Один с нескольких думаю что это возможно. Вопрос лиш в том как это сделать. Протокол HTTP позволяет загружать файл частями.
Но это не сильно важно. Браузер испльзуется для отобажения. Для загрузки используются p2p клиенты.
ivan386
Также его можно публиковать и в tor, i2p, freenet.