Pull to refresh

Интернет на магнитах 3 — P2P Сайт и Форум

Reading time 8 min
Views 12K
image Концепция интернета на магнитах состоит в том чтобы не зависеть от программного обеспечения, протокола или способа передачи данных. Не важно каким образом вы получаете файл имея магнит вы можете удостоверится что получили именно то что заказывали.

Для создания и обновления магнитного сайта с множеством страниц нам понадобится электронная подпись. Нужна она чтобы обозначить источник и связать между собой страницы сайта. Для её создания и использования можно воспользоваться пакетом 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)


Это торрент файл который генерируется из содержимого магнет ссылки.
Нам понадобится:
  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


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

Интернет на магнитах 1 — Магнит
Интернет на магнитах 2 — Гипертекст
Интернет на магнитах 3 — P2P Сайт и Форум
Интернет на магнитах 4 — Делим магнит на части
Интернет на магнитах 5 — Маяки и сообщения(личные, публичные и обновления)
Tags:
Hubs:
+8
Comments 5
Comments Comments 5

Articles