Pages:
Author

Topic: Одноранговая сеть на базе WebRTC (Read 489 times)

sr. member
Activity: 1316
Merit: 420
KTO EC/\U HUKTO?

Нет, не так же. Любое полноценное p2p приложение открывает порт при запуске, держит его открытым и отвечает на запросы независимо от фокуса пользователя, а браузер так не умеет. Ты открыл вкладку, в ней запустилось твоё приложение, открылись порты. Если вкладку закрыть, то приложение и порты закроются,
То есть вкладке это и есть аналог приложения. Есть вкладка(приложение) - есть порты, нет вкладки(приложения) - нет портов.

Только на уровне браузера со всеми вытекающими зависимостями и ограничениями, на уровне ОС твоего приложения не существует.

даже если её не закрывать, а открыть другую, вкладка с твоим приложением уснёт и перестанет отвечать на внешние запросы.

А вот этого я не знал.
Если так, тогда надо предупреждать пользователей просто, что открывать приложение надо в отдельном окне, а не во вкладке.

Это костыль и не факт что поможет. Деление на окна и вкладки весьма условное - браузер из родительского процесса замедляет или вовсе приостанавливает всё что не в фокусе пользователя.
member
Activity: 126
Merit: 23
Или просто восстанавливать состояние из базы кеша браузера.
Думаю все не так просто. Браузер открывает порты по своему усмотрению. Заставить его открыть определенный порт - невозможно.
Поэтому если он в одной сессии открыл 10 портов: 1,2,3,4,5...10, то в другой сессии он уже откроет другие порты и ничего с этим нельзя сделать.

Угу. Повторный опрос сигнальных серверов, переконнект всей сетки со всеми NAT и прочими замутами.
Поэтому когда я делал мессенджер на вебртс, я плюнул на все и сделал таки на амазоновском IoT.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
Или просто восстанавливать состояние из базы кеша браузера.

Думаю все не так просто.
Браузер открывает порты по своему усмотрению. Заставить его открыть определенный порт - невозможно.
Поэтому если он в одной сессии открыл 10 портов: 1,2,3,4,5...10, то в другой сессии он уже откроет другие порты и ничего с этим нельзя сделать.
member
Activity: 126
Merit: 23

Нет, не так же. Любое полноценное p2p приложение открывает порт при запуске, держит его открытым и отвечает на запросы независимо от фокуса пользователя, а браузер так не умеет. Ты открыл вкладку, в ней запустилось твоё приложение, открылись порты. Если вкладку закрыть, то приложение и порты закроются,
То есть вкладке это и есть аналог приложения. Есть вкладка(приложение) - есть порты, нет вкладки(приложения) - нет портов.

даже если её не закрывать, а открыть другую, вкладка с твоим приложением уснёт и перестанет отвечать на внешние запросы.

А вот этого я не знал.
Если так, тогда надо предупреждать пользователей просто, что открывать приложение надо в отдельном окне, а не во вкладке.
Или просто восстанавливать состояние из базы кеша браузера.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange

Нет, не так же. Любое полноценное p2p приложение открывает порт при запуске, держит его открытым и отвечает на запросы независимо от фокуса пользователя, а браузер так не умеет. Ты открыл вкладку, в ней запустилось твоё приложение, открылись порты. Если вкладку закрыть, то приложение и порты закроются,
То есть вкладке это и есть аналог приложения. Есть вкладка(приложение) - есть порты, нет вкладки(приложения) - нет портов.

даже если её не закрывать, а открыть другую, вкладка с твоим приложением уснёт и перестанет отвечать на внешние запросы.

А вот этого я не знал.
Если так, тогда надо предупреждать пользователей просто, что открывать приложение надо в отдельном окне, а не во вкладке.
sr. member
Activity: 1316
Merit: 420
KTO EC/\U HUKTO?
Умеет, но только по запросу своего пользователя.

Так же как и любое другое приложение.
Только в обычном сервере открывается один порт и один раз - при старте. На этот единственный порт сервер принимает все входящие соединения.

В случае WebRTC порт открывается каждый раз новый и поэтому необходима более сложная система сигнализации.

То есть можно открыть заранее 100 портов и послать через сигнальный сервер информацию об этих открытых портах всем остальным нодам.
Другие ноды могут хранить эту информацию в кэше и передавать другим нодам через уже открытые соединения, в обход сигнального сервера.


Нет, не так же. Любое полноценное p2p приложение открывает порт при запуске, держит его открытым и отвечает на запросы независимо от фокуса пользователя, а браузер так не умеет. Ты открыл вкладку, в ней запустилось твоё приложение, открылись порты. Если вкладку закрыть, то приложение и порты закроются, даже если её не закрывать, а открыть другую, вкладка с твоим приложением уснёт и перестанет отвечать на внешние запросы.

Что значит открыть заранее?
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
Умеет, но только по запросу своего пользователя.

Так же как и любое другое приложение.
Только в обычном сервере открывается один порт и один раз - при старте. На этот единственный порт сервер принимает все входящие соединения.

В случае WebRTC порт открывается каждый раз новый и поэтому необходима более сложная система сигнализации.

То есть можно открыть заранее 100 портов и послать через сигнальный сервер информацию об этих открытых портах всем остальным нодам.
Другие ноды могут хранить эту информацию в кэше и передавать другим нодам через уже открытые соединения, в обход сигнального сервера.
sr. member
Activity: 1316
Merit: 420
KTO EC/\U HUKTO?
В одноранговой сети не должно быть выделенных серверов.

Потому её клиенты и должны выполнять роль сервера, а они не умеют в данном случае.

Браузер умеет открывать порт, умеет получать на этот порт данные, умеет отправлять данные. Этого достаточно для построения одноранговой сети.

Умеет, но только по запросу своего пользователя.
sr. member
Activity: 1337
Merit: 288
0xbt
Я уже приводил ссылку, приведу еще раз https://www.npmjs.com/package/simple-peer

Да, это действительно работает.
Сделал, кому интересно для тестов:
http://ts.0xbt.net/sp/index.html
Причем работает и в Base64:
Code:
data:text/html;base64,PGh0bWw+CiAgPGJvZHk+CiAgICA8c3R5bGU+CiAgICAgICNvdXRnb2luZyB7CiAgICAgICAgd2lkdGg6IDYwMHB4OwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICB9CiAgICA8L3N0eWxlPiAKICAgIDxmb3JtPgogICAgICA8dGV4dGFyZWEgaWQ9ImluY29taW5nIj48L3RleHRhcmVhPgogICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCI+c3VibWl0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8cHJlIGlkPSJvdXRnb2luZyI+PC9wcmU+CiAgICA8c2NyaXB0IHNyYz0iaHR0cDovL3RzLjB4YnQubmV0L3NwL3NpbXBsZXBlZXIubWluLmpzIj48L3NjcmlwdD4gCiAgICA8c2NyaXB0PgogICAgICBjb25zdCBwID0gbmV3IFNpbXBsZVBlZXIoewogICAgICAgIGluaXRpYXRvcjogbG9jYXRpb24uaGFzaCA9PT0gJyMxJywKICAgICAgICB0cmlja2xlOiBmYWxzZQogICAgICB9KQogCiAgICAgIHAub24oJ2Vycm9yJywgZXJyID0+IGNvbnNvbGUubG9nKCdlcnJvcicsIGVycikpCiAKICAgICAgcC5vbignc2lnbmFsJywgZGF0YSA9PiB7CiAgICAgICAgY29uc29sZS5sb2coJ1NJR05BTCcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNvdXRnb2luZycpLnRleHRDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSkKICAgICAgfSkKIAogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtJykuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZXYgPT4gewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCkKICAgICAgICBwLnNpZ25hbChKU09OLnBhcnNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbmNvbWluZycpLnZhbHVlKSkKICAgICAgfSkKIAogICAgICBwLm9uKCdjb25uZWN0JywgKCkgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCdDT05ORUNUJykKICAgICAgICBwLnNlbmQoJ3doYXRldmVyJyArIE1hdGgucmFuZG9tKCkpCiAgICAgIH0pCiAKICAgICAgcC5vbignZGF0YScsIGRhdGEgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCdkYXRhOiAnICsgZGF0YSkKICAgICAgfSkKICAgIDwvc2NyaXB0PiAKICA8L2JvZHk+CjwvaHRtbD4=
Подставив к коду #1, так же работает.

