Интернет на магнитах 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

Подпись теперь составляет одно целое с файлом.

Ссылка на вторую страницу выглядит так:

<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)

Это торрент файл который генерируется из содержимого магнет ссылки.
Нам понадобится:

  1. sha1 хеш файла
  2. размер файла
  3. имя файла (как совсем аварийный случай можно использовать просто имя «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

Файлы сообщений просто выкладываются в общий доступ любым способом.

ссылка на оригинал статьи http://habrahabr.ru/post/273713/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *