SlideShare uma empresa Scribd logo
1 de 60
Интеграция JavaScript
приложений с блокчейн
PROFESSIONAL JS CONFERENCE
8-9 NOVEMBER ‘19 KYIV, UKRAINE
Немного про меня
dmytro.zharkov@gmail.com
http://bit.ly/2FAm3Lr
https://bit.ly/33wIY2h
Люблю свою работу. В разработке никогда
не скучно. Всегда есть чему научиться и
поделиться с другими.
Блокчейн - это больше чем крипто валюта
PROFESSIONAL JS CONFERENCE 8-9
Системы снабжений, цепи поставок.
Цифровая идентификация.
Здравоохранение.
Токенизация, оцифровка активов.
Голосование.
NOVEMBER ‘19 KYIV, UKRAINE
Области применения блокчейн
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Крупные игроки уже внедряют блокчейн
Демо приложение. Обзоры супергероев
Демо приложение. Обзоры супергероев
Блокчейн, децентрализованные приложения
SPA
+
Smart contract
=
DApp
(decentralized application)
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Смарт контракты (Smart contracts)
Код исполняющийся в децентрализованных сетях.
Solidity, C++.
Это как backend сервис.
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
DApp сети
Ethereum Tron EOS
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
JSON RPC
Стандарт обмена данными.
Не зависит от транспортного протокола.
Только один метод для HTTP/S – POST.
Данные в JSON формате.
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
JSON RPC ЗАПРОС
fetch("https://superheroes.com/rpc", {
method: "POST",
body: JSON.stringify({
method: "getSuperHeroes",
params: ["marvel"], id: 123 }
}));
Ethereum JSON RPC ЗАПРОС
fetch("https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105bf", {
method: "POST",
body: JSON.stringify({
params: [{
data: "0x8261cf2b",
to: "0xFB3716816d93168788d306fCEab06636CA44682D"
}, "latest"],
jsonrpc: "2.0",
method: "eth_call", id: 1
})
});
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
JSON ABI
Application binary interface.
Получается при сборке или деплойменте контракта.
Спецификация смарт контракта в формате JSON.
Содержит описание контракта, методов, аргументов
полей и т.д.
JSON RPC ЗАПРОС без параметров
fetch("https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105bf", {
method: "POST",
body: JSON.stringify({
params: [{
data: "0x8261cf2b",
to: "0xFB3716816d93168788d306fCEab06636CA44682D"
}, "latest"],
jsonrpc: "2.0",
method: "eth_call", id: 1
})
});
подпись метода
адрес контракта
JSON RPC ЗАПРОС с параметром
Ethereum JSON RPC запрос с параметром. getHero(10)
fetch("https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105b405f", {
method: "POST",
body: JSON.stringify({
params: [{
data: "0x21d801110000000000000000000000000000000……….a",
to: "0xFB3716816d93168788d306fCEab06636CA44682D"},
"latest"
], jsonrpc: "2.0",
method: "eth_call", id: 1
})
});
подпись метода 10 в шестнадцатеричной системе
Про кучу нулей мы погорим чуть позже
Tron JSON RPC запрос с параметром. getHero(10)
fetch("https://api.shasta.trongrid.io/wallet/triggersmartcontract", {
method: "POST",
body: JSON.stringify({
contract_address: "415acf1f5da4df144ebdbe04cc1ac2059b8c3bafc1",
owner_address: "415acf1f5da4df144ebdbe04cc1ac2059b8c3bafc1",
function_selector: "getHero(uint256)",
parameter : "00000000000000000000000000000000000000000...a",
})
});
подпись метода
10 в шестнадцатеричной системе
8-9
Результат. getHero(10)
0000000000000000000000000000000000000000000000000000000
0000000200000000000000000000000000000000000000000000000
0000000000000000050000000000000000000000000000000000000
0000000000000000000000000a00000000000000000000000000000
0000000000000000000000000000000000e00000000000000000000
0000000000000000000000000000000000000000001400000000000
0000000000000000000000000000000000000000000000000001800
0000000000000000000000000000000000000000000000000000000
0000000b44616e20416272616d6f760000000000000000000000000
0000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000dgfgdhhh…
На первый взгляд все «понятно»…
32 байтные подстроки = 64 символа
0000000000000000000000000000000000000000000000000000000
00000000A – id героя
…
44616e20416272616d6f76000000000000000000000000000000000
000000000 – имя героя
…
000000000000000000000000000000000000000000004a617661536
372697074… - категория героя
Таблицы ASCII – коды символов между форматами
Декодирование результатов. Строки. getHero(10)
function hexToAscii(hexString) {
let str = ’’;
for (let n = 0; n < hex.length; n += 2) {
str += String.fromCharCode(parseInt(hexString.substr(n, 2), 16));
}
return str;
}
hexToAscii('53757065726d616e'); // Superman
Декодирование результатов. Числа. getHero(10)
function hexadecimalNumberToDecimal(hexNumber) {
return parseInt(hexNumber, 10);
}
hexadecimalNumberToDecimal(0xA); // 10
Я надеюсь вы все еще со мной!?
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
JavaScript библиотеки
TronWEBWeb3JS
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Что могут блокчейн библиотеки ?
Инкапсулировать логику запросов.
Кодировать/декодировать параметры и результаты.
Взаимодействовать с крипто кошельками и расширениями.
Предоставлять информацию о сети и др.
Пример работы с Web3JS. Все просто!
import Web3 from 'web3';
import superheroesABI from './build/contracts/Superheroes.json';
const web3 = new Web3();
const myContract = new web3.eth.Contract(
superheroesABI,
https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105b405f’
);
myContract.methods.getSuperHeroes().call();
myContract.methods.getHero(10).call();
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Магия!
Пример работы с TronWeb. Все просто!
import * as TronWeb from "tronweb";
const tronweb = new TronWeb({
fullNode: "https://api.shasta.trongrid.io",
solidityNode: 'https://api/somesolidity.io'
});
const contract = await tronweb.contract().at(“412573…..d07dcf0f06f1ac948708”);
contract.getSuperHeroes().call();
contract.getHero(10).call();
Постой! А что на счет операций записи?
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Операции записи в блокчейн. Транзакции
Требуют:
Учётной записи в сети.
Подписи ключом.
Дополнительных расширений - плагинов.
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Блокчейн браузерные расширения
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Функции блокчейн браузерныx расширений.
Хранить информацию о учетных записях и ключах.
Глобальные переменные с учетной информацией.
Взаимодействовать с JavaScript библиотеками.
Подписывать транзакции.
Хранить информацию о крипте и других токенах.
Транзакции с Web3JS и MetaMask
Транзакции с TronWeb и TronLink
contract
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19
Эфир медленный, очень медленный.
Подпись на события в сети Ethereum.
const socket = new WebSocket( 'wss://ropsten.infura.io/ws/v3/084897e',);
socket.addEventListener('open', (event) => {
const request = { // On hero created event
id: 3,
method: 'eth_subscribe',
params: ['logs', {
topics: [ABI.abi.signature],
address: ABI.networks.address
}]
};
socket.send(JSON.stringify(request));
});
Получение событий в сети Ethereum.
socket.addEventListener('message', (event) => {
const data = JSON.parse(event.data);
const web3 = new Web3();
const decoded = web3.eth.abi.decodeLog(
functionABI.inputs,
data.params.result.data,
data.params.result.topics);
const [author, mark, text] = decoded;
});
События с Web3JS. Все просто!
://ropsten.infura.io/v3/084897e
EOS – новый уровень!
EOS JSON ABI
Таблицы EOS
TABLE Review {
uint64_t id;
uint64_t superhero_id;
uint64_t mark;
string review_text;
auto primary_key() const { return id; }
uint64_t by_superheroid() const {return superhero_id; }
};
typedef multi_index<"reviews"_n, Review> reviews_table;
Запросы к EOS. Другой уровень!
fetch('http://jungle2.cryptolions.io:80/v1/chain/get_table_rows', {
method: 'POST',
body: JSON.stringify({
'json': true,
'code': 'superheroes',
'scope': 'superheroes',
'table': 'heroes'
}
)
});
Запросы к EOS. Другой уровень!
fetch('https://jungle2.cryptolions.io/v1/chain/get_table_rows', {
method: 'POST',
body: JSON.stringify({
'json’: true,
'code': 'superheroes',
'scope': 'superheroes',
'table': 'reviews',
'table_key': 'superhero_id',
'key_type': 'i64',
'index_position': 2,
'lower_bound': 1,
'upper_bound': 1
})
});
EOSJS
import { JsonRpc } from 'eosjs';
const rpc = new JsonRpc(‘https://jungle2.cryptolions.io‘, {fetch});
rpc.get_table_rows({
'json': true,
'code': 'superheroes',
'scope': 'superheroes',
'table': 'reviews',
'table_key': 'superhero_id',
'key_type': 'i64',
'index_position': 2,
'lower_bound': 1,
'upper_bound': 1
}).
Транзакции EOSJS
import { Api } from 'eosjs';
import {JsSignatureProvider} from 'eosjs/dist/eosjs-jssig';
const rpc = new JsonRpc(‘https://jungle2.cryptolions.io‘, {fetch});
const signatureProvider = new JsSignatureProvider([‘somekey’]);
const api = new Api({
rpc,
signatureProvider,
textDecoder: new TextDecoder(),
textEncoder: new TextEncoder()
});
Транзакции EOSJS
api.transact({
actions: [{
account: 'superheroes',
name: 'addhero',
authorization: [{ actor: 'superheroes’, permission: 'active'}],
data: {
superhero_name: 'Hulk',
avatar: ‘http://someavatar.com/test.jpg',
category: ‘Marvel',
description: 'Super strong'
},}]},
{
blocksBehind: 3,expireSeconds: 30
});
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
DApp сети очень похожи
Ethereum Tron EOS
✅ Smart contracts
✅ JSON ABI
✅ JSON RPC
✅ JS API, Web3JS
✅ Smart contracts
✅ JSON ABI
✅ JSON RPC
✅ JS API, TronWeb
✅ Smart contracts
✅ JSON ABI
✅ JSON RPC
✅ JS API, EOSJS
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Важные моменты в блокчейн сетях.
Возвращаемые значения
Solidity в текущей версии не поддерживает объекты
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Важные моменты в блокчейн сетях.
Кодирование/декодирование данных
Из шестнадцатеричного/base64/base32.
В десятичный, строковый.
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Важные моменты в блокчейн сетях.
Большие числа:
Максимальное значение числа в JavaScript : 253-1.
Максимальное значение числа uint256 в EVM : 2256-1.
Решаемо с bignumber.js
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Важные моменты в блокчейн сетях.
Подпись транзакций (операций записи).
С помощью MetaMask, TronLink, EOSAuthenticator.
Скорость выполнения транзакций в Ethereum.
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Ресурсы
Обучение:
https://cryptozombies.io/
https://battles.eos.io/
Демки:
https://github.com/DmitriyNoa/angular-ethereum-decentralized-application
https://github.com/DmitriyNoa/eos-superheroes
PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Спасибо за внимание!

Mais conteúdo relacionado

Mais procurados

CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
Dmitry Evteev
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 
Web весна 2012 лекция 11
Web весна 2012 лекция 11Web весна 2012 лекция 11
Web весна 2012 лекция 11
Technopark
 
Web осень 2012 лекция 11
Web осень 2012 лекция 11Web осень 2012 лекция 11
Web осень 2012 лекция 11
Technopark
 

Mais procurados (20)

Подводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyПодводные камни System.Security.Cryptography
Подводные камни System.Security.Cryptography
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
web_serivces
web_serivcesweb_serivces
web_serivces
 
Володимир Семенякін “Demiurg. Приручення заліза”
Володимир Семенякін “Demiurg. Приручення заліза”Володимир Семенякін “Demiurg. Приручення заліза”
Володимир Семенякін “Demiurg. Приручення заліза”
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2
 
Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1
 
Web весна 2012 лекция 11
Web весна 2012 лекция 11Web весна 2012 лекция 11
Web весна 2012 лекция 11
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Web осень 2012 лекция 11
Web осень 2012 лекция 11Web осень 2012 лекция 11
Web осень 2012 лекция 11
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
directx
directxdirectx
directx
 

Semelhante a JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate JavaScript frontend applications with a blockchain

Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Ontico
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
Andrey Karpov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 

Semelhante a JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate JavaScript frontend applications with a blockchain (20)

Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиковДмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
«Облачный» сервис интеллектуального анализа данных. графический интерфейс пос...
«Облачный» сервис интеллектуального анализа данных. графический интерфейс пос...«Облачный» сервис интеллектуального анализа данных. графический интерфейс пос...
«Облачный» сервис интеллектуального анализа данных. графический интерфейс пос...
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Виктор Грищенко
Виктор ГрищенкоВиктор Грищенко
Виктор Грищенко
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в коде
 
Devcamp nodejs-2010
Devcamp nodejs-2010Devcamp nodejs-2010
Devcamp nodejs-2010
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...
Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...
Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 

Mais de JSFestUA

Mais de JSFestUA (20)

JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
 
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript PerformanceJS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
 
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
 
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
 
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
 
JS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstackJS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstack
 
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
 
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developersJS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
 
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
 
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
 
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the ScaleJS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
 
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratchJS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
 
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотятJS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
 
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for RustJS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
 
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
 
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проектіJS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
 
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядроJS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
 
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
 
JS Fest 2019. Виктор Турский. 6 способов взломать твое JavaScript приложение
JS Fest 2019. Виктор Турский. 6 способов взломать твое JavaScript приложениеJS Fest 2019. Виктор Турский. 6 способов взломать твое JavaScript приложение
JS Fest 2019. Виктор Турский. 6 способов взломать твое JavaScript приложение
 

JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate JavaScript frontend applications with a blockchain

  • 1. Интеграция JavaScript приложений с блокчейн PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
  • 2. Немного про меня dmytro.zharkov@gmail.com http://bit.ly/2FAm3Lr https://bit.ly/33wIY2h Люблю свою работу. В разработке никогда не скучно. Всегда есть чему научиться и поделиться с другими.
  • 3. Блокчейн - это больше чем крипто валюта
  • 4. PROFESSIONAL JS CONFERENCE 8-9 Системы снабжений, цепи поставок. Цифровая идентификация. Здравоохранение. Токенизация, оцифровка активов. Голосование. NOVEMBER ‘19 KYIV, UKRAINE Области применения блокчейн
  • 5. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Крупные игроки уже внедряют блокчейн
  • 9. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Смарт контракты (Smart contracts) Код исполняющийся в децентрализованных сетях. Solidity, C++. Это как backend сервис.
  • 10. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE DApp сети Ethereum Tron EOS
  • 11.
  • 12. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE JSON RPC Стандарт обмена данными. Не зависит от транспортного протокола. Только один метод для HTTP/S – POST. Данные в JSON формате.
  • 13. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE JSON RPC ЗАПРОС fetch("https://superheroes.com/rpc", { method: "POST", body: JSON.stringify({ method: "getSuperHeroes", params: ["marvel"], id: 123 } }));
  • 14. Ethereum JSON RPC ЗАПРОС fetch("https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105bf", { method: "POST", body: JSON.stringify({ params: [{ data: "0x8261cf2b", to: "0xFB3716816d93168788d306fCEab06636CA44682D" }, "latest"], jsonrpc: "2.0", method: "eth_call", id: 1 }) });
  • 15. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE JSON ABI Application binary interface. Получается при сборке или деплойменте контракта. Спецификация смарт контракта в формате JSON. Содержит описание контракта, методов, аргументов полей и т.д.
  • 16.
  • 17.
  • 18. JSON RPC ЗАПРОС без параметров fetch("https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105bf", { method: "POST", body: JSON.stringify({ params: [{ data: "0x8261cf2b", to: "0xFB3716816d93168788d306fCEab06636CA44682D" }, "latest"], jsonrpc: "2.0", method: "eth_call", id: 1 }) }); подпись метода адрес контракта
  • 19. JSON RPC ЗАПРОС с параметром
  • 20.
  • 21. Ethereum JSON RPC запрос с параметром. getHero(10) fetch("https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105b405f", { method: "POST", body: JSON.stringify({ params: [{ data: "0x21d801110000000000000000000000000000000……….a", to: "0xFB3716816d93168788d306fCEab06636CA44682D"}, "latest" ], jsonrpc: "2.0", method: "eth_call", id: 1 }) }); подпись метода 10 в шестнадцатеричной системе Про кучу нулей мы погорим чуть позже
  • 22. Tron JSON RPC запрос с параметром. getHero(10) fetch("https://api.shasta.trongrid.io/wallet/triggersmartcontract", { method: "POST", body: JSON.stringify({ contract_address: "415acf1f5da4df144ebdbe04cc1ac2059b8c3bafc1", owner_address: "415acf1f5da4df144ebdbe04cc1ac2059b8c3bafc1", function_selector: "getHero(uint256)", parameter : "00000000000000000000000000000000000000000...a", }) }); подпись метода 10 в шестнадцатеричной системе
  • 24. На первый взгляд все «понятно»…
  • 25. 32 байтные подстроки = 64 символа 0000000000000000000000000000000000000000000000000000000 00000000A – id героя … 44616e20416272616d6f76000000000000000000000000000000000 000000000 – имя героя … 000000000000000000000000000000000000000000004a617661536 372697074… - категория героя
  • 26. Таблицы ASCII – коды символов между форматами
  • 27. Декодирование результатов. Строки. getHero(10) function hexToAscii(hexString) { let str = ’’; for (let n = 0; n < hex.length; n += 2) { str += String.fromCharCode(parseInt(hexString.substr(n, 2), 16)); } return str; } hexToAscii('53757065726d616e'); // Superman
  • 28. Декодирование результатов. Числа. getHero(10) function hexadecimalNumberToDecimal(hexNumber) { return parseInt(hexNumber, 10); } hexadecimalNumberToDecimal(0xA); // 10
  • 29. Я надеюсь вы все еще со мной!?
  • 30. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE JavaScript библиотеки TronWEBWeb3JS
  • 31. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Что могут блокчейн библиотеки ? Инкапсулировать логику запросов. Кодировать/декодировать параметры и результаты. Взаимодействовать с крипто кошельками и расширениями. Предоставлять информацию о сети и др.
  • 32. Пример работы с Web3JS. Все просто! import Web3 from 'web3'; import superheroesABI from './build/contracts/Superheroes.json'; const web3 = new Web3(); const myContract = new web3.eth.Contract( superheroesABI, https://ropsten.infura.io/v3/084897e338f14cbea8e0d249105b405f’ ); myContract.methods.getSuperHeroes().call(); myContract.methods.getHero(10).call();
  • 33. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Магия!
  • 34. Пример работы с TronWeb. Все просто! import * as TronWeb from "tronweb"; const tronweb = new TronWeb({ fullNode: "https://api.shasta.trongrid.io", solidityNode: 'https://api/somesolidity.io' }); const contract = await tronweb.contract().at(“412573…..d07dcf0f06f1ac948708”); contract.getSuperHeroes().call(); contract.getHero(10).call();
  • 35. Постой! А что на счет операций записи?
  • 36. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Операции записи в блокчейн. Транзакции Требуют: Учётной записи в сети. Подписи ключом. Дополнительных расширений - плагинов.
  • 37. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Блокчейн браузерные расширения
  • 38. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Функции блокчейн браузерныx расширений. Хранить информацию о учетных записях и ключах. Глобальные переменные с учетной информацией. Взаимодействовать с JavaScript библиотеками. Подписывать транзакции. Хранить информацию о крипте и других токенах.
  • 40. Транзакции с TronWeb и TronLink contract
  • 41.
  • 42. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 Эфир медленный, очень медленный.
  • 43. Подпись на события в сети Ethereum. const socket = new WebSocket( 'wss://ropsten.infura.io/ws/v3/084897e',); socket.addEventListener('open', (event) => { const request = { // On hero created event id: 3, method: 'eth_subscribe', params: ['logs', { topics: [ABI.abi.signature], address: ABI.networks.address }] }; socket.send(JSON.stringify(request)); });
  • 44. Получение событий в сети Ethereum. socket.addEventListener('message', (event) => { const data = JSON.parse(event.data); const web3 = new Web3(); const decoded = web3.eth.abi.decodeLog( functionABI.inputs, data.params.result.data, data.params.result.topics); const [author, mark, text] = decoded; });
  • 45. События с Web3JS. Все просто! ://ropsten.infura.io/v3/084897e
  • 46. EOS – новый уровень!
  • 48. Таблицы EOS TABLE Review { uint64_t id; uint64_t superhero_id; uint64_t mark; string review_text; auto primary_key() const { return id; } uint64_t by_superheroid() const {return superhero_id; } }; typedef multi_index<"reviews"_n, Review> reviews_table;
  • 49. Запросы к EOS. Другой уровень! fetch('http://jungle2.cryptolions.io:80/v1/chain/get_table_rows', { method: 'POST', body: JSON.stringify({ 'json': true, 'code': 'superheroes', 'scope': 'superheroes', 'table': 'heroes' } ) });
  • 50. Запросы к EOS. Другой уровень! fetch('https://jungle2.cryptolions.io/v1/chain/get_table_rows', { method: 'POST', body: JSON.stringify({ 'json’: true, 'code': 'superheroes', 'scope': 'superheroes', 'table': 'reviews', 'table_key': 'superhero_id', 'key_type': 'i64', 'index_position': 2, 'lower_bound': 1, 'upper_bound': 1 }) });
  • 51. EOSJS import { JsonRpc } from 'eosjs'; const rpc = new JsonRpc(‘https://jungle2.cryptolions.io‘, {fetch}); rpc.get_table_rows({ 'json': true, 'code': 'superheroes', 'scope': 'superheroes', 'table': 'reviews', 'table_key': 'superhero_id', 'key_type': 'i64', 'index_position': 2, 'lower_bound': 1, 'upper_bound': 1 }).
  • 52. Транзакции EOSJS import { Api } from 'eosjs'; import {JsSignatureProvider} from 'eosjs/dist/eosjs-jssig'; const rpc = new JsonRpc(‘https://jungle2.cryptolions.io‘, {fetch}); const signatureProvider = new JsSignatureProvider([‘somekey’]); const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() });
  • 53. Транзакции EOSJS api.transact({ actions: [{ account: 'superheroes', name: 'addhero', authorization: [{ actor: 'superheroes’, permission: 'active'}], data: { superhero_name: 'Hulk', avatar: ‘http://someavatar.com/test.jpg', category: ‘Marvel', description: 'Super strong' },}]}, { blocksBehind: 3,expireSeconds: 30 });
  • 54. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE DApp сети очень похожи Ethereum Tron EOS ✅ Smart contracts ✅ JSON ABI ✅ JSON RPC ✅ JS API, Web3JS ✅ Smart contracts ✅ JSON ABI ✅ JSON RPC ✅ JS API, TronWeb ✅ Smart contracts ✅ JSON ABI ✅ JSON RPC ✅ JS API, EOSJS
  • 55. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Важные моменты в блокчейн сетях. Возвращаемые значения Solidity в текущей версии не поддерживает объекты
  • 56. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Важные моменты в блокчейн сетях. Кодирование/декодирование данных Из шестнадцатеричного/base64/base32. В десятичный, строковый.
  • 57. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Важные моменты в блокчейн сетях. Большие числа: Максимальное значение числа в JavaScript : 253-1. Максимальное значение числа uint256 в EVM : 2256-1. Решаемо с bignumber.js
  • 58. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Важные моменты в блокчейн сетях. Подпись транзакций (операций записи). С помощью MetaMask, TronLink, EOSAuthenticator. Скорость выполнения транзакций в Ethereum.
  • 59. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Ресурсы Обучение: https://cryptozombies.io/ https://battles.eos.io/ Демки: https://github.com/DmitriyNoa/angular-ethereum-decentralized-application https://github.com/DmitriyNoa/eos-superheroes
  • 60. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE Спасибо за внимание!

Notas do Editor

  1. Добрый вечер ) Какой классный фестиваль! Интересные темы, Отличные докладчики и супер аудитория! -Очень рад видеть столько людей пришедших сюда, несмотря на то что это окончание второго дня Феста, спасибо что присоединились ко мне. -Сегодня я бы хотел поговорить о, сюрприз сюрприз – JavaScript, но не в совсем обычном контексте – а именно в контексте Блокчейн. -Посмотреть на Блокчейн со стороны JavaScript, фронтенд разработчика. -Понять как Блокчейн и децентрализованные сети отличаются от традиционных бэкендов к которым мы все привыкли, таких как REST или GraphQL.- -Разобраться в особенностях обмена данными, построении и отправки запросов, -Показать доступные инструменты и библиотеки
  2. Наверное большинство из вас слышало про Блокчейн и не раз. То слышал? А кто сталкивался на работе? В последнее время о нем говорили все кому не лень; в соц сетях, мас медиа,люди технические а так же очень далекие от техники. -Но на самом деле почти все они говорили – о крипто валютах. -А это только маленький частый случай использования Блокчейн. -Сегодня мы не будем говорить а крипто валютах. А посмотрим на реальные возможности блокчейн в других областях жизни и промышленности.
  3. Что такое блокчен? В упрощенной форме это сеть компьютеров объединённых общим программным обеспечением и консенсус алгоритмом – алгоритмом который позволяет валидировать, проверять обработку данных и гарантировать безопасность. прозрачность и подлинность дынных. Отсутствие единого сервера и единого владельца и делает технологию привлекательной в процессах с множеством участников, которым необходимы прозрачность, безопасность. На пример. Цепи снабжения или поставок. Товар проходит множество этапов пока доберётся от поставщика до потребителя. Это и доставка от фабрики к транспортеру – перевозчику авиа или судопевозки. Потом хранения на складе, перевозка мастными фирмами доставки. И тд. Все эти процессы могут осуществляться разными фирмами и должны быть отслуживаемыми и задокументированными. Цифровая идентификация – как еже паспорт с вашими данными. Это и ваша уникальная цифровая подпись. Которая позволит работать и официально подписывать электронные документы. Здравоохранения – ваша единая мед карточка. Централизованное место для хранения информации и вас и вашем здравье, которая будет храниться в зашифрованном виде. Сейчас чаще всего приходиться бегать со всякими бумажками, справками и физическими карточками что не удобно и не эффективно. Токенизация это репрезентация физических активов в цифровом виде, подтверждение владения, на пример права на драгоценные металлы, предметы искусства, недвижимость. Ну и имея уникальную идентификацию как рассказано выше – мы можем безопасно голосовать.
  4. Эти сферы применения уже отражают крупные компании которые внедряют блокчейн в свои системы,
  5. Что бы сделать разговор более предметны, практическим и интересным я приготовил демо приложение - Система отзывов и обзоров супергероев. Снова таки – мы хотим что бы данные и отзывы были честными и не поддельными, на пример сторонней компанией – потому блокчейн как раз то что нужно. Приложение позволяет просматривать список супергероев. Фильтровать по категории-вселенной, Марвел, ДиСм ну и JavaScript,так как в нем то же есть свои герои
  6. Переходить на детальную страницу о герое. Просматривать подробную информацию и оставлять отзывы.
  7. Приложения работающие с блокчейн называются децентрализованные приложения. Рецепт в целом прост – берем SPA, Single Page application (React или Angular) ан пример. Добавляем к нему Смарт контракт (Умный контракт) И получаем децентрализованное приложение – Decentralized application ну или просто dApp
  8. -Смарт контракт это код который исполняется в сети блокчейн. -Результаты и факт выполнения этого кода будет сохранен для всех участников сети, на всех узлах. -Чаше всего это код программа написанная на языке Solidity (проприоретарный язык) написанный сп-ециально для блокчейн сетей. -Или написанный на С++. -Я люблю воспринимать Смарт контракты как особенный и не стандартный бэкенд сервис.
  9. Мы посмотрим на 3 самые распространенные сети для разработки децентрализованных приложений . Эфир, Трон, и EOS. Эфир и трон очень похожи: потому я сначала покажу их и потом мы поговорим про EOS.
  10. -Пример архитектуры распределенного приложения. Для сети Эфир И Трон У нас есть пользователь, который запрашивает веб страницу. И это простая веб страница которая размещена на обычном хостинге или в облачном хранилище, как AWS или GoogleCloud. -Страница делает запрос на нод (узел в сети). -Запросы производиться на основе JSON RPC. -Каждый узел или компьютер в сети хранит копию контракта -На узле запущенная Виртуальная машина Эфира – EVM, Ethereum Virtual Machine которая выполняет код смарт контракта, Он так же имеет сетевую надстройка которая позволяет совершать JSON RPC запросы. Так же видно что ноды постоянно синхронизируются между собой по P2P соединению без участия центрального сервера
  11. -Что такое RPC ли JSON RPC? -Кто ни будь сталкивался или работал с RPC сервисами?- RPC это описание того как две удаленные программы могут обмениваться данными с друг другом (к примеру программа на сервере и на клиента). Он не зависит транспортного протокола. То есть может применяться в HTTP на пример, веб сокетах, P2P соединениях. В случае HTTP – используется только один метод – POST и для отправки и для получения данных. Ну и использует данные в формате JSON.
  12. Запрос для RPC сервиса может выглядеть следующим образом. Скажем мы хотим получить список героев. Мы отправляем, всегда!, POST запрос, и это очень странно, Потому что обычно если мы получить данные то почти всегда выполняем GET. Далее в теле запроса мы передаем имя метода или функции которую хотим вызвать на сервере и если нужно какие то дополнительные параметры. И вроде все понятно. Да?
  13. Но не в случае с блокчейн. Тут я делаю запрос на узел эфира. Ropsten это тестовая сеть эфира. И в теле запроса я передаю не человеко понятные значения data и to. Единственно что более менее понятно – свойство метод. ETH_CALL. Этим я говорю – ей виртуальная машина Эфира – выполни такой то метод и используй параметры выше. Но вопрос откуда мы возьмем этот ужас, свойства data и to?
  14. Ответ из JSON ABI. Расшифруется как Application binary interface. Это JSON файлик который получается при деплойменте или сборке контракта. Фактически это спецификация контракта в формате JSON – которая говорит как работать с контрактом, это как Swagger спецификация для REST сервисов. Содержит описание методов, их параметров, возвращаемых значений и т.д.
  15. Выглядит это примерно вот так: У нас есть – название контракта – Superheroes. Свойство abi – которое содержит массив со всей нужной и главной для нас информацией, Так же поле адрес – это уникальный адрес данного контракта в сети блокчейн, как URL для сервисов. Заглянем внутрь одного из методов в массиве ABI.
  16. У нас есть имя метода. Get super heroes Полу inputs – это параметры метода. В данном случае поле пустое – потому что мы просто получаем список всех героев. Поле outputs это описание возвращаемых значений и их типов. У нас есть ID героя, тип unsigned integer 256, имя героя – строка. Поле signature – ID укороченное имя или подпись метода.
  17. Теперь у нас есть вся информация что бы сделать запрос для получения списка героев. Свойство data – содержит подптсь метода. И поле to – адрес контракта Это был запрос без параметра. Но что если нам нужно вызвать метод с параметрами?
  18. На пример – страница героя. Мы делаем запрос по его имени или скажем ID?
  19. В этот раз если обратиться к ABI. Снова видим название метода – getHero, получить героя. Поле inputs более не пустое. Метод принимает параметр ID - целочисленное значение. И подпись метода
  20. Скажем мы хотим получить героя с ID 10. Эфир запрос выглядит так. В свойство data так же как и в прошлый раз мы передаем подпись метода и далее соединяем ее числом 10 в шестнадцатеричном формате. 10 в шестнадцатеричном формате – это – A. Про кучу нулей перед A мы поговорим чуть позже
  21. Для сети Трона все примерно одинокого. Только сигнатура метода не кодируется – а передается просто строкой. И параметр передаётся в отдельном поле
  22. И эти запросы вернут нам ЭТО. И на первый взгляд это совсем полное безобразие.
  23. Мне напомнило код матрицы! Но в отличие от героев фильма матрица нам не нужно смотреть на это часами что бы увидеть «девушку в красном» и понять смысл. Мы можем обратиться к документации Эфира.
  24. Эфир разбивает информацию на 32 байтные пакеты. 32 байта вмешают – 64 строчных символа. Все храниться в шестнадцатеричном виде. И если мы разобьем строку на подстроки по 64 символа. Ситуация немного проясняется. Тут видно ID героя – A. A это 10 в десятичном формате. Имя героя. Категория. Нули впереди или позади значений это пустые байты.
  25. Для того что бы декодировать строку – нужно воспользоваться таблицами ASCII. ASCII это таблицы которые помогают конвертировать значения между форматами. Обычно у каждого символа у каждой буквы есть свой 2 значений код. На пример английская A – 41 Английская С – 43 тд
  26. Зная про таблицы мы можем написать следующий метод Он принимает шестнадцатеричную строку. Далее необходим пройти в цикле по строке: через каждые два символа (символы в ASCII – двухзначные значения). С parse Int переводим текущие 2 шестнадцатеричных символа в десятичное значение кода (совместимое с JS) И далее используем метод fromCharCode который вернет нам значение ASCII символа в unicode формате
  27. В случае с числами все просто – мы можем использовать parseInt который вернет число в десятичном виде.
  28. Фууух. Это было много всего! Я надеюсь вы все ещё со мной! И не сильно заскучали? Это моя дочь кстати, никогда не дает мне скучать. Дальше будет веселее!
  29. К счастью мы в мире JavaScript где для всего есть библиотеки и блокчейн не исключение. Эфир имеет чудесную библиотеку Web3JS и Трон идет со своей библиотекой, близнецом Web3 - TronWeb
  30. Что умеют библиотеки? Значительно упростить и инкапсулировать логику запросов. Кодировать и декодировать данные и параметры из шестнадцатеричного в десятичный и обратно Взаимодействовать с криптокашельками и бразуреными расширениями. О них чуть позже Предоставлять другую информацию о сети.
  31. Пример работы с Web3JS! Все очень просто! Web3 позволяет превратить ABI файл в объект с вызываемыми методами. Импортируем Web3JS Импортируем JSON файлик с ABI. Тут поможет Webpack. Создаем новый экземпляр Web3 Создам экземпляр контракта. Передаем в него адрес узла. И объект с ABI, И в итоге теперь мы можем вызывать методы просто в одну строку. Метод getSuperheroes подговорит правильный запрос. Долее мы вызываем метод call который выполнить запрос и вернет стандартный JavaScript Promise с декодированными и читабельными результатами! Запрос с параметром – все так же просто; Просто передаем параметр в обычном вид и Web3JS сделает всю нужную кодировку сам! Магия!
  32. С TronWeb - ситуация еще проще. Нам нужно знать только адрес контракта и адрес узла-сервера. Мы так же импортируем TronWeb Создаем экземпляр TronWeb и передаем в него адрес – URL нода. Вызываем функцию контракт и передаем ей адрес контракта. TronWeb вcе сделает сам. Получит ABI и трансформирует его в объект. И снова мы можем вызывать методы в одну строку, Все будет сделано за нас под капотом!
  33. Но тут вы можете заметить! Это же все были примеры запросов чтения. Мы ничего не записывали! Как на счет записи в блокчейн?
  34. И будете правы! Операции записи в блокчейн – обычно называемыми транзакциями – это отдельный случай! Потому как они требуют! Учетной записи в сети! Подписи транзакции ключом! Дополнительных расширений или плагинов!
  35. Фактически все блокчейн сети имеют свои уже готовые браузерные расширения! Для Эфира – это MetaMask и для Трона это TronLink
  36. Эти расширения позволяют: Создавать учетные записи в сети и хранить о них информацию. Учетная запись в сети это комбинация из публичного и приватного ключей. Инжектить в браузеры глобальную переменную с информацией о сети и записи. Взаимодействовать с JS библиотеками. Подписывать транзакции Хранить информацию и крипте и других токенах! То есть еще выполнять функцию кошелька !
  37. Транзакция с Web3JS и MetaMask для Эфира Выглядит так. Мы так же само используем Web3JS для получения объекта из ABI, как в примере ранее, И просто вызываем метод addHero и передаем в него данные героя. В обычном формате. В конце вызываем метод send (если помните для операций чтения ранее это был метод call) и он принимает адрес пользователя. Адрес пользователя доступен в Глобальной переменной предоставленной расширением MetaMask
  38. Ситуация с TronWeb – снова похожа. На полученом ранее объекте – вызываем метод addHero. Передаем в него дынные! И зовем метод send!
  39. Выглядит это примерно так. Когда пользователь заполняет данные и жмет подтвердить. Мы вызываем код показанный на прошлом слайде. Браузерный плагин слушает когда происходит вызов функции send и предлагает подписать транзакцию! Тут так же видно что транзакция не бесплатна и в большинстве случаем ложиться на плечи пользователя. В данном случае это стоит 4 десятитысячные эфира что по текущему курсу примерно – 7 центов. Дальше транзакция отправляться на выполнение и это может занять время.
  40. И в случае с Эфиром это может быть долго. Что бы вы понимали в Главной сети Эфира. Mainnet , в зависимости от нагрузки на сеть транзакция может выполнять минуту и больше. Даже в тест сети у меня в среднем время транзакции было около 30 секунд. Естественно мучать пользователя показывая ему бесконечный индикатор загрузки не очень хорошая практика. Для того что бы сделать это взаимодействие лучше и предоставить возможность получать обновления данных как только они становятся доступные Эфир – предоставляет События.
  41. События в эфире работают на основе веб сокетов. Это позволяет осуществлять двухстороннюю связь между клиентским приложениям и Смарт Контактом или между контрактами. То есть клиент может подписываться на серверные события и получать обновления. На пример как только создаться новый герой или поступает новый отзыв о герое – мы хотим сообщить об это пользователю или отобразить это в UI приложения. Для реализации этого непобедимо, Создать новый сокет с адресом Узла в сети. Тем самым мы открываем WSS соединения. Когда соединение открыто – нужно подписаться на событие которое нас интересует. Снова формируем JSON RPC запрос. В качестве вызываемого метода на эфире теперь ETH_SUBSCIBE. Имя события которое нас интересует передаётся в свойстве TOPICS. Значение мы снова таки берем из JSON ABI файла И дальше нужно просто отправить подписку на сервер.
  42. После этого мы можем слушать событие message на вебсокете. Данные приходят в шестнадцатеричном формате как и ранее и вот пример того как их можно расшифровать с помощью Web3JS. Вызываем метод Web3JS decodeLog и передаем в него полученные данные а так же описание события из ABI файла
  43. Но Web3JS делает процесс ещё проще. Так как и ранее мы можем сформировать объект из ABI файла. И на нем будут доступные для вызова функции подписи на события. На пример NewHero формирует подпись на событие и возвращает объект с методом ON c параметром data и callllback функцией. Web3 сделает все за нас. Откроет веб сокет соединение. Подпишется на события и декодирует результаты. Tron работает на много быстрее и события не так важны.
  44. Пришло время поговорить об EOS. EOS2.0 – новейшее поколение блокчейн разработанное с мыслью о разработчиках. И это делает работу с сетью на много приятней и проще.
  45. EOS так же выдает JSON ABI с описанием Смарт контакта. В принципе все похоже. Есть описание функций контракта. Они называться actions. Описание структур – таких как доступные форматы данных, публичные переменные и тд. Но самое интересное – это таблицы!
  46. Таблицы позволяют эффективно управлять данными. С стороны frontend разработчика наиболее интересно как мы можем делать запросы. Данный пример показывает некоторые возможности. Это C++ код, ну пугайтесь. Главная идея тут что мы можем получать отзывы не только по основному ключу как на пример ID но и по вторичным ключам. На пример я хочу получить все отзывы по определённому герою и таблицы позволяют это сделать. Ключь By_superhero_id - вернет все отзывы для героя.
  47. К примеру зарос за списком героев выглядит следующим образом. Запрашиваем get_table_rows на узле EOS. В теле запроса есть волшебное свойство json со значением true – это дает нам возможность прилучить данные уже в декодированном виде, бекенд сделает все за нас. Свойства CODE и SCOPE указывают название смартконтракта в сети И в свойстве table – передаём название таблицы. И ётот запрос вернет нам данные в читабильном виде. Массив с объектами героев. Никакой мороки стороны кода!
  48. Вот пример более сложного запроса, За отзывами по определенному герою. Снова указываем название таблицы – reviews. Название ключа – superhero_id Указываем что запрос идет по вторичному ключу. И передаем ID героя в upper и lower bound. В данном случае они одинаковые так как нам нужны отзывы по одному герою. Но так же можно указать промежуток значений. От и до
  49. EOS так же предоставляет JavaScript библиотеку EOSJS. В случае с простыми запросами чтения она не много упрощает работу. Импортируем JsonRpc из EOSJS Создаем экхемпляр JSON RPC и передаем в него URL узла в сети а так же класс для работы с запросами. С браузере нам достепн fetch И вызываем метод get table rows и передаем в него данные для запроса точно так же как и случае с работы с обычным fetch
  50. Транзакции в EOS более гибкие. Так как позволяют выбирать кто будет подписывать транзакции, Если в случае Эфира или Трона это пользователь, то в EOS можно переложить на владельцев контракта. И для пользователя в таком случае это будет скрыто. Это позволяет сделать Signature provider.Где вы можете указать подписчика. После мы создаем Экземпляр класса API. Предаем в него объект RPC созданный выше, подписчика а так же коддер и декодер для данных. ПО умолчанию это нативные JavaScript TextDecoder и TextEncoder
  51. После этого остается выполняить транзакцию. EOS позволяет выполнять пакеты транзакций. Можно передавать не одну а сразу много в массива actions. Свойство name принимает название метода которое нужно выполнить – addHero добавить героя. И в data передаем необходимые данные. EOS работает очень быстро. Сравнимо с классическими бекенд сервисами.
  52. Как мы могли убедиться – все они позволяют выполнять полезные действия с помощью Смарт Контрактов В всех есть JSON ABI – спецификация Контрактов, которая описывает доступные метода, свойства, типы данных в контракте. Вся связь, обмен данными происходит на JSON RPC. С единственным HTTP методом POST Ну и конечно для упрощения жизни – для всех доступны библиотеки. Которые я рекомендую использовать на production
  53. Некоторые важные моменты. Эфир и Трон на данный момент используют версию Solidity которая не поддерживает объекты. Это значит что даже при использовании библиотект данные вернуться в виде массива, Как на примере героя видно что мы получаем массив элементов. На Javascript мы можем использовать destructuring assignment для присвоения этих значений переменным. Если запрос был за списком героев к примеру – то вы получите массив массивов. В своем примере я использовал Экспериментальную версию компайлера Solidity которая позволяет вернуть нормальные объекты, Но к созданию она пока не рекомендована для production.
  54. Как мы видели ранее - для Сетей Эфира и Трона данные нужно кодировать/декодировать между различными форматами. Больщую чатсь работы на себя берут конечно Библиотеки – но важно понимать что этот факт имеет место быть.
  55. Еще одна особенность – это разница в числах. Solidity к примеру имеет намного болоьщие максимальные значения для целых чисел. Если для JavaScript максимальное значение числа – это 2 в 53 степени – 1 То для Solidity – это 2 в степени 256 – 1 что значитительно так больше. Естесвенно если передать такое число в JavaScript то ничего зорошего не выйдет. Если вам нужно произодить какие то действия с такими числами на фроненде – то есть отличная библиотека BigNuberJS. Но лучще конечно перенести все логику рабьоты с числами на СмартКонтракт.
  56. Ну и операции записи – или транзакции Требуют наличия дополнительных инструментов- таких как бразузерные плагины для подлписи транзакций Скорость выполнения транзакций в сети Эфир на данный момент оставляет желать лучшего. Ethereum foundation работает над этим и в скором времени обезает релиз Ethereum2.0 с новым консенсус алгоритмом который значительно увеличит скорость выполнения транцакий.
  57. На этом фактически все. Вот некоторые ресурсы которые вы можете использовать для обучения. Рекомендую КриптоЗобмби – это портал кторый позволяет обучиться основам работы с Ehtereum и Solidity в игровой форме, через содание игры. BattlesEOS сзодий портал но только для EOS А так же демо приложения показанные сегодня. Для всех 3 сетей
  58. На этом у меня все! Спасибо за внимание – вы супер аудитория.