Так что можно принять за точку отсчета.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
В одноранговой сети не должно быть выделенных серверов. Браузер умеет открывать порт, умеет получать на этот порт данные, умеет отправлять данные. Этого достаточно для построения одноранговой сети.
С NAT все работает прекрасно! Во всяком случае не хуже чем в тех же условиях работает любая другая p2p сеть.
sr. member
Activity: 1316
Merit: 420
KTO EC/\U HUKTO?

метод по ссылке работает исключительно на локальной машине,
Нет. Метод по ссылке работает не только на локальной машине. Не работает он только если кто-то из клиентов подключен через VPN

там написано "In a real-world application, you would never do this".

В переводе это означает: в реале вы так никогда делать не будете.
То есть имеется в виду, что в реальном применении вы не будете обмениваться сигнальными данными через CTRL+C и CTRL+V, а вместо этого будете использовать веб сокеты с сигнальным сервером или голубинную почту.

Я проглядел что там ещё CTRL+C и CTRL+V нужны, думал что-то попроще придумали. Значит без помощи пользователя не работает и на локальной машине. Вангую за NAT будет так же сложно как за VPN, а NAT очень распространённая штука. В любом случае, сервером браузер быть не умеет, поэтому неактуально подбирать костыли.
hero member
Activity: 1484
Merit: 505

Да, такая идея тоже имеет место быть. Даже знаю парней, которые сделали такой браузер https://github.com/Zigridar/blockchainsites
Это приложение которое подключается к тестовой сети биткоина и позволяет публиковать сайты не в интернет, а прямо в блокчейн. Там же встроенный браузер (на движке хромиум) который эти сайты может открывать так же как любые другие сайты в интернете.

А вот эта тема очень интересная. Получается, что можно сделать сайт и заплатив за первичное размещение больше не беспокоится о продлении домена, оплате хостеру. Т.е. он будет в интернете навечно. Думаю, что когда народ просечет эту фишку, то все сайты потихоньку туда и переместятся.

Может я не совсем врубился, но какой толк от того что вы сохраните статический контент сайта в блокчейне один раз в момент запуска сайта? Любое последующее обновление и добавление контента обойдется дороже чем плата за хостинг.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange

метод по ссылке работает исключительно на локальной машине,
Нет. Метод по ссылке работает не только на локальной машине. Не работает он только если кто-то из клиентов подключен через VPN

там написано "In a real-world application, you would never do this".

В переводе это означает: в реале вы так никогда делать не будете.
То есть имеется в виду, что в реальном применении вы не будете обмениваться сигнальными данными через CTRL+C и CTRL+V, а вместо этого будете использовать веб сокеты с сигнальным сервером или голубинную почту.
sr. member
Activity: 1316
Merit: 420
KTO EC/\U HUKTO?
Имхо, тут в любом случае нужна децентрализованная БД, то есть блокчейн. Просто чтобы офферы хранить.

Лохчейн тут нужен не более чем лошадь в багажнике автомобиля для ускорения. Просто, чтобы больше лошадинных сил было. И как же браузер без централизации сможет прочитать этот лохчейн?
member
Activity: 126
Merit: 23
Не будет, потому что браузер это исключительно клиент, а чтобы уметь такую магию он должен быть ещё и сервером.

Я тоже так думал, но оказалось что ошибался. Браузер может быть и клиентом и сервером. Я уже два раза давал эту ссылку, дам еще раз: https://www.npmjs.com/package/simple-peer#usage
Там пример использования. Можно просто скопипастить код в текстовый файл с расширением html, открыть получившуюся страницу на своем компе двумя разными браузерами и без всяких STUN, TURN, сигнальных серверов, увидеть магию обмена данными по WebRTC!

