В последнее время тема пиринговых технологий становится очень популярной. Уже не первый день работают такие проекты как криптовалюта Bitcoin, микроблоги Twister и мессенджер Tox. Теперь дошло дело и до децентрализованного веба.
Доклад посвящен новому open-source проекту — base.network — распределенному независимому пиринговому вебу. Расскажу про общую схему работы сети, немного о работе с криптографией на JavaScript, о создании приложений на JavaScript без использования центральных серверов.
2. - обзор пиринговых сетей
- устройство сети base.network
- серверные ноды
- криптография на JS
- устройство клиента
- разработка клиентских приложений
Содержание
2
18. Минусы существующих пиринговых сетей
- не умеют работать с динамикой
- медленные
- установка “мутного” клиентского ПО
- страдают “централизацией”
18
22. Серверная нода
Веб-сервер + БД (NodeJS, SQLite3)
Простой и быстрый KeyValue Storage
Функции:
- сообщает о себе другим нодам
- пишет данные в распределенную базу
- проверяет валидность данных (подпись автора)
- реплицирует данные между нодами
- уведомляет о добавлении данных
22
23. Карта сети - список всех нод
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
24. Информация о ноде
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
36. Файлы. Пользователи
// 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
38. Добавление данных в канал
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
39. Получение списка данных из канала
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