Пиринговый веб
на JavaScript
Денис Глазков
1
- обзор пиринговых сетей
- устройство сети base.network
- серверные ноды
- криптография на JS
- устройство клиента
- разработка клиентских приложений
Содержание
2
Закрыли любимую группу в соц. сетях?
3
Великий Китайский Фаервол
4
5
6
7
Цензура в Интернете
8
Пиринговые технологии
ethereum
9
Одноранговые сети
10
Мир во всех Мирах!
11
Прекрасное жестоко, не будь ко мне далёко
12
13
Социальная сеть Земля-Марс ?
14
15
I2P
Freenet
16
17
Минусы существующих пиринговых сетей
- не умеют работать с динамикой
- медленные
- установка “мутного” клиентского ПО
- страдают “централизацией”
18
base.network
О проекте
• опенсоурс проект на JavaScript
• децентрализованная сеть
• без DNS, без центральных серверов
• поверх HTTP
19
base.network
Возможности
• собственные сайты, доменные имена
• загрузка и чтение файлов, json-данных
• блоги, комменты, фотоальбомы, плейлисты
• чаты в реальном времени
20
Устройство сети
NodeJS
IP:port
NodeJS
IP:port
NodeJS
IP:port
NodeJS
IP:port
NodeJS
IP:port
NodeJS
IP:port
client
JavaScript
client
JavaScript
client
JavaScript
client
JavaScript
client
JavaScript
NodeJS
IP:port
data: A B C
21
Серверная нода
Веб-сервер + БД (NodeJS, SQLite3)
Простой и быстрый KeyValue Storage
Функции:
- сообщает о себе другим нодам
- пишет данные в распределенную базу
- проверяет валидность данных (подпись автора)
- реплицирует данные между нодами
- уведомляет о добавлении данных
22
Карта сети - список всех нод
curl http://5.9.123.140:8080/-/nodes
{
"nid":"5.9.123.140/8080",
"ver"1,
"seg":"D,N,F,P,D0,D1,……"
}
{
"nid":"46.4.76.98/8081",
"ver"1,
"seg":"……F41,F54,P04"
}
23
Информация о ноде
curl http://5.9.123.140:8080/-/about
{
"ver":1,
"nid":"5.9.123.140/8080",
"updated":1441639911027,
"segments":{
"D":{"usage":0.2},
"N":{"usage":0.5},
"F":{"usage":0.3},
…
}
}
24
https://github.com/basenetwork/base.server-node/
Git
Серверная нода
NodeJS
25
• sign(data, privateKey)
• verify(data, sign, publicKey)
• encrypt(data, publicKey)
• decrypt(data, privateKey)
Криптография на JavaScript
- Эллиптические кривые secp256k1
- Длина ключа 256 бит (32 байта)
- Минимальный набор функций:
26
Криптография на JavaScript
библиотеки
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) Tom Wu
http://www-cs-students.stanford.edu/~tjw/jsbn/
jsrsasign 4.8.3 (c) 2010-2015 Kenji Urushima
kjur.github.com/jsrsasign/license
27
Клиент
28
29
30
Под капотом
31
32
33
34
Разработка клиентского
приложения
//============ MySiteEngine.js =================
var baseAPI = basenetwork.getAPI(0);
// request current site information
var siteInfo = baseAPI.getCurrentSiteInfo();
// -> {host,owner,title,ring…}
35
Файлы. Пользователи
// upload file to cloud
baseAPI.uploadFile(fileReader, function(err){
});
// request file from cloud
var fileID = "F2/d8f08dd1564510b0f...e2aaf1e22ec2a1.jpeg";
baseAPI.requestFile(fileID, function(err, content, info){
});
// get user info by public certificate
baseAPI.getUserInfo(certificate, function(err, userInfo){
});
36
37
Добавление данных в канал
var channel = siteInfo.host + "/super-chat/";
var data = {
message: "Bla-bla-bla"
};
// post data to cloud
baseAPI.postData({
uid: channel,
data: data,
ver: 0,
pos: "2016-02-25 19:00:00”
}, function(err, resp) {
// process results
console.log(err? "Error" : "OK");
});
38
Получение списка данных из канала
var request = {
cmd: "top", // "top|nxt|prv|doc|old"
uid: channel, // address of channel
sse: true // listen server side events
};
baseAPI.requestData(request, function(err, packs) {
// process data
packs.forEach(function(pack) {
// render messages
console.log(pack.data.message)
});
});
39
https://github.com/basenetwork/client-js/
Git
Клиентское ядро
40
https://github.com/basenetwork/site-engiene-js/
Git
Сайтовый движок
41
React.JS Chat
// Components/Chat.jsx
//======= New Message Form =============
var MessageNew = $class(Form, {
render: function() {
return (
<form onSubmit={this.submit} className="chat-message-new">
{this.$input("message", {placeholder: "New message”})}
<button type="submit">Add message</button>
</form>
);
}
});
42
React.JS Chat
//============ Components/Chat.jsx Message =================
var Message = $component("chat-message", {
render: function() {
return(
<div className="chat-message">
<UserIcon user={this.props.element.author} />
<UserName user={this.props.element.author} />
<p>{this.props.element.get("message")}</p>
</div>
);
}
});
43
React.JS Chat
//====== Register Chat Component ==========
$component('chat', Page, {
tplChildForm: MessageNew,
tplChildItem: Message
});
44
45
• http://base.network/
• https://github.com/basenetwork
Ссылки
46
Перспективы развития
WebRTC
Client
IndexedDB
Client
IndexedDB
Proxy server
- Нативная криптография через window.crypto
- WebRTC, IndexedDB
- Расширение функционала сайтового движка
- Приватные чаты
47
base.network
Пиринговый веб на JavaScript
Денис Глазков
2016
Вопросы?
48

base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)