А если подумать? Сервер это такая программная или аппаратная сущность, которая обслуживает (serve) запросы клиентов. Если в одном браузере открыт файл, а в другом закрыт, то этот браузер не отвечает. Следовательно это не сервер, а клиент. Но даже в формате клиент-клиент, метод по ссылке работает исключительно на локальной машине, где конечно без надобности узнавать внешний ip и обмениваться сигнальными данными, поэтому там написано "In a real-world application, you would never do this".

Имхо, тут в любом случае нужна децентрализованная БД, то есть блокчейн. Просто чтобы офферы хранить.
Синхронизация - вариант так себе.
И я как бы немного сомневаюсь, что на js-webrtc связке получится что нибудь лучшее, чем эфириум.
sr. member
Activity: 1316
Merit: 420
KTO EC/\U HUKTO?
Не будет, потому что браузер это исключительно клиент, а чтобы уметь такую магию он должен быть ещё и сервером.

Я тоже так думал, но оказалось что ошибался. Браузер может быть и клиентом и сервером. Я уже два раза давал эту ссылку, дам еще раз: https://www.npmjs.com/package/simple-peer#usage
Там пример использования. Можно просто скопипастить код в текстовый файл с расширением html, открыть получившуюся страницу на своем компе двумя разными браузерами и без всяких STUN, TURN, сигнальных серверов, увидеть магию обмена данными по WebRTC!

А если подумать? Сервер это такая программная или аппаратная сущность, которая обслуживает (serve) запросы клиентов. Если в одном браузере открыт файл, а в другом закрыт, то этот браузер не отвечает. Следовательно это не сервер, а клиент. Но даже в формате клиент-клиент, метод по ссылке работает исключительно на локальной машине, где конечно без надобности узнавать внешний ip и обмениваться сигнальными данными, поэтому там написано "In a real-world application, you would never do this".
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
Но вот по логике есть мой комп у него IP внутри какой то сети и что б к нему как к серверу кто то мог подключится из другой сете у него должен быть на внешнем ip открыт порт ... и второй клиент дожен знать мой внешний IP и порт...
Как не крути дожен быть кто то в общедоступном интернете кто скажет какие у клиентов адреса

Все верно. Для реального интернета нужны STUN сервера которые говорят браузерам: какой у них реальный адрес и порт.
Прелесть в том, что протоколу STUN вообще пофиг кто к нему обращается, задача протокола стандартная и поднять такой сервер можно даже внутри Великого Китайского Файрвола. То есть заблокировать STUN сервера если и можно, то я не представляю как.., особенно с учетом того что трафик к этим серверам вроде шифруется так же как обычный https.
sr. member
Activity: 1932
Merit: 349

браузер подключается к эфиру, например через метамаск, и с помощью
Dapp на js вызывает смарт контракт твоего обменника.
Авторизация через счет в блокчейне эфира, безопасно через метамаск.
При желании, можно сунуть туда и эскроу для всего что ERC20 держит.
Единственный минус - за объявки и коммуникацию платить газом надо.

Хотя - можно тупо на и на ропстене поставить, если там чисто
обмен сообщениями.


Хорошая тема, но я не склонен считать эфир (тем более через метамаск) - децентрализованной системой.
Хотя суть моей идеи вы уловили верно. Сможете помочь с реализацией?

Не будет, потому что браузер это исключительно клиент, а чтобы уметь такую магию он должен быть ещё и сервером.

Я тоже так думал, но оказалось что ошибался. Браузер может быть и клиентом и сервером. Я уже два раза давал эту ссылку, дам еще раз: https://www.npmjs.com/package/simple-peer#usage
Там пример использования. Можно просто скопипастить код в текстовый файл с расширением html, открыть получившуюся страницу на своем компе двумя разными браузерами и без всяких STUN, TURN, сигнальных серверов, увидеть магию обмена данными по WebRTC!


Два браузера на 1 компе или два браузера на компах в разных частях планеты сети интернет?
Глянул код и не увидел где там идентификаторы кто есть кто... но это ладно может #1 этого достаточно...
Но вот по логике есть мой комп у него IP внутри какой то сети и что б к нему как к серверу кто то мог подключится из другой сете у него должен быть на внешнем ip открыт порт ... и второй клиент дожен знать мой внешний IP и порт...
Как не крути дожен быть кто то в общедоступном интернете кто скажет какие у клиентов адреса
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange

браузер подключается к эфиру, например через метамаск, и с помощью
Dapp на js вызывает смарт контракт твоего обменника.
Авторизация через счет в блокчейне эфира, безопасно через метамаск.
При желании, можно сунуть туда и эскроу для всего что ERC20 держит.
Единственный минус - за объявки и коммуникацию платить газом надо.

Хотя - можно тупо на и на ропстене поставить, если там чисто
обмен сообщениями.


Хорошая тема, но я не склонен считать эфир (тем более через метамаск) - децентрализованной системой.
Хотя суть моей идеи вы уловили верно. Сможете помочь с реализацией?

Не будет, потому что браузер это исключительно клиент, а чтобы уметь такую магию он должен быть ещё и сервером.

Я тоже так думал, но оказалось что ошибался. Браузер может быть и клиентом и сервером. Я уже два раза давал эту ссылку, дам еще раз: https://www.npmjs.com/package/simple-peer#usage
Там пример использования. Можно просто скопипастить код в текстовый файл с расширением html, открыть получившуюся страницу на своем компе двумя разными браузерами и без всяких STUN, TURN, сигнальных серверов, увидеть магию обмена данными по WebRTC!

sr. member
Activity: 1316
Merit: 420
KTO EC/\U HUKTO?
Вообще-то у меня есть мечта: сделать полностью независимый ни от кого обменник. Первое, что для этого нужно - создание надежной p2p сети, доступ к которой сможет в два клика поиметь любая домохозяйка.

Я себе представляю такую сеть как статичный html файл на рабочем столе пользователя.
Файл открывается в браузере, браузер подключается к пирам которых он запомнил с прошлой сессии. Только если все пиры недоступны, тогда браузер подключается к сидерам через сигнальные или TURN сервера.
То есть не нужно устанавливать никаких дополнительных приложений. Браузер есть у всех.
Загвоздка в том, что я пока даже не знаю - будет ли это работать в принципе через WebRTC? Хотя теоретически выглядит привлекательно.

Не будет, потому что браузер это исключительно клиент, а чтобы уметь такую магию он должен быть ещё и сервером.

Сам идеальный децентрализованный обменник представляю себе так:
А посылает публичное сообщение в общедоступную доску объявлений: "продам битки за яндекс рубли" Сообщение содержит в себе публичный ключ и цифровую подпись.
Б шлет приватное сообщение для А: "куплю твои битки через гаранта В"
А посылает сообщение для Б: "нет, давай через гаранта Г"
Б посылает сообщение: "ладно давай"...
А посылает публичное сообщение в общедоступную доску объявлений: "предложение закрыто"
Дальше идет обычный обмен через гаранта.

То есть p2p обменник это по сути обычный месседжер плюс доска объявлений. Гарантов можно искать в других местах.

Не уверен что это идеальная схема, но допустим. Гарантов можно там же крутить с их контактными данными, ссылками на сторонние профили, публичными ключами и цифровыми подписями объявлений.

браузер подключается к эфиру, например через метамаск, и с помощью
Dapp на js вызывает смарт контракт твоего обменника.
Авторизация через счет в блокчейне эфира, безопасно через метамаск.
При желании, можно сунуть туда и эскроу для всего что ERC20 держит.
Единственный минус - за объявки и коммуникацию платить газом надо.

Хотя - можно тупо на и на ропстене поставить, если там чисто
обмен сообщениями.

Зачем биткоину эфир и зачем платить за трафик, если это только ограничивает функционал?
Pages:
Jump to: