Пиринговая сеть на JavaScript
Moscow JS
Денис Глазков
2016 г.
1
- устройство сети
- серверные ноды
- криптография на JS
- клиент
2
3
Цензура в Интернете
Пиринговые технологии
4
Минусы существующих пиринговых сетей
- ну умеют работать с динамикой
- медленные
- установка “мутного” клиентского ПО
- страдают “централизацией”
5
О проекте
• опенсоурс проект на JavaScript
• децентрализованная сеть
• без DNS, без центральных серверов
• поверх HTTP
Возможности
• собственные сайты, доменные имена
• загрузка и чтение файлов, json-данных
• блоги, комменты, фотоальбомы,
плейлисты
• чаты в реальном времени
6
Устройство сети
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
A B C
7
Карта сети - список всех нод
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"
}
8
Информация о ноде
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},
…
}
}
9
Серверная нода
Веб-сервер + БД (NodeJS, SQLite3)
Простой и быстрый KeyValue Storage


Функции:
- пишет данные в распределенную базу (chain)
- проверяет подпись автора
- сообщает о себе другим нодам
- реплицирует данные между нодами
- уведомляет о добавлении данных

10
• https://github.com/basenetwork/base.server-node/
Git
Серверная нода
11
• sign(data, privateKey)
• verify(data, sign, publicKey)
• encode(data, publicKey)
• decode(data, privateKey)
Криптография на JavaScript
- Эллиптические кривые secp256k1
- Длина ключа 256 бит (32 байта)
- Минимальные функции:
12
Криптография на 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
13
Клиент
14
15
Под капотом
16
17
18
19
Разработка клиентского
приложения
//============ MySiteEngine.js =================



var baseAPI = basenetwork.getAPI(0);




// request current site information

var siteInfo = baseAPI.getCurrentSiteInfo();
// -> {host,owner,title,ring…}



20
Файлы. Пользователи
// 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){



});
21
22
Добавление данных в канал
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) {



console.log(err? "Error" : "OK");



});



23
Получение списка данных из канала
var request = {

cmd: "top", // "top|nxt|prv|doc|old"

uid: channel,

sse: true

};



baseAPI.requestData(request, function(err, packs) {



// process data

packs.forEach(function(pack) {

// render messages

console.log(pack.data.message)

});



});

24
• https://github.com/basenetwork/client-js/
Git
Клиентское ядро
25
• https://github.com/basenetwork/site-engiene-js/
Git
Сайтовый движок
26
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>

);

}

});
27
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>

);

}


});
28
React.JS Chat
//====== Register Chat Component ==========


$component('chat', Page, {


tplChildForm: MessageNew,

tplChildItem: Message

});
29
• http://base.network/
• https://github.com/basenetwork
Ссылки
30
Перспективы развития
WebRTC
Client
IndexedDB
Client
IndexedDB
Proxy server
- Нативная криптография через window.crypto
- WebRTC, IndexedDB
- Расширение функционала
- Приватные чаты
31
base.network
Пиринговая сеть на JavaScript
Денис Глазков
2016
Вопросы?
32

«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28