JS Coin

Криптовалюта и блокчейн в браузере

за несколько выходных с нуля

Сергей Иванов, Александр Кочетков

Human Resource

На деле результат будет оптимален, если каждый член группы

сделает как лучше для себя и для других *

Часть 1

JS Weekdays

Еженедельные неформальные встречи любителей Javascript

Отправная точка

Учебный blockchain проект

Давай. Сели и написали

Приключения на 4 часа *

3(+1) выходных *

на создание MVP

Ожидания против реальности

Обмен контекстом

Самая дорогая операция

Hackathon?!

Без проблем не обошлось

Много заинтересованных, мало контрибьюторов

Часть написанного кода отправилась в корзину

На погружение в спецификации не всегда есть время

Весь интерфейс на одной странице

у нас получилось

Но мы здесь и значит

MVP

Blockchain

На самом деле это просто (Нет)

Часть 2

Blockchain

Блоки содержат данные и связаны через хеш

Непрерывная последовательная цепочка блоков

Где деньги?

В блоках записаны истории транзакций

Баланс считается суммой прихода и расхода

Транзакция

from: MEgCQQCVjANn/rmmX75eUPiSJyObigG7DOpub0s8EEY6TofP7gyFWdFcJSYwrzrG3Xj4rdwlDMKojuq9sgCeMxoGPpVjAgMBAAE=

to: MEgCQQDrpV0KEHfUiAMaZE72lWwh6X4wLPHrl+Sq4Q7R+nPAmuQvaVnI4zDaXuh6KxiK7odiU77iL5dpTINeYEY3v18BAgMBAAE=

amount: 5

time: 1517728637428

hash: 5ad0763f0270168e34961a6427e747c635dc8e2d3356b3035a7a482ce76325ca

signature: hGRPj9uCkRLNd/2KSP3QPZ7sYo8SqLbWlGDgEIidW4NZy4pAfdvfXvKT0Ynta5o17uyUhvzkvhWPl45EGCY84A==

RSA шифрование

(Rivest–Shamir–Adleman)

Пара private key / public key 

From и to - адрес кошелька, то есть public key

Signature - цифровая подпись

Можно использовать любое ассиметричное шифрование

Схема подписи транзакции

для проверки авторства

Mempool

Очередь неподтвержденных транзакций

После создания транзакция отправляется

в mempool каждому узлу

Майнинг ферма

Транзакция выбираются из mempool и пакуются в блок

Зачем майнить, где прибыль?

Награда за блок = эмиссия монет

Надежность

Proof of Work

Легко проверить, сложно подобрать

Сложность

sha256('JS is awesome') = 1010100101001110110000101101011110100110011111100110001010110000000111111011111011100000001001110111111001010010111010110101010011001000111111111000010100111001110010001001100111001001100001111000110001011011011000010100011001110001101001000100111000100111

sha256('JS is awesome 99828987') = 1111111111111111111111010011011101000010000100001111100111101011110010110110111011111101011000100101101100011100101001000001111011000111000011111000111111010010110100101101010100001010111101111010110000000000110011001010001111010111111000100010011110110001

Как формируется блок

Blockchain

Репликационная распределенная база данных

Децентрализация

На каждом узле своя копия блокчейна и свой mempool

Сеть состоит из независимых узлов

Обмен данными

Два типа сообщений: транзакции и блоки

Пришедшая по сети транзакция попадает в локальный mempool

Пришедшие валидные блоки заменяют локальные,

если их длина больше

Какой блокчейн настоящий?

Blockchain & Browser

Соединяем все воедино

Часть 3

3(+1) выходных

на создание MVP

Вспоминаем что ресурсы ограничены

Браузер это узел

Пользовательский интерфейс

Множество компонентов для отображения работы blockchain:

VueJS имеет низкий порог входа для новых участников

блоки, просмотр блока, транзакции, кошелек, mempool, статистика и тд

База данных

IndexedDB

openDatabase

cache API

localStorage

Для нас подойдет любое доступное хранилище в браузере

...

FileSystem API

Децентрализация

WebSockets

Необходимо установить постоянное peer-to-peer соединение

WebRTC

vs

Децентрализация

Способ простого абстрагирования над WebRTC

Предоставляет сигнальный сервер

Вычисления блоков

WebWorker

Не блокирует UI

RSA/SHA256

В браузере отсутствуют крипто-API *

Этого более

чем достаточно

Демонстрация

Схема создания блока

localStorage

Blockchain data #1

Установление peer-to-peer соединение

localStorage

Blockchain data #1

Схема создания блока

localStorage

Blockchain data #1

mempool

transaction #1

Создание транзакции

localStorage

Blockchain data #1

mempool

not set

Broadcast transaction

message

Blockchain API

Blockchain API

Схема создания блока

localStorage

Blockchain data #1

mempool

transaction #1

Обновление mempool для каждого peer

localStorage

Blockchain data #1

mempool

transaction #1

Blockchain API

Blockchain API

Схема создания блока

localStorage

Blockchain data #1

mempool

transaction #1

Майнинг блока

localStorage

Blockchain data #1

mempool

transaction #1

WebWorker

Blockchain API

Blockchain API

Схема создания блока

localStorage

Blockchain data #1

mempool

transaction #1

Майнинг блока

Blockchain API

localStorage

Blockchain data #2

mempool

not set

Blockchain API

Схема создания блока

localStorage

Blockchain data #1

mempool

transaction #1

Отправка обновленного blockhain

Blockchain API

localStorage

Blockchain data #2

mempool

not set

Blockchain API

Broadcast blockchain

message

Схема создания блока

localStorage

Blockchain data #2

mempool

not set

Обновлене blockchain для каждого peer 

Blockchain API

localStorage

Blockchain data #2

mempool

not set

Blockchain API

Открытый код

Приветствуются issues и merge requests

Сергей Иванов, @xufocoder

Александр Кочетков, kochetkov.online

Андрей Антонов, github.com/p9gehka

Денис Марокко, top@graine.ru

Ивахненко Дмитрий

Екатерина Куянец

Благодарность WIS Software

Вклад в учебный проект

за предоставленное рабочее пространство

и освещение проекта в сети

Frontend, WebSocket peers, WebRTC peers

Blockchain

Frontend, WebSocket peers

Frontend

Frontend

Логотип JS Coin

Благодарим за внимание

JS Coin

By Ufocoder