Как пользоваться waves explorer
На данный момент мы поддерживаем операционные системы на базе Unix (например, популярные дистрибутивы Linux или MacOS). Однако платформа Waves Enterprise может быть запущена и под Windows в экспериментальном режиме. Вы также можете использовать такие решения, как виртуальные машины с Unix подобной системой или среду Docker для установки и запуска платформы Waves Enterprise на операционной системе Windows.
Платформа Waves Enterprise поддерживает два вида криптографии: ГОСТ-криптографию на базе ПО «КриптоПро Java CSP» или встроенный модуль Waves-криптографии. Если хотите использовать ГОСТ-криптографию, обратитесь в службу поддержки Waves Enterprise для получения дополнительной информации.
Нода Waves Enterprise устанавливается на отдельную машину от других блокчейн-нод платформы Waves.
Виды установки платформы¶
Платформа Waves Enterprise может конфигурироваться в ручном и автоматическом режимах. Процесс разворачивания и запуска платформы для систем Linux и MacOS одинаковый. Для конфигурации и запуска всех сервисов платформы необходимо установить дополнительно приложения Docker CE и Docker-compose.
Если вы запускаете и настраиваете только ноду, например, для подключения к сетям Mainnet или Partnernet, выполните перед запуском ручную конфигурацию ноды . В остальных случаях легче устанавливать и настраивать платформу в автоматическом режиме. После разворачивания платформы локально вы всегда можете обратиться к конфигурационным файлам нод, входящих в блокчейн, для последующей настройки платформы Waves Enterprise.
Автоматическое развертывание платформы¶
Скачайте и установите дистрибутивы Docker CE и Docker-compose. Для скачивания потребуется регистрация на сайте.
После установки убедитесь, что успешно установились приложения Docker CE и Docker-compose (часть дистрибутива Docker CE):Скачайте актуальный установочный файл install.sh с официальной страницы платформы Waves Enterprise на GitHub.
Откройте терминал, создайте рабочую директорию и перейдите в неё.
Запустите следующую команду:
Дождитесь результата выполнения команды. Платформа автоматически запустится после завершения работы установочного файла install.sh .
На ОС Linux данная команда выполняется с правами администратора (права root).
Платформа запускается следующей командой:
При запуске ноды выполняется проверка доступных ресурсов. Если доступных ресурсов меньше минимальных, то нода не сможет стартовать! Минимальные и рекомендованные требования к аппаратным характеристикам приведены в разделе Системные требования . Если вы запускаете все три ноды на одной машине, необходимо выделить не менее 10 ГБ оперативной памяти и 6 ядер процессора для Docker.
Остановка ноды выполняется командой:
Отправка транзакций из веб-клиента¶
После того, как блокчейн-платформа стартовала, выполните следующие действия:
Зарегистрируйтесь в веб-клиенте, используя любой действительный электронный адрес, и зайдите в веб-клиент.
Откройте страницу Выберите адрес -> Добавить адрес вручную .
Заполните поля, указанные ниже. Значения вы можете взять из конфигурационного файла accounts.conf для первой ноды в каталоге nodes/node-1 .
Также вы можете просто создать новый пользовательский блокчейн-адрес, используя страницу Выберите адрес -> Создать адрес и следуя подсказкам веб-интерфейса.
Теперь можно отправлять транзакции из веб-клиента от адреса ноды.
Развертывание одной ноды в ручном режиме¶
Проверьте, установлены ли приложения Docker CE и Docker-compose в вашей операционной системе.
Скачайте актуальный релиз ноды и шаблон соответствующего конфигурационного файла со страницы проекта в GitHub. В релиз входят следующие файлы:
утилита generators-x.x.x.jar, которая используется для создания аккаунта и ключевой пары;
конфигурационный файл docker-compose-one-node.yml для запуска ноды.
Выполните конфигурацию ноды в соответствии с руководством «Ручная конфигурация ноды» . Ручная конфигурация также нужна, если вы хотите дополнительно настроить ноду, например, включить или отключить опции, изменить параметры консенсуса или майнинга и др.
Создайте рабочий каталог, например, node , и поместите туда следующие файлы:
конфигурационный файл запуска ноды docker-compose-one-node.yml ;
конфигурационный файл ноды node.conf ;
файл keystore.dat , созданный в процессе генерации аккаунта и ключевой пары.
В рабочем каталоге откройте терминал от имени администратора и выполните следующую команду для запуска ноды:
При запуске ноды выполняется проверка доступных ресурсов. Если доступных ресурсов меньше минимальных, то нода не сможет стартовать! Минимальные и рекомендованные требования к аппаратным характеристикам приведены в разделе Системные требования .
Схема разработки dApps и обычных приложений почти не отличается:
- Пишем код
- Пишем автоматизированное тестирование
- Запускаем приложение
- Тестируем
Инструменты
1. docker для запуска ноды и Waves Explorer
Если не хотите запускать ноду, можете пропустить этот шаг. Ведь есть тестовая и экспериментальная сеть. Но без развертывания своей ноды процесс тестирования может затянуться.
- Вам постоянно будут нужны новые аккаунты с тестовыми токенами. Кран тестовой сети переводит по 10 WAVES каждые 10 минут.
- Среднее время блоков в тестовой сети – 1 минута, в ноде – 15 секунд. Это особенно ощутимо, когда транзакция требует нескольких подтверждений.
- В общедоступных тестовых нодах возможно агрессивное кэширование.
- Еще они могут быть временно недоступны из-за технического обслуживания.
2. Инструмент командной строки Surfboard
3. Плагин Visual Studio Code
Откройте VS Code и установите плагин waves-ride:
Запустите ноду и Waves Explorer
1. Запустите ноду:
Интерфейс Swagger REST API для ноды
2. Запустите экземпляр Waves Explorer:
Waves Explorer отображает экземпляр локальной ноды
Структура RIDE и инструмент Surfboard
Создайте пустую директорию и выполните в ней команду
Команда инициализирует директорию со структурой проекта, приложения типа «hello world» и тесты. Если откроете эту папку с VS Code, то увидите:
Surfboard.config.json
- Под папкой ./ride/ найдете одиночный файл wallet.ride – директорию, где расположен код dApp. Мы кратко проанализируем dApp в следующем блоке.
- Под папкой ./test/ найдете файл *.js. Здесь хранятся тесты.
- ./surfboard.config.json – конфигурационный файл для запуска тестов.
- Конечная точка REST API ноды, которая будет использоваться для запуска dApp и CHAIN_ID сети.
- Секретная фраза для аккаунта с токенами, которые будут источниками токенов вашего теста.
Приложение Wallet-demo
Эта секция – не справочник по языку RIDE. Скорее, взгляд на приложение, которые разворачиваем и тестируем, чтобы лучше понять, что происходит в блокчейне.
- deposit() , которое требует прикрепленного платежа в WAVES
- withdraw(amount: Int) , который возвращает токены
Action | Resulting state |
---|---|
initial | empty |
Alice deposits 5 WAVES | alice-address → 500000000 |
Bob deposits 2 WAVES | alice-address → 500000000 bob-address → 200000000 |
Bob withdraws 7 WAVES | DENIED! |
Alice withdraws 4 WAVES | alice-address → 100000000 bob-address → 200000000 |
Вот код для полного понимания ситуации:
Пример кода можно также найти на GitHub.
Плагин VSCode поддерживает непрерывную компиляцию при редактировании файла. Поэтому вы всегда можете следить за ошибками во вкладке PROBLEMS.
Если хотите использовать другой текстовый редактор при компиляции файла, используйте
Это выведет ряд base64 скомпилированного кода RIDE.
Тестовый сценарий для ‘wallet.ride’
Посмотрим на тестовый файл. Работает на фреймворке JavaScript’s Mocha. Есть функция «Before» и три теста:
- «Before» финансирует несколько аккаунтов через MassTransferTransaction, компилирует скрипт и развертывает его в блокчейне.
- «Can deposit» отправляет в сеть InvokeScriptTransaction, активируя функцию deposit() для каждого из двух аккаунтов.
- «Can't withdraw more than was deposited» тестирует, что никто не сможет украсть чужие токены.
- «Can deposit» проверяет, что выводы обрабатываются корректно.
Запуск тестов с Surfboard и анализ результатов в Waves Explorer
Для запуска теста выполните
Если у вас есть несколько сценариев (например, нужен отдельный скрипт развертывания), можете запустить
Surfboard соберет тестовые файлы в папке ./test/ и запустит сценарий в ноде, которая настроена в surfboard.config.json. Спустя несколько секунд вы будете наблюдать что-то подобное:
Waves Explorer. Приложение, которое только что развернули.
Несколько советов по Surfboard:
1. Чтобы тестировать в среде testnet, используйте:
2. Если хотите посмотреть JSON-версии транзакций и как они обрабатываются нодой, запустите тест с -v (означает ‘verbose’):
Использование приложений с Waves Keeper
Настройка Waves Keeper для работы с локальной нодой
2. Импортируйте секретную фразу с токенами для сети? Для простоты используйте начальное seed вашей ноды: waves private node seed with waves tokens . Адрес: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF .
4. Введите адрес кошелька из тестового запуска (подчеркнут выше) в текстовое поле адреса dApp
5. Впишите небольшую сумму в поле «Deposit» и нажмите кнопку:
Waves Keeper запрашивает разрешение, чтобы подписать InvokeScriptTransaction с платежом 10 WAVES.
6. Подтвердите транзакцию:
Транзакция создана и транслируется в сеть. Теперь видно ее ID
7. Наблюдайте за транзакцией с помощью Waves Explorer. Введите ID в поисковое поле
Выводы и дополнительная информация
Мы рассмотрели инструменты разработки, тестирования, развертывания и использования простых dApps на Waves Platform:
Все данные в блокчейне Waves доступны для чтения. Например, вы можете прочитать записи в хранилище данных любого аккаунта, баланс аккаунта, список транзакций аккаунта, текущую высоту и время на блокчейне.
У каждого аккаунта есть хранилище данных, которое содержит записи в формате ключ-значение. Подробнее см. в разделе Хранилище данных аккаунта.
Чтобы получить все записи из хранилища данных аккаунта, используйте метод GET /addresses/data/.
Чтобы получить запись по ее ключу, используйте метод GET /addresses/data//.
Описание методов см. в Swagger (opens new window).
Приведенные здесь и далее примеры пригодны для использования с помощью утилиты cURL. Вы можете адаптировать запрос для своего языка программирования.
Используйте функции библиотеки waves-transactions:
- функция accountData получает все записи из хранилища данных аккаунта, опционально для отбора записей можно использовать регулярное выражение (opens new window).
- функция accountDataByKey получает запись по ее ключу.
Описание функций см. в документации библиотеки (opens new window) на Github.
Аккаунту могут принадлежать несколько ассетов (токенов) в разных количествах. Для WAVES есть четыре типа баланса: регулярный, эффективный, доступный, генерирующий. Подробнее см. в разделe Баланс аккаунта.
Невзаимозаменяемые токены (NFT) отображаются на вкладке Non-fungible tokens.
Чтобы получить все типы баланса в WAVES, используйте метод GET /addresses/balance/details/.
Чтобы получить балансы в других ассетах, используйте метод GET /assets/balance/ или GET /assets/balance//.
Описание методов см. в Swagger (opens new window).
Вы можете адаптировать запрос для своего языка программирования.
Чтобы получить список принадлежащих аккаунту NFT, используйте метод GET /assets/nft//limit/.
Используйте функции библиотеки waves-transactions:
- функция balanceDetails получает все типы баланса в WAVES.
- функция assetBalance получает балансы в других ассетах.
Описание функций см. в документации библиотеки (opens new window) на Github.
Если пользователь аутентифицирован в вашем приложении, вы можете использовать функции библиотеки er:
- функция getBalance возвращает балансы всех ассетов, принадлежащих пользователю. Для WAVES возвращается доступный баланс.
- функция getedBalances возвращает балансы спонсорских ассетов Подробнее о спонсировании см. в разделе ed Fee Transactions.
См. документацию библиотеки er.
По адресу аккаунта вы можете получить список относящихся к нему транзакций: исходящие транзакции, отправленные с этого аккаунта; входящие переводы; сделки обмена, в которых участвовал аккаунт; вызовы dApp-скрипта и др.
Чтобы получить все транзакции, относящиеся к аккаунту, используйте метод GET /transactions/address//limit/. Получать список можно постранично: чтобы получить следующую страницу, укажите ID последней полученной транзакции в параметре after.
Описание методов см. в Swagger (opens new window).
Вы можете адаптировать запрос для своего языка программирования.
Используйте функцию fetchTransactions библиотеки node-api-js.
Вы можете использовать временную метку последнего блока как текущее время на блокчейне.
Чтобы получить только высоту блокчейна, используйте метод GET /blocks/height.
Чтобы получить все заголовки последнего блока, в том числе высоту и временную метку, используйте метод GET /blocks/ers/last.
Описание методов см. в Swagger (opens new window).
Вы можете адаптировать запрос для своего языка программирования.
Чтобы получить блок целиком, со всеми заголовками и транзакциями, используйте метод GET /blocks/last.
Используйте функцию fetchersLast библиотеки node-api-js.
Как строить, развертывать и тестировать Waves RIDE dApp
Здравствуйте! В статье я покажу, как написать и запустить на ноде Waves обычный dApp. Рассмотрим необходимые инструменты, методы и пример разработки.
Схема разработки dApps и обычных приложений почти не отличается:
- Пишем код
- Пишем автоматизированное тестирование
- Запускаем приложение
- Тестируем
Инструменты
1. docker для запуска ноды и Waves Explorer
Если не хотите запускать ноду, можете пропустить этот шаг. Ведь есть тестовая и экспериментальная сеть. Но без развертывания своей ноды процесс тестирования может затянуться.
Далее буду считать, что вы работаете со своей нодой.
2. Инструмент командной строки Surfboard
npm install -g @waves/surfboard
3. Плагин Visual Studio Code
Откройте VS Code и установите плагин waves-ride:
Браузерное расширение Waves Keeper:
Запустите ноду и Waves Explorer
1. Запустите ноду:
docker run -d -p 6869:6869 wavesplatform/waves-private-node
Интерфейс Swagger REST API для ноды
2. Запустите экземпляр Waves Explorer:
Waves Explorer отображает экземпляр локальной ноды
Структура RIDE и инструмент Surfboard
Создайте пустую директорию и выполните в ней команду
Команда инициализирует директорию со структурой проекта, приложения типа «hello world» и тесты. Если откроете эту папку с VS Code, то увидите:
- Конечная точка REST API ноды, которая будет использоваться для запуска dApp и CHAIN_ID сети.
- Секретная фраза для аккаунта с токенами, которые будут источниками токенов вашего теста.
Приложение Wallet-demo
- deposit(), которое требует прикрепленного платежа в WAVES
- withdraw(amount: Int), который возвращает токены
На протяжении всего жизненного цикла dApp, структура (address → amount) будет поддерживаться:
Alice deposits 5 WAVES
Bob deposits 2 WAVES
Bob withdraws 7 WAVES
Alice withdraws 4 WAVES
Вот код для полного понимания ситуации:
Пример кода можно также найти на GitHub.
Плагин VSCode поддерживает непрерывную компиляцию при редактировании файла. Поэтому вы всегда можете следить за ошибками во вкладке PROBLEMS.
Если хотите использовать другой текстовый редактор при компиляции файла, используйте
surfboard compile ride/wallet.ride
Это выведет ряд base64 скомпилированного кода RIDE.
Запуск тестов с Surfboard и анализ результатов в Waves Explorer
Для запуска теста выполните
Если у вас есть несколько сценариев (например, нужен отдельный скрипт развертывания), можете запустить
surfboard test my-scenario.js
Surfboard соберет тестовые файлы в папке ./test/ и запустит сценарий в ноде, которая настроена в surfboard.config.json. Спустя несколько секунд вы будете наблюдать что-то подобное:
Waves Explorer. Приложение, которое только что развернули.
Несколько советов по Surfboard:
1. Чтобы тестировать в среде testnet, используйте:
Получить тестовые токены
surfboard test -v
Использование приложений с Waves Keeper
Настройка Waves Keeper для работы с локальной нодой
2. Импортируйте секретную фразу с токенами для сети? Для простоты используйте начальное seed вашей ноды: waves private node seed with waves tokens. Адрес: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.
4. Введите адрес кошелька из тестового запуска (подчеркнут выше) в текстовое поле адреса dApp
5. Впишите небольшую сумму в поле «Deposit» и нажмите кнопку:
Waves Keeper запрашивает разрешение, чтобы подписать InvokeScriptTransaction с платежом 10 WAVES.
6. Подтвердите транзакцию:
Транзакция создана и транслируется в сеть. Теперь видно ее ID
7. Наблюдайте за транзакцией с помощью Waves Explorer. Введите ID в поисковое поле
Выводы и дополнительная информация
Мы рассмотрели инструменты разработки, тестирования, развертывания и использования простых dApps на Waves Platform:
- Язык RIDE
- Редактор VS Code
- Waves Explorer
- Surfboard
- Waves Keeper
Ссылки для тех, кто хочет продолжить изучать RIDE:
Онлайн IDE с примерами
Чат разработчиков в Телеграме
Waves и RIDE на stackoverflow
NEW! Онлайн-курсы по созданию dApps на Waves Platform
Продолжайте углубляться в тему RIDE и создайте свой первый dApp!
В этом разделе вы узнаете, как создать и запустить децентрализованное приложение, работающее на блокчейне.
Для создания и тестирования dApp мы используем Waves IDE (opens new window). Для создания веб-приложения, которое вызывает функции dApp, мы используем JavaScript.
О возможностях dApp читайте в разделе Что такое dApp.
- Создание аккаунта dApp.
- Написание dApp-скрипта.
- Установка скрипта на аккаунт dApp.
- Тестирование скрипта.
- Выход в реальный мир.
Откройте Waves IDE (opens new window).
Нажмите и убедитесь, что вы работаете с Testnet.
Нажмите Add account → Generate new account.
Пополните баланс аккаунта: в Testnet это бесплатно. Для этого:
• Скопируйте адрес аккаунта: нажмите на название аккаунта, затем нажмите кнопку .
Блокчейн – способ децентрализованного хранения данных. Технологию можно использовать как замену традиционной базе данных и получить дополнительный функционал, который может быть полезен при построении архитектуры приложения, – прозрачность операций и децентрализованность хранения данных. Проще говоря, данные в публичном блокчейне невозможно изменить и легко проверить любому пользователю интернета.
В этом туториале мы создадим веб-приложение, использующее блокчейн вместо централизованного хранилища данных, с помощью нативного JavaScript и старых-добрых HTML с CSS.
Что будем разрабатывать?
В качестве примера приложения на блокчейне возьмем проект Certificado.
Проект будет решать реальную пользовательскую проблему – подделку сертификатов, которые выдают на образовательных мероприятиях. Документы можно подделать в Adobe Photoshop. Из-за этого сертификаты теряют ценность. Проще нарисовать сертификат в программе и добавить его в портфолио, чем проходить курс на Курсере.
Миссия приложения Certificado – добавить ценности сертификатам, выпускаемым онлайн, и добавить две особенности:
- Прозрачное хранение сертификатов в блокчейне
- Добавлять сертификаты в базу могут только администраторы
Как будем делать приложение?
Это будет классическое web-приложение на HTML и JavaScript, обращающееся к блокчейну для хранения данных о дипломах. Мы выбрали блокчейн Waves с дополнительным инструментом – Waves Keeper. Это браузерное расширение позволит администратору авторизовываться, не раскрывая свой приватный ключ (пароль в мире блокчейна).
Certificado нельзя назвать децентрализованным приложением (dApp), ведь бизнес-логика не зафиксирована в смарт-контракте – его просто нет.
Step-by-Step к звездам
Интерфейс создания сертификатов
Начнем с классической части – создания интерфейса. Сверстаем две странички: index.html для добавления сертификата, и check.html для верификации документа.
Следующий шаг – реализация механизма добавления диплома. Для этого разберемся с тем, куда должен быть добавлен диплом.
Самое время познакомиться с блокчейном Waves!
Установите браузерное расширение Waves Keeper, чтобы создавать и управлять аккаунтами в блокчейне.
Waves Keeper – подключаемся к миру блокчейна
Такая страничка станет доступна после создания аккаунта. Обратите внимание, что у аккаунта есть четыре поля: адрес и публичный ключ, которые позволяют идентифицировать его в сети, а также приватный ключ и seed-фраза, выступающие в роли пароля. Раскрывать приватный ключ и seed-фразу нельзя! Поэтому символы скрыты звездочками.
В верхней части окна Waves Keeper отображается баланс. Сейчас там достаточно угнетающе горят нули. Давайте пополним баланс аккаунта с помощью Waves Faucet, который позволяет «начеканить» тестовых монет. Кликните на «Transactions» и перейдите в Waves Explorer:
Этот инструмент отображает данные блокчейна в удобной форме. На странице отображена вся информация по нашему аккаунту. Пока тут ничего интересного: ни транзакций, ни баланса. Позже здесь можно будет легко отслеживать изменения. Это может сделать каждый с помощью Waves Explorer!
В левом нижнем углу перейдите на страницу Faucet:
Вбейте адрес своего аккаунта и докажите, что вы не робот. После этого получите 10 тестовых WAVES на счет:
Теперь у нас есть стартовый капитал для экспериментов! Приступим к самому интересному и научим наше приложение общаться с блокчейном. В наш уже созданный аккаунт можно сохранять данные, используя его Data State. Пока он пустой:
Но перед тем, как переходить к изучению API, разберемся с тем, что такое транзакция, один из ключевых элементов блокчейна.
Транзакция – факт свершения какого-то события. Например, перевод денег – это транзакция. Выпуск новой валюты – транзакция. Выгрузка смарт-контракта – транзакция. И просто запись данных – тоже транзакция! Для каждого из типов событий есть свой тип транзакций.
На картинке выше нас интересует тип 12 – Data Transaction. Наша цель – хранить данные.
Отправка сертификатов в блокчейн
Пример транзакции в Waves Keeper:
Создаем обработчик клика по кнопке «Добавить диплом», чтобы в транзакции хранились данные о документе.
Теперь при нажатии на кнопку «send!» пользователь добавляет сертификат в блокчейн:
После ввода пароля от расширения отобразится информация по отправляемой транзакции и предложение подписать ее:
Транзакция отправлена! Это значит, как минимум, три вещи:
- Баланс аккаунта уменьшился, так как 0.001 WAVES ушли на оплату комиссии.
2. На странице аккаунта в Waves Explorer в списке транзакций добавилась одна Data Transaction.
3. Во вкладке Data появился сертификат. Теперь в блокчейне зафиксирован факт владения Сашей Ивановым сертификатом номер 1. Никто не сможет скрыть или изменить эту информацию.
Верификация подлинности сертификатов
Мы разработали приложение, которое позволяет владельцу мероприятия выпускать сертификаты. Waves Explorer отображает сертификаты в блокчейне.
Тем не менее удобнее проверять подлинность диплома через отдельную форму, без необходимости разбираться в Waves Explorer. Сделаем для этой формы дополнительную страницу!
Простая верстка позволяет сделать простой интерфейс, который поможет любому верифицировать подлинность сертификата и, при желании, убедиться в ней окончательно в Waves Explorer:
Осталось сделать так, чтобы кнопка «check cerificado!» работала. Добавим хандлер checkData():
Обращение к данному методу API позволяет получить набор данных, которые лежат в стейте аккаунта, к тому самому, что мы видели в Explorer во вкладке Data. Набор доступных методов API блокчейна Waves можно изучить на странице. С помощью доступного функционала можно, например, добавлять транзакции, читать данные и получать информацию по токенам.
Добавив получение данных из блокчейна в наше приложение, мы создали форму, доступную любому посетителю сайта: каждый может бесплатно верифицировать подлинность диплома, так как за чтение данных комиссию платить не требуется.
Задача со звездочкой для удобства пользователей
Итак, наше приложение теперь имеет две страницы: добавления и верификации сертификатов! Последний пункт, который стоит реализовать – возможность делиться ссылкой на проверку своего сертификата.
Функционал шеринга сертификата:
Ссылку на проверку сертификата можно отправлять так, чтобы проверяющему не было нужно заполнять форму. Ссылки вида “URL/check.html?2 VladimirZhuravlev” достаточно, чтобы форма автоматически заполнилась данными 2 Vladimir Zhuravlev.
Заключение
За достаточно короткое время мы разработали полноценное веб-приложение Certificado, разобрались в том, что блокчейн – это удобный способ хранения данных, а Waves Keeper и Waves Explorer – инструменты работы с ним, которые нужно интегрировать в свое приложение.
Используя блокчейн вместо обычного централизованного хранилища данных, можно добавить приложению уникальный функционал и повысить его ценность для клиентов. В экосистеме Waves есть множество инструментов, упрощающих процесс разработки. Помимо разобранных нами Keeper и Explorer, существуют Waves Signer, клиентские библиотеки для разных языков программирования и собственный язык смарт-контрактов Ride.
Читайте также: