Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

649 views

Published on

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

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Пиринговая сеть на JavaScript Moscow JS Денис Глазков 2016 г. 1
  2. 2. - устройство сети - серверные ноды - криптография на JS - клиент 2
  3. 3. 3 Цензура в Интернете
  4. 4. Пиринговые технологии 4
  5. 5. Минусы существующих пиринговых сетей - ну умеют работать с динамикой - медленные - установка “мутного” клиентского ПО - страдают “централизацией” 5
  6. 6. О проекте • опенсоурс проект на JavaScript • децентрализованная сеть • без DNS, без центральных серверов • поверх HTTP Возможности • собственные сайты, доменные имена • загрузка и чтение файлов, json-данных • блоги, комменты, фотоальбомы, плейлисты • чаты в реальном времени 6
  7. 7. Устройство сети 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
  8. 8. Карта сети - список всех нод 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
  9. 9. Информация о ноде 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
  10. 10. Серверная нода Веб-сервер + БД (NodeJS, SQLite3) Простой и быстрый KeyValue Storage 
 Функции: - пишет данные в распределенную базу (chain) - проверяет подпись автора - сообщает о себе другим нодам - реплицирует данные между нодами - уведомляет о добавлении данных
 10
  11. 11. • https://github.com/basenetwork/base.server-node/ Git Серверная нода 11
  12. 12. • sign(data, privateKey) • verify(data, sign, publicKey) • encode(data, publicKey) • decode(data, privateKey) Криптография на JavaScript - Эллиптические кривые secp256k1 - Длина ключа 256 бит (32 байта) - Минимальные функции: 12
  13. 13. Криптография на 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. 14. Клиент 14
  15. 15. 15
  16. 16. Под капотом 16
  17. 17. 17
  18. 18. 18
  19. 19. 19
  20. 20. Разработка клиентского приложения //============ MySiteEngine.js =================
 
 var baseAPI = basenetwork.getAPI(0); 
 
 // request current site information
 var siteInfo = baseAPI.getCurrentSiteInfo(); // -> {host,owner,title,ring…}
 
 20
  21. 21. Файлы. Пользователи // 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. 22. 22
  23. 23. Добавление данных в канал 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
  24. 24. Получение списка данных из канала 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
  25. 25. • https://github.com/basenetwork/client-js/ Git Клиентское ядро 25
  26. 26. • https://github.com/basenetwork/site-engiene-js/ Git Сайтовый движок 26
  27. 27. 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
  28. 28. 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
  29. 29. React.JS Chat //====== Register Chat Component ========== 
 $component('chat', Page, { 
 tplChildForm: MessageNew,
 tplChildItem: Message
 }); 29
  30. 30. • http://base.network/ • https://github.com/basenetwork Ссылки 30
  31. 31. Перспективы развития WebRTC Client IndexedDB Client IndexedDB Proxy server - Нативная криптография через window.crypto - WebRTC, IndexedDB - Расширение функционала - Приватные чаты 31
  32. 32. base.network Пиринговая сеть на JavaScript Денис Глазков 2016 Вопросы? 32

×