Blockchain and decentralized applications are getting used more and more often. Many big enterprises like IBM, Walmart, Alibaba, FedX, British Airways, and others are already integrating blockchain into their ecosystems.
As most of the applications on the web, decentralized applications require a client to make interaction with them user-friendly. I would like to share how to connect/integrate JavaScript applications with decentralized, blockchain services. Take a look at what are the differences between decentralized and standard backends, what challenges and issues developers might meet.
4. PROFESSIONAL JS CONFERENCE 8-9
Системы снабжений, цепи поставок.
Цифровая идентификация.
Здравоохранение.
Токенизация, оцифровка активов.
Голосование.
NOVEMBER ‘19 KYIV, UKRAINE
Области применения блокчейн
9. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Смарт контракты (Smart contracts)
Код исполняющийся в децентрализованных сетях.
Solidity, C++.
Это как backend сервис.
12. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
JSON RPC
Стандарт обмена данными.
Не зависит от транспортного протокола.
Только один метод для HTTP/S – POST.
Данные в JSON формате.
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
})
});
подпись метода
адрес контракта
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 в шестнадцатеричной системе
25. 32 байтные подстроки = 64 символа
0000000000000000000000000000000000000000000000000000000
00000000A – id героя
…
44616e20416272616d6f76000000000000000000000000000000000
000000000 – имя героя
…
000000000000000000000000000000000000000000004a617661536
372697074… - категория героя
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();
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();
36. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Операции записи в блокчейн. Транзакции
Требуют:
Учётной записи в сети.
Подписи ключом.
Дополнительных расширений - плагинов.
38. PROFESSIONAL JS CONFERENCE 8-9 NOVEMBER ‘19 KYIV, UKRAINE
Функции блокчейн браузерныx расширений.
Хранить информацию о учетных записях и ключах.
Глобальные переменные с учетной информацией.
Взаимодействовать с JavaScript библиотеками.
Подписывать транзакции.
Хранить информацию о крипте и других токенах.
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()
});
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
Добрый вечер ) Какой классный фестиваль! Интересные темы, Отличные докладчики и супер аудитория!
-Очень рад видеть столько людей пришедших сюда, несмотря на то что это окончание второго дня Феста, спасибо что присоединились ко мне.
-Сегодня я бы хотел поговорить о, сюрприз сюрприз – JavaScript, но не в совсем обычном контексте – а именно в контексте Блокчейн.
-Посмотреть на Блокчейн со стороны JavaScript, фронтенд разработчика.
-Понять как Блокчейн и децентрализованные сети отличаются от традиционных бэкендов к которым мы все привыкли, таких как REST или GraphQL.-
-Разобраться в особенностях обмена данными, построении и отправки запросов,
-Показать доступные инструменты и библиотеки
Наверное большинство из вас слышало про Блокчейн и не раз. То слышал? А кто сталкивался на работе?
В последнее время о нем говорили все кому не лень;
в соц сетях, мас медиа,люди технические а так же очень далекие от техники.
-Но на самом деле почти все они говорили – о крипто валютах.
-А это только маленький частый случай использования Блокчейн.
-Сегодня мы не будем говорить а крипто валютах. А посмотрим на реальные возможности блокчейн в других областях жизни и промышленности.
Что такое блокчен? В упрощенной форме это сеть компьютеров объединённых общим программным обеспечением и консенсус алгоритмом – алгоритмом который позволяет валидировать, проверять обработку данных и гарантировать безопасность. прозрачность и подлинность дынных.
Отсутствие единого сервера и единого владельца и делает технологию привлекательной в процессах с множеством участников, которым необходимы прозрачность, безопасность.
На пример.
Цепи снабжения или поставок.
Товар проходит множество этапов пока доберётся от поставщика до потребителя. Это и доставка от фабрики к транспортеру – перевозчику авиа или судопевозки.
Потом хранения на складе, перевозка мастными фирмами доставки. И тд.
Все эти процессы могут осуществляться разными фирмами и должны быть отслуживаемыми и задокументированными.
Цифровая идентификация – как еже паспорт с вашими данными. Это и ваша уникальная цифровая подпись. Которая позволит работать и официально подписывать электронные документы.
Здравоохранения – ваша единая мед карточка. Централизованное место для хранения информации и вас и вашем здравье, которая будет храниться в зашифрованном виде. Сейчас чаще всего приходиться бегать со всякими бумажками, справками и физическими карточками что не удобно и не эффективно.
Токенизация это репрезентация физических активов в цифровом виде, подтверждение владения, на пример права на драгоценные металлы, предметы искусства, недвижимость.
Ну и имея уникальную идентификацию как рассказано выше – мы можем безопасно голосовать.
Эти сферы применения уже отражают крупные компании которые внедряют блокчейн в свои системы,
Что бы сделать разговор более предметны, практическим и интересным я приготовил демо приложение - Система отзывов и обзоров супергероев.
Снова таки – мы хотим что бы данные и отзывы были честными и не поддельными, на пример сторонней компанией – потому блокчейн как раз то что нужно.
Приложение позволяет просматривать список супергероев. Фильтровать по категории-вселенной, Марвел, ДиСм ну и JavaScript,так как в нем то же есть свои герои
Переходить на детальную страницу о герое. Просматривать подробную информацию и оставлять отзывы.
Приложения работающие с блокчейн называются децентрализованные приложения.
Рецепт в целом прост – берем SPA, Single Page application (React или Angular) ан пример.
Добавляем к нему Смарт контракт (Умный контракт)
И получаем децентрализованное приложение – Decentralized application ну или просто dApp
-Смарт контракт это код который исполняется в сети блокчейн.
-Результаты и факт выполнения этого кода будет сохранен для всех участников сети, на всех узлах.
-Чаше всего это код программа написанная на языке Solidity (проприоретарный язык) написанный сп-ециально для блокчейн сетей.
-Или написанный на С++.
-Я люблю воспринимать Смарт контракты как особенный и не стандартный бэкенд сервис.
Мы посмотрим на 3 самые распространенные сети для разработки децентрализованных приложений . Эфир, Трон, и EOS.
Эфир и трон очень похожи: потому я сначала покажу их и потом мы поговорим про EOS.
-Пример архитектуры распределенного приложения. Для сети Эфир И Трон
У нас есть пользователь, который запрашивает веб страницу. И это простая веб страница которая размещена на обычном хостинге или в облачном хранилище, как AWS или GoogleCloud.
-Страница делает запрос на нод (узел в сети).
-Запросы производиться на основе JSON RPC.
-Каждый узел или компьютер в сети хранит копию контракта
-На узле запущенная Виртуальная машина Эфира – EVM, Ethereum Virtual Machine которая выполняет код смарт контракта, Он так же имеет сетевую надстройка которая позволяет совершать JSON RPC запросы. Так же видно что ноды постоянно синхронизируются между собой по P2P соединению без участия центрального сервера
-Что такое RPC ли JSON RPC?
-Кто ни будь сталкивался или работал с RPC сервисами?-
RPC это описание того как две удаленные программы могут обмениваться данными с друг другом (к примеру программа на сервере и на клиента).
Он не зависит транспортного протокола. То есть может применяться в HTTP на пример, веб сокетах, P2P соединениях.
В случае HTTP – используется только один метод – POST и для отправки и для получения данных.
Ну и использует данные в формате JSON.
Запрос для RPC сервиса может выглядеть следующим образом. Скажем мы хотим получить список героев.
Мы отправляем, всегда!, POST запрос, и это очень странно, Потому что обычно если мы получить данные то почти всегда выполняем GET.
Далее в теле запроса мы передаем имя метода или функции которую хотим вызвать на сервере и если нужно какие то дополнительные параметры.
И вроде все понятно. Да?
Но не в случае с блокчейн.
Тут я делаю запрос на узел эфира. Ropsten это тестовая сеть эфира.
И в теле запроса я передаю не человеко понятные значения data и to.
Единственно что более менее понятно – свойство метод. ETH_CALL.
Этим я говорю – ей виртуальная машина Эфира – выполни такой то метод и используй параметры выше.
Но вопрос откуда мы возьмем этот ужас, свойства data и to?
Ответ из JSON ABI.
Расшифруется как Application binary interface.
Это JSON файлик который получается при деплойменте или сборке контракта.
Фактически это спецификация контракта в формате JSON – которая говорит как работать с контрактом, это как Swagger спецификация для REST сервисов.
Содержит описание методов, их параметров, возвращаемых значений и т.д.
Выглядит это примерно вот так:
У нас есть – название контракта – Superheroes.
Свойство abi – которое содержит массив со всей нужной и главной для нас информацией,
Так же поле адрес – это уникальный адрес данного контракта в сети блокчейн, как URL для сервисов.
Заглянем внутрь одного из методов в массиве ABI.
У нас есть имя метода. Get super heroes
Полу inputs – это параметры метода. В данном случае поле пустое – потому что мы просто получаем список всех героев.
Поле outputs это описание возвращаемых значений и их типов. У нас есть ID героя, тип unsigned integer 256, имя героя – строка.
Поле signature – ID укороченное имя или подпись метода.
Теперь у нас есть вся информация что бы сделать запрос для получения списка героев.
Свойство data – содержит подптсь метода.
И поле to – адрес контракта
Это был запрос без параметра. Но что если нам нужно вызвать метод с параметрами?
На пример – страница героя. Мы делаем запрос по его имени или скажем ID?
В этот раз если обратиться к ABI.
Снова видим название метода – getHero, получить героя.
Поле inputs более не пустое. Метод принимает параметр ID - целочисленное значение.
И подпись метода
Скажем мы хотим получить героя с ID 10.
Эфир запрос выглядит так.
В свойство data так же как и в прошлый раз мы передаем подпись метода и далее соединяем ее числом 10 в шестнадцатеричном формате. 10 в шестнадцатеричном формате – это – A.
Про кучу нулей перед A мы поговорим чуть позже
Для сети Трона все примерно одинокого.
Только сигнатура метода не кодируется – а передается просто строкой.
И параметр передаётся в отдельном поле
И эти запросы вернут нам ЭТО. И на первый взгляд это совсем полное безобразие.
Мне напомнило код матрицы!
Но в отличие от героев фильма матрица нам не нужно смотреть на это часами что бы увидеть «девушку в красном» и понять смысл.
Мы можем обратиться к документации Эфира.
Эфир разбивает информацию на 32 байтные пакеты. 32 байта вмешают – 64 строчных символа.
Все храниться в шестнадцатеричном виде.
И если мы разобьем строку на подстроки по 64 символа. Ситуация немного проясняется. Тут видно ID героя – A. A это 10 в десятичном формате.
Имя героя.
Категория.
Нули впереди или позади значений это пустые байты.
Для того что бы декодировать строку – нужно воспользоваться таблицами ASCII.
ASCII это таблицы которые помогают конвертировать значения между форматами.
Обычно у каждого символа у каждой буквы есть свой 2 значений код.
На пример английская A – 41
Английская С – 43 тд
Зная про таблицы мы можем написать следующий метод
Он принимает шестнадцатеричную строку.
Далее необходим пройти в цикле по строке: через каждые два символа (символы в ASCII – двухзначные значения).
С parse Int переводим текущие 2 шестнадцатеричных символа в десятичное значение кода (совместимое с JS)
И далее используем метод fromCharCode который вернет нам значение ASCII символа в unicode формате
В случае с числами все просто – мы можем использовать parseInt который вернет число в десятичном виде.
Фууух. Это было много всего! Я надеюсь вы все ещё со мной! И не сильно заскучали? Это моя дочь кстати, никогда не дает мне скучать. Дальше будет веселее!
К счастью мы в мире JavaScript где для всего есть библиотеки и блокчейн не исключение.
Эфир имеет чудесную библиотеку Web3JS и Трон идет со своей библиотекой, близнецом Web3 - TronWeb
Что умеют библиотеки?
Значительно упростить и инкапсулировать логику запросов.
Кодировать и декодировать данные и параметры из шестнадцатеричного в десятичный и обратно
Взаимодействовать с криптокашельками и бразуреными расширениями. О них чуть позже
Предоставлять другую информацию о сети.
Пример работы с Web3JS! Все очень просто!
Web3 позволяет превратить ABI файл в объект с вызываемыми методами.
Импортируем Web3JS
Импортируем JSON файлик с ABI. Тут поможет Webpack.
Создаем новый экземпляр Web3
Создам экземпляр контракта. Передаем в него адрес узла. И объект с ABI,
И в итоге теперь мы можем вызывать методы просто в одну строку.
Метод getSuperheroes подговорит правильный запрос.
Долее мы вызываем метод call который выполнить запрос и вернет стандартный JavaScript Promise с декодированными и читабельными результатами!
Запрос с параметром – все так же просто; Просто передаем параметр в обычном вид и Web3JS сделает всю нужную кодировку сам!
Магия!
С TronWeb - ситуация еще проще.
Нам нужно знать только адрес контракта и адрес узла-сервера.
Мы так же импортируем TronWeb
Создаем экземпляр TronWeb и передаем в него адрес – URL нода.
Вызываем функцию контракт и передаем ей адрес контракта. TronWeb вcе сделает сам. Получит ABI и трансформирует его в объект.
И снова мы можем вызывать методы в одну строку, Все будет сделано за нас под капотом!
Но тут вы можете заметить! Это же все были примеры запросов чтения. Мы ничего не записывали! Как на счет записи в блокчейн?
И будете правы! Операции записи в блокчейн – обычно называемыми транзакциями – это отдельный случай!
Потому как они требуют!
Учетной записи в сети!
Подписи транзакции ключом!
Дополнительных расширений или плагинов!
Фактически все блокчейн сети имеют свои уже готовые браузерные расширения!
Для Эфира – это MetaMask и для Трона это TronLink
Эти расширения позволяют:
Создавать учетные записи в сети и хранить о них информацию. Учетная запись в сети это комбинация из публичного и приватного ключей.
Инжектить в браузеры глобальную переменную с информацией о сети и записи.
Взаимодействовать с JS библиотеками.
Подписывать транзакции
Хранить информацию и крипте и других токенах! То есть еще выполнять функцию кошелька !
Транзакция с Web3JS и MetaMask для Эфира
Выглядит так.
Мы так же само используем Web3JS для получения объекта из ABI, как в примере ранее,
И просто вызываем метод addHero и передаем в него данные героя. В обычном формате.
В конце вызываем метод send (если помните для операций чтения ранее это был метод call) и он принимает адрес пользователя.
Адрес пользователя доступен в Глобальной переменной предоставленной расширением MetaMask
Ситуация с TronWeb – снова похожа.
На полученом ранее объекте – вызываем метод addHero. Передаем в него дынные!
И зовем метод send!
Выглядит это примерно так.
Когда пользователь заполняет данные и жмет подтвердить. Мы вызываем код показанный на прошлом слайде.
Браузерный плагин слушает когда происходит вызов функции send и предлагает подписать транзакцию!
Тут так же видно что транзакция не бесплатна и в большинстве случаем ложиться на плечи пользователя. В данном случае это стоит 4 десятитысячные эфира что по текущему курсу примерно – 7 центов.
Дальше транзакция отправляться на выполнение и это может занять время.
И в случае с Эфиром это может быть долго. Что бы вы понимали в Главной сети Эфира. Mainnet , в зависимости от нагрузки на сеть транзакция может выполнять минуту и больше. Даже в тест сети у меня в среднем время транзакции было около 30 секунд.
Естественно мучать пользователя показывая ему бесконечный индикатор загрузки не очень хорошая практика.
Для того что бы сделать это взаимодействие лучше и предоставить возможность получать обновления данных как только они становятся доступные Эфир – предоставляет События.
События в эфире работают на основе веб сокетов. Это позволяет осуществлять двухстороннюю связь между клиентским приложениям и Смарт Контактом или между контрактами. То есть клиент может подписываться на серверные события и получать обновления.
На пример как только создаться новый герой или поступает новый отзыв о герое – мы хотим сообщить об это пользователю или отобразить это в UI приложения.
Для реализации этого непобедимо,
Создать новый сокет с адресом Узла в сети. Тем самым мы открываем WSS соединения.
Когда соединение открыто – нужно подписаться на событие которое нас интересует.
Снова формируем JSON RPC запрос. В качестве вызываемого метода на эфире теперь ETH_SUBSCIBE.
Имя события которое нас интересует передаётся в свойстве TOPICS. Значение мы снова таки берем из JSON ABI файла
И дальше нужно просто отправить подписку на сервер.
После этого мы можем слушать событие message на вебсокете.
Данные приходят в шестнадцатеричном формате как и ранее и вот пример того как их можно расшифровать с помощью Web3JS.
Вызываем метод Web3JS decodeLog и передаем в него полученные данные а так же описание события из ABI файла
Но Web3JS делает процесс ещё проще.
Так как и ранее мы можем сформировать объект из ABI файла.И на нем будут доступные для вызова функции подписи на события.
На пример NewHero формирует подпись на событие и возвращает объект с методом ON c параметром data и callllback функцией.
Web3 сделает все за нас. Откроет веб сокет соединение. Подпишется на события и декодирует результаты.
Tron работает на много быстрее и события не так важны.
Пришло время поговорить об EOS.
EOS2.0 – новейшее поколение блокчейн разработанное с мыслью о разработчиках. И это делает работу с сетью на много приятней и проще.
EOS так же выдает JSON ABI с описанием Смарт контакта. В принципе все похоже. Есть описание функций контракта. Они называться actions.
Описание структур – таких как доступные форматы данных, публичные переменные и тд.
Но самое интересное – это таблицы!
Таблицы позволяют эффективно управлять данными.
С стороны frontend разработчика наиболее интересно как мы можем делать запросы.
Данный пример показывает некоторые возможности. Это C++ код, ну пугайтесь. Главная идея тут что мы можем получать отзывы не только по основному ключу как на пример ID но и по вторичным ключам.
На пример я хочу получить все отзывы по определённому герою и таблицы позволяют это сделать.
Ключь By_superhero_id - вернет все отзывы для героя.
К примеру зарос за списком героев выглядит следующим образом.
Запрашиваем get_table_rows на узле EOS.
В теле запроса есть волшебное свойство json со значением true – это дает нам возможность прилучить данные уже в декодированном виде, бекенд сделает все за нас.
Свойства CODE и SCOPE указывают название смартконтракта в сети
И в свойстве table – передаём название таблицы. И ётот запрос вернет нам данные в читабильном виде. Массив с объектами героев.
Никакой мороки стороны кода!
Вот пример более сложного запроса, За отзывами по определенному герою.
Снова указываем название таблицы – reviews.
Название ключа – superhero_id
Указываем что запрос идет по вторичному ключу.
И передаем ID героя в upper и lower bound. В данном случае они одинаковые так как нам нужны отзывы по одному герою. Но так же можно указать промежуток значений. От и до
EOS так же предоставляет JavaScript библиотеку EOSJS.
В случае с простыми запросами чтения она не много упрощает работу.
Импортируем JsonRpc из EOSJS
Создаем экхемпляр JSON RPC и передаем в него URL узла в сети а так же класс для работы с запросами. С браузере нам достепн fetch
И вызываем метод get table rows и передаем в него данные для запроса точно так же как и случае с работы с обычным fetch
Транзакции в EOS более гибкие. Так как позволяют выбирать кто будет подписывать транзакции, Если в случае Эфира или Трона это пользователь, то в EOS можно переложить на владельцев контракта. И для пользователя в таком случае это будет скрыто.
Это позволяет сделать Signature provider.Где вы можете указать подписчика.
После мы создаем Экземпляр класса API. Предаем в него объект RPC созданный выше, подписчика а так же коддер и декодер для данных. ПО умолчанию это нативные JavaScript TextDecoder и TextEncoder
После этого остается выполняить транзакцию.
EOS позволяет выполнять пакеты транзакций. Можно передавать не одну а сразу много в массива actions.
Свойство name принимает название метода которое нужно выполнить – addHero добавить героя.
И в data передаем необходимые данные.EOS работает очень быстро. Сравнимо с классическими бекенд сервисами.
Как мы могли убедиться – все они позволяют выполнять полезные действия с помощью Смарт Контрактов
В всех есть JSON ABI – спецификация Контрактов, которая описывает доступные метода, свойства, типы данных в контракте.
Вся связь, обмен данными происходит на JSON RPC. С единственным HTTP методом POST
Ну и конечно для упрощения жизни – для всех доступны библиотеки. Которые я рекомендую использовать на production
Некоторые важные моменты.
Эфир и Трон на данный момент используют версию Solidity которая не поддерживает объекты.
Это значит что даже при использовании библиотект данные вернуться в виде массива,
Как на примере героя видно что мы получаем массив элементов. На Javascript мы можем использовать destructuring assignment для присвоения этих значений переменным.
Если запрос был за списком героев к примеру – то вы получите массив массивов.
В своем примере я использовал Экспериментальную версию компайлера Solidity которая позволяет вернуть нормальные объекты, Но к созданию она пока не рекомендована для production.
Как мы видели ранее - для Сетей Эфира и Трона данные нужно кодировать/декодировать между различными форматами.
Больщую чатсь работы на себя берут конечно Библиотеки – но важно понимать что этот факт имеет место быть.
Еще одна особенность – это разница в числах.
Solidity к примеру имеет намного болоьщие максимальные значения для целых чисел.
Если для JavaScript максимальное значение числа – это 2 в 53 степени – 1
То для Solidity – это 2 в степени 256 – 1 что значитительно так больше. Естесвенно если передать такое число в JavaScript то ничего зорошего не выйдет.
Если вам нужно произодить какие то действия с такими числами на фроненде – то есть отличная библиотека BigNuberJS. Но лучще конечно перенести все логику рабьоты с числами на СмартКонтракт.
Ну и операции записи – или транзакции Требуют наличия дополнительных инструментов- таких как бразузерные плагины для подлписи транзакций
Скорость выполнения транзакций в сети Эфир на данный момент оставляет желать лучшего. Ethereum foundation работает над этим и в скором времени обезает релиз Ethereum2.0 с новым консенсус алгоритмом который значительно увеличит скорость выполнения транцакий.
На этом фактически все.
Вот некоторые ресурсы которые вы можете использовать для обучения.
Рекомендую КриптоЗобмби – это портал кторый позволяет обучиться основам работы с Ehtereum и Solidity в игровой форме, через содание игры.
BattlesEOS сзодий портал но только для EOS
А так же демо приложения показанные сегодня. Для всех 3 сетей
На этом у меня все! Спасибо за внимание – вы супер аудитория.