|
mikhailr
Sr. Member
![*](https://bitcointalk.org/Themes/custom1/images/star.gif) ![*](https://bitcointalk.org/Themes/custom1/images/star.gif) ![*](https://bitcointalk.org/Themes/custom1/images/star.gif)
Offline
Activity: 812
Merit: 443
★777Coin.com★ Fun BTC Casino!
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
March 12, 2020, 02:02:22 PM Last edit: March 15, 2020, 08:58:22 PM by mikhailr Merited by xandry (7), klarki (2), Symmetrick (1) |
|
ARK Desktop Wallet v2.9.0 - Значительные улучшения в скорости и производительности Выпущена новая версия кошелька ARK Desktop Wallet v2.9.0 , и мы рады, что вы попробуете наши улучшения скорости и производительности. Это обновление является более быстрым, мгновенным и отзывчивым на протяжении всего вашего пути от начала до конца, но это еще не все, поэтому давайте углубимся во все изменения. | Вы можете загрузить ARK Desktop Wallet по адресу https://ark.io/wallet или использовать новую функцию загрузки из вашего текущего кошелька (доступна в версии v2.7.0 +). С более частыми выпусками Desktop Wallet мы хотим принести вам, пользователям, постоянный поток улучшений. Этот релиз был посвящен повышению производительности и капитальному ремонту базовой системы, которая заботится о чтении, запросе и сохранении данных (изнутри и снаружи кошелька). Одна из первых вещей, которую вы заметите - это гораздо более быстрое время загрузки при открытии кошелька. На одной из наших самых медленных тестовых машин, где было много профилей, сетей, кошельков и установленных плагинов, время начальной загрузки составляло от 40 до 12 секунд, и все это благодаря тому, как мы реинжинирировали и оптимизировали базовые процессы. После открытия вы увидите, что переключение между кошельками, вкладками, графиками и при извлечении данных происходит гораздо более плавно, чем в предыдущем выпуске. | Дайте нам знать, что вы думаете об этих улучшениях в Twitter.Что нового?• Изображения и слайдеры плагинов - сейчас мы разработали способ, позволяющий разработчикам плагинов включать скриншоты самого плагина. Изображения также можно нажимать, чтобы они расширялись. (чтобы посмотреть, как это выглядит, откройте Plugin Manager и откройте плагин ARK Explorer). ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F982%2F1%2Az1HkNLn14lZsz2o--Vlbvg.jpeg&t=665&c=dpzZRYNkh4mASg) • Модальное подтверждение закрытия транзакции - до сих пор, когда вы пытались отправить, отдать голос или инициировать любую транзакцию, если вы щелкнули за пределами модального режима, она автоматически закрывалась. Это создало болевую точку для пользователей, где они должны были бы создать новую транзакцию и ввести детали транзакции снова, если модальное закрытие произошло случайно. Теперь мы улучшили это поведение с помощью окна подтверждения. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F667%2F1%2A9h9tlGFrFP0h71NDf_A3Bg.jpeg&t=665&c=eho0hsFLC5gUSg) • Состояние открытия меню менеджера плагинов - состояние меню плагина, если вы щелкнете по меню, оно скрывается/открывается, теперь сохраняется для каждого профиля и также отображается по умолчанию. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F1228%2F1%2AiXOIPSsZYgBo-RPtkfgEwg.jpeg&t=665&c=fwtpLuPyfq-NiA) • Показывать альтернативные балансы в сетке кошелька - при просмотре сетки вы также можете увидеть стоимость вашей альтернативной предпочтительной валюты. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F817%2F1%2A9kVSiz-Z2ogQ1RY5aHBpow.jpeg&t=665&c=nMUpQjoHw0UEQg) • Добавление ссылок в список мультиплатежей при показе транзакции - получатели мультиплатежных транзакций теперь связаны с модальным показом транзакций. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F575%2F1%2A1yxp4uMu3Sch8j7W3mmLBQ.jpeg&t=665&c=A6SWtdbQINauag) • Улучшен UX кошелька на аппаратном уровне - основные улучшения UX в аппаратных взаимодействиях, начиная от кеширования, обновления в фоновом режиме и исправления некоторых сообщений об ошибках (например, отключение при отклонении транзакции). • Пользовательская валидация однорангового узла - улучшенная маркировка и улучшенная валидация однорангового узла при добавлении настраиваемого однорангового узла • Языки на основе классов для локализации - перемещает всю логику локализации в классы и поставляется только с английским по умолчанию. Проложить путь для плагинов локализации. • Заменили различные методы lodash на собственные альтернативы - мы заменили многие функции lodash в Desktop Wallet его альтернативой из чистого / нативного JavaScript для повышения производительности и уменьшения площади зависимостей. • Заменить moment с DayJS - Заменяет все вхождения moment с dayjs. • Извлеченные крипто-поведения из клиентской службы - извлеченные крипто-поведения из ClientServiced каждой транзакции в свой собственный класс, дублированные крипто-утилиты в CryptoUtils класс, из которого они могут использоваться, и методы подписывания транзакций в TransactionSigner класс. • Отрегулирована валидация формы транзакции в bridgechain - капитальный ремонт проверки модальности регистрации в bridgechain с улучшенной проверкой полей ввода и других исправлений. • Обновлен Electron с v6 до v8 - серьезное обновление зависимостей, которое исправляет ошибки и улучшает каркас, используемый внутри кошелька. • Добавлена поддержка TypeScript - теперь файлы TypeScript можно смешивать с нашим текущим кодом. Хотя это лишь некоторые из многих изменений, обязательно прочтите журнал изменений v2.9.0, чтобы узнать больше. Изменения в числахНачиная с предыдущего выпуска: • 8 разных разработчиков вносят свой вклад в ARK Desktop Wallet. • 71 новый коммит в ARK Desktop Wallet. • 260 файлов изменены в ARK Desktop Wallet. • 9173 строки кода добавлены в ARK Desktop Wallet. • 8678 строк кода удалены из кошелька ARK Desktop. Хеш-суммы для v2.9.0 Desktop Wallet (SHA256)• Linux (ark-desktop-wallet-linux-x64–2.9.0.tar.gz)172f9b3a94558afb79ef03e39fe57931393ef05f1b7b64fe706b6990036d82da • MacOS (ark-desktop-wallet-mac-2.9.0.dmg)8fbba3483f1a1e5a04de78d7c3ec48197d7ab05468ee45f4dca985c7fcb2fafe • Ubuntu (ark-desktop-wallet-linux-amd64–2.9.0.deb)b49603a310a7803696ebd27f77fe01c3dbc25837fe8fde4a272bf2a5d2c30b75 • Windows X86 & X64 (ark-desktop-wallet-win-2.9.0.exe)b3d3acd60432c7460937fb12dfe0db3e27f9b768423123f4906920bd9bea19e7 • Linux-AppImage (ark-desktop-wallet-linux-x86_64–2.9.0.AppImage)959e075c87dd71ee270e4e6a82fddb48e5cdb006a6cdf11ace9f363ef9a1fcb0 Я нашел ошибку/проблему - что мне делать?Пожалуйста, откройте вопрос со всеми подробностями на странице ARK Desktop Wallet . Я хочу помочь с развитием - что мне делать?Пожалуйста, откройте pull request , и не забудьте, что мы также запускаем Github development bounty , так что вы можете заработать дополнительне ARK. Прочтите нашу новую whitepaper, следите за нами в социальных сетях ( Twitter | Facebook | Reddit ), присоединяйтесь к нашему сообществу ( Slack | Discord ) и следите за обновлениями в нашем блоге на Medium и Steemit.Перевод. Оригинал: https://blog.ark.io/ark-desktop-wallet-v2-9-0-major-speed-and-performance-improvements-6f6adb024524
|
|
|
|
|
mikhailr
Sr. Member
![*](https://bitcointalk.org/Themes/custom1/images/star.gif) ![*](https://bitcointalk.org/Themes/custom1/images/star.gif) ![*](https://bitcointalk.org/Themes/custom1/images/star.gif)
Offline
Activity: 812
Merit: 443
★777Coin.com★ Fun BTC Casino!
|
ARK Messenger Turtorial - часть первая Приветствую всех в нашей серии учебных пособий, основанных на докозательстве концепции Proof-of-Concept (PoC) ARK Messenger. К концу этой серии вы сможете настроить свое собственное автономное и приватное приложение для обмена сообщениями. Это учебное пособие было создано частично с документацией, предоставленной делегатом Lemii в рамках его концепции подтверждения ARK Messenger, которая финансировалась Программой грантов ARK.Чтобы сделать процесс разработки максимально простым, мы разделим эти учебные пособия на три основных части: Часть Первая• Настройка среды разработки • Создание и развертывание мостовой цепочки локально с пользовательской конфигурацией сети Часть вторая• Разработка пользовательской транзакции • Протестируйте пользовательскую транзакцию с локальной мостовой цепочкой • Разработка клиента Часть третья• Развернуть мостовую цепочку • Запустить клиентское приложение Как работает ARK Messenger?Прежде чем мы углубимся, было бы полезно понять, как работает ARK Messenger! ARK Messenger состоит из двух основных компонентов: (1) клиент; и (2) Мостовая цепочка. • Клиент - это интерфейсное приложение, с которым вы взаимодействуете как пользователь. Он обрабатывает все вводимые пользователем данные и обрабатывает все входящие и исходящие данные в сеть. • Мостовая цепочка - это блокчейн компонент приложения. Она действует как децентрализованная база данных. Если вы хотите просмотреть код для обоих компонентов, они перечислены ниже для вашего удобства: • Код клиента (Client Codebase) • Код мостовой цепочки (Bridgechain Codebase)Приложение ARK Messenger работает с каналами. Канал может состоять из любого количества участников. Когда пользователь создает новый канал, генерируется новый идентификатор канала и пароль. Затем пароль можно передать другим пользователям, чтобы они могли присоединиться к каналу и отправлять сообщения. Сообщения, отправляемые на канал, шифруются и расшифровываются с использованием пароля канала в качестве seed. Все конфиденциальные данные обрабатываются локальным клиентом пользователя, и не зашифрованные данные никогда не передаются. ARK Messenger работает на собственной мостовой цепочке с настраиваемой конфигурацией сети и узла. Он также использует пользовательскую транзакцию, созданную с помощью универсального интерфейса транзакций (GTI) для обработки сообщений чата. Попробуйте ARK Messenger на https://ARKmessenger.ioТеперь, когда у нас есть основа того, что такое ARK Messenger, мы готовы начать. Давайте рассмотрим, как настроить среду разработки. Настройка среды разработкиДокументация к Learn ARK - это идеальный способ для разработчиков пройти через процессы настройки среды разработки. Мы рекомендуем операционную систему Linux ( *.deb based) в качестве среды по умолчанию. Мы официально рекомендуем и поддерживаем операционную систему Ubuntu. Вы также можете настроить свою среду разработки, используя Docker в MacOS/Linux Docker или Docker в Windows. Шаг 1: Настройка пользователяПосле того, как вы запустили свою среду, используя ссылки выше, мы можем создать нового пользователя " arc" и добавить его в группу sudoers (разрешив выполнение root, если это необходимо). Если вы работаете в новом облаке box/vps, например DigitalOcean, то создайте пользователя с помощью следующих команд: sudo adduser ark sudo usermod -aG sudo ark # login as ark user sudo su ark Шаг 2: Установите Систему Управления Версиями GitКак самое популярное программное обеспечение для управления версиями из существующих, оно является основным элементом многих рабочих процессов разработчиков, и ARK не является исключением. Загрузка Git позволит вам клонировать последнюю версию ARKCore. Загрузите его, введя следующую команду: sudo apt-get install -y git curl apt-transport-https update-notifier Шаг 3: Установите Node.js RuntimeПоскольку ARK Core написано исключительно на Node.js , серверной платформе для JavaScript и Typescript, установка Node.js является необходимостью для разработки ядра. Код ниже устанавливает Node.js из исходника. sudo wget --quiet -O - https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add - (echo "deb https://deb.nodesource.com/node_11.x $(lsb_release -s -c) main" | sudo tee /etc/apt/sources.list.d/nodesource.list) sudo apt-get update sudo apt-get install nodejs -y Шаг 4: Установите Yarn Package ManagerYarn - это менеджер пакетов предназначенный для использования опыта npm с Node.js. Хотя yarn не является строгим требованием, во многих случаях он работает быстрее и элегантнее, чем npm. Большинство разработчиков ARK используют yarn, и поэтому вы увидите команды yarn, часто используемые в нашей документации. curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - (echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list) sudo apt-get update sudo apt-get install -y yarn Шаг 5: Установка ЗависимостейЗависимости необходимы для того, чтобы " core" компилировался, запускался и управлялся во время жизни в вашей среде на базе Linux. Приведенная ниже команда устанавливает некоторые из тех необходимых зависимостей, которые используются ядром или связанными сценариями. sudo apt-get install build-essential libcairo2-dev pkg-config libtool autoconf automake python libpq-dev jq -y Шаг 6: клонировать основной репозиторийДавайте клонируем наш " core" репозиторий и запустим начальную " yarn setup" команду. Мы также проверим последнюю " develop" ветку. Команда " yarn setup" использует Lerna для очистки, начальной загрузки и сборки базовых пакетов (включая перенос typescript). Для получения дополнительной информации просмотрите package.json файл в корневой папке. git clone https://github.com/arkecosystem/core cd core git checkout develop #run Lerna to clean, bootstrap and build the core packages yarn setup Шаг 7: Настройка базы данных разработкиARK Core хранит все данные блокчейна в базе данных PostgreSQL. У вас есть два варианта настройки базы данных для разработки. Выполните шаг 7.1, если вы работаете локально на компьютере разработчика и у вас есть среда docker, в противном случае выполните шаг 7.2 (например, если вы работаете в облачном экземпляре Ubuntu или предпочитаете установку собственной базы данных).Шаг 7.1. Настройка базы данных с помощью DockerЕсли вы уже используете Docker и установили docker-compose , то вы можете сгенерировать файлы Docker из командной строки с помощью команды " yarn docker ark" , где ark – это имя network , для которой вы хотите создать файлы docker. На данный момент, давайте придерживаться ark в качестве имени сети по умолчанию. Выполнение команды " yarn docker ark" в корневой папке ранее клонированного репозитория выглядит следующим образом: cd core #root folder of the cloned repository yarn docker ark создаст следующие файлы Docker внутри нашей core/docker папки (см. дерево папок ниже): #core/docker tree in the cloned repository folder ├── development │ ├── devnet │ │ ├── Dockerfile │ │ ├── docker-compose.yml │ │ ├── entrypoint.sh │ │ ├── purge_all.sh │ │ └── restore.sh │ ├── mainnet │ │ └── docker-compose.yml │ ├── testnet #this is the folder where we will start our PostgreSQL testned DB │ │ ├── Dockerfile │ │ ├── docker-compose.yml │ │ ├── entrypoint.sh │ │ ├── purge_all.sh │ │ └── restore.sh │ └── unitnet │ ├── docker-compose.yml │ └── purge.sh └── production ... Чтобы запустить Docker-контейнер PostgreSQL, мы должны зайти в соответствующую папку и запустить " docker-compose" команду. Для testnet нам нужно запустить следующее: cd core/docker/development/testnet docker-compose up postgres #postgres is the name of the PostgreSQL container docker-compose up postgres запустит контейнер PostgresSQL и предоставит его нашему ядру через стандартный порт 5432 PostgreSQL. Шаг 7.2 Установка базы данных Postgres для всей системыЕсли вы не хотите устанавливать и запускать Docker на своем локальном компьютере, вы все равно можете установить базу данных PostgreSQL в своей операционной системе. Для систем Linux на основе * .deb следующие команды: sudo apt-get install postgresql postgresql-contrib -y sudo -i -u postgres psql -c "CREATE USER ark WITH PASSWORD 'password' CREATEDB;" sudo -i -u postgres psql -c "CREATE DATABASE ark_testnet WITH OWNER ark;" sudo -i -u postgres psql -c "CREATE DATABASE ark_devnet WITH OWNER ark;" Приведенные выше команды устанавливают базу данных PostgreSQL локально и создают базы данных для запуска сетей testnet и devnet с пользователем ark в качестве владельца базы данных . Если вы пропустили Шаг 1: Настройка пользователей, вам нужно изменить имя пользователя ark на ваше имя пользователя для разработки, обычно это имя пользователя , вошедшего в систему. Выполните вышеуказанные команды вместе в одном сценарии установкиХотя приведенные выше шаги полезны для ознакомления с ARKCore, некоторые разработчики могут выбрать выполнение вышеперечисленных команд вместе в одном сценарии установки. Сначала создайте пользователя ARK с паролем по умолчанию password. Это облегчит нам работу с настройками по умолчанию. #!/usr/bin/env bash sudo adduser ark sudo usermod -aG sudo ark # login as ark user sudo su - ark После создания и входа в систему под ark пользователем вы можете выполнить следующий сценарий для установки инструментов разработки и зависимостей из Technology Stack. Если пользователь по умолчанию не является пользователем ark, вам следует скопировать и изменить источник скрипта ниже (раздел базы данных). bash <(curl -s https://raw.githubusercontent.com/learn-ark/bash-helper-scripts/master/dev-setup.sh) После этого: #!/usr/bin/env bash sudo apt-get install -y git curl apt-transport-https update-notifier sudo wget --quiet -O - https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add - (echo "deb https://deb.nodesource.com/node_11.x $(lsb_release -s -c) main" | sudo tee /etc/apt/sources.list.d/nodesource.list) sudo apt-get update sudo apt-get install nodejs -y curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - (echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list) sudo apt-get update sudo apt-get install -y yarn sudo apt-get install build-essential libcairo2-dev pkg-config libtool autoconf automake python libpq-dev jq -y sudo apt-get install postgresql postgresql-contrib -y sudo -i -u postgres psql -c "CREATE USER ark WITH PASSWORD 'password' CREATEDB;" sudo -i -u postgres psql -c "CREATE DATABASE ark_testnet WITH OWNER ark;" sudo -i -u postgres psql -c "CREATE DATABASE ark_devnet WITH OWNER ark;" Создание и развертывание мостовой цепочки локально с пользовательской конфигурацией сетиВ последней части этого руководства мы будем создавать и развертывать мостовую цепочку с пользовательской конфигурацией сети. Для этого мы будем использовать документацию, найденную в ARK Deployer Hub. После того, как вы выполните описанные там шаги, вы успешно создадите и развернете свою цепочку мостов. При использовании bridgechain откроется множество опций для настройки сети. Вот краткое описание некоторых параметров, которые использует ARK Messenger: Ticker: Պ Token: MSN Block time: 4 seconds Forgers: 11 p2p port: 11002 API port: 11003 Webhook port: 11004Но самое главное, что bridgechain позволяет вам запускать сеть с вашими собственными транзакциями. Следующие шагиВ следующем части мы рассмотрим разработку пользовательской транзакции, тестирование этой транзакции на нашей мостовой цепочке и разработку клиента, который будет выполнять роль интерфейсного приложения. Если вы застряли в какой-то точке, обязательно ознакомьтесь с нашими документами в центре обучения ARK. Кроме того, наша команда и разработчики активны в Slack, поэтому не стесняйтесь обращаться к нам! Прочтите нашу новую whitepaper, следите за нами в социальных сетях ( Twitter | Facebook | Reddit ), присоединяйтесь к нашему сообществу ( Slack | Discord ) и следите за обновлениями в нашем блоге на Medium и Steemit.
Перевод. Оригинал: https://blog.ark.io/ark-messenger-tutorial-part-one-30068eb8619e
|
|
|
|
safar1980
Legendary
Offline
Activity: 1834
Merit: 1650
Payment Gateway Allows Recurring Payments
|
Перевод https://blog.ark.io/lets-explore-core-part-3-kernel-services-2836756675bdBrian Faust Давайте исследуем ARK Core: часть 3 - ядро и сервисы.Это третья часть серии статей Let Let's Explore ARK Core, в которой описывается разработка следующего основного релиза ARK Core, а также некоторые советы и рекомендации о том, как начать вносить свой вклад и создавать свою идею сегодня. ВступлениеВ первой и второй частях этой серии мы дали приблизительный обзор , как была обновлена базовая инфраструктура и процесс начальной загрузки приложений. Сегодня мы узнаем, какие сервисы внутри ARK Core, почему они были внедрены и как они поддерживают работу ARK Core. Что такое сервис?Прежде чем начать, мы должны подготовить почву, определив, что такое сервис внутри ARK Core. Проще говоря, сервис - это автономная функция, которая предоставляет лишь небольшую часть всей логики, составляющей ядро. Например, служба журналов, служба кэширования, служба базы данных, служба транзакций и т. д. - все они являются важными строительными блоками Core и должны легко изменяться, обслуживаться и тестироваться. Почему были введены сервисы? Сервисы на самом деле не все новые в Core 3.0, а скорее доработки того, как некоторые плагины работают в Core 2.0. В Core 2.0 была одна серьезная проблема, возникшая в результате позднего внедрения системы контейнеров и плагинов, она была настолько сильно фрагментирована, что потребовались плагины для таких функций, как регистраторы. Вы всегда должны будете включать эти плагины при сборке Core вместо того, чтобы они были частью единого пакета, который вам требуется. Как были внедрены сервисы?В Core 3.0 мы представили новый пакет под названием core-kernel, который представляет собой объединение различных пакетов, которые ранее существовали в Core 2.0. Примерами могут быть core-container, core-logger, core-event-emitter и другие Пакет core-kernel является ядром Core 3.0 с целью устранения многих болевых точек по сравнению с предыдущими версиями, улучшения DX, сокращения шаблонов для разработчиков пакетов и, наконец, уменьшения фрагментации, от которой страдает Core 2.0. Часть core-kernel - это каталог сервисов, который поставляется с множеством готовых сервисов, чтобы уменьшить размер шаблона, необходимый для разработки новых пакетов, и уменьшить дублирование в существующих. -Actions -Cache -Config -Events -Filesystem -Log -Mixins -Queue -Schedule -Validation Мы подробнее рассмотрим эти службы в следующей части этой серии. Регистрация ваших собственных сервисовРегистрация ваших собственных сервисов настолько проста, насколько это возможно, и занимает всего несколько строк кода, которые выходят из коробки для разработчиков пакетов. Давайте сначала взглянем на ServiceProvider, который поставляется с Core, чтобы уменьшить необходимый шаблон для регистрации сервисов. @injectable() export abstract class ServiceProvider { /** * The application instance. */ @inject(Identifiers.Application) protected readonly app: Kernel.Application; /** * The application instance. */ private packageConfiguration: PackageConfiguration; /** * The loaded manifest. */ private packageManifest: PackageManifest; /** * Register the service provider. */ public abstract async register(): Promise<void>; /** * Boot the service provider. */ public async boot(): Promise<void> { // } /** * Dispose the service provider. */ public async dispose(): Promise<void> { // } /** * Get the manifest of the service provider. */ public manifest(): PackageManifest { return this.packageManifest; } /** * Set the manifest of the service provider. */ public setManifest(manifest: PackageManifest): void { this.packageManifest = manifest; } /** * Get the name of the service provider. */ public name(): string | undefined { if (this.packageManifest) { return this.packageManifest.get("name"); } return undefined; } /** * Get the version of the service provider. * * @returns {string} * @memberof ServiceProvider */ public version(): string | undefined { if (this.packageManifest) { return this.packageManifest.get("version"); } return undefined; } /** * Get the configuration of the service provider. */ public config(): PackageConfiguration { return this.packageConfiguration; } /** * Set the configuration of the service provider. */ public setConfig(config: PackageConfiguration): void { this.packageConfiguration = config; } /** * Get the configuration defaults of the service provider. */ public configDefaults(): JsonObject { return {}; } /** * Get the configuration schema of the service provider. */ public configSchema(): object { return {}; } /** * Get the dependencies of the service provider. */ public dependencies(): Kernel.PackageDependency[] { return []; } /** * Enable the service provider when the given conditions are met. */ public async enableWhen(): Promise<boolean> { return true; } /** * Disable the service provider when the given conditions are met. */ public async disableWhen(): Promise<boolean> { return false; } /** * Determine if the package is required, which influences how bootstrapping errors are handled. */ public async required(): Promise<boolean> { return false; } }
|
|
|
|
safar1980
Legendary
Offline
Activity: 1834
Merit: 1650
Payment Gateway Allows Recurring Payments
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
March 25, 2020, 01:02:02 PM Last edit: March 25, 2020, 01:15:53 PM by safar1980 |
|
продолжение: Довольно много кода, поэтому давайте разобъем его на удобно читаемые части. 1. Абстрактный метод register вызывается загрузочными классами, которые отвечают за регистрацию сервисов. Этот метод должен регистрировать только то, что указано в его имени, и не запускать что-либо вроде HTTP-серверов 2. Метод загрузки вызывается классами загрузчика, которые отвечают за загрузку сервисов. Это должно действовать в зависимости от того, что произошло в методе register, то есть запустить HTTP-сервер. 3. Метод dispose вызывается классами начальной загрузки, отвечающими за удаление служб. Это должно действовать в зависимости от того, что произошло в методе загрузки, то есть остановить HTTP-сервер. 4. Метод manifest предоставляет доступ к package.json пакета для сбора информации, такой как имя или версия. 5. SetManifest вызывается классами начальной загрузки, которые отвечают за регистрацию сервисов. Файл package.json пакета будет автоматически загружен, проанализирован и, наконец, сохранен с помощью этого метода. 6. Метод name возвращает содержимое свойства name внутри файла package.json пакета. 7. Метод version возвращает содержимое свойства version в файле package.json пакета. 8. Метод config предоставляет доступ к конфигурации пакета после его проверки и нормализации. 9. Метод setConfig вызывается загрузочными классами, которые отвечают за регистрацию сервисов. Конфигурация будет проверена, нормализована и, наконец, сохранена с помощью этого метода. 10. Метод configDefaults вызывается классами начальной загрузки, которые отвечают за регистрацию служб. Возвращаемое значение этого метода будет объединено с предоставленной пользователем конфигурацией, чтобы обеспечить доступность всех значений. 11.Метод configSchema вызывается классами начальной загрузки, которые отвечают за регистрацию служб. Этот метод должен возвращать схему @ hapi / joi, которая будет использоваться для проверки и нормализации конфигурации. 12.Метод dependencies вызывается классами начальной загрузки, которые отвечают за регистрацию сервисов. Возвращаемое значение этого метода должно быть массивом объектов, которые содержат информацию, такую как имена и ограничения версии. 13.Методы enableWhen / disableWhen вызываются классами начальной загрузки при применении блока и отвечают за (де) регистрацию служб. Эти методы должны возвращать логическое значение, которое определяет, когда включать или отключать службу. 14. required метод вызывается классами начальной загрузки, которые отвечают за регистрацию служб. Этот метод должен возвращать логическое значение, которое определяет, требуется ли служба. Обязательные плагины получают более строгую обработку ошибок, а любые ошибки во время регистрации или загрузки приводят к завершению процесса. Это та функциональность, с которой поставщик услуг поставляется «из коробки», но в большинстве случаев единственными методами, с которыми вы будете взаимодействовать, являются регистрация, загрузка и удаление. Давайте посмотрим на пример поставщика сервисов, чтобы проиллюстрировать их использование. import { Providers } from "@arkecosystem/core-kernel"; import { Server } from "@hapi/hapi"; export class ServiceProvider extends Providers.ServiceProvider { public async register(): Promise<void> { this.app.bind<Server>("api").toConstantValue(new Server()); } public async boot(): Promise<void> { await this.app.get<Server>("api").start(); } public async dispose(): Promise<void> { await this.app.get<Server>("api").stop(); } }
1. Метод register связывает новый экземпляр сервера hapi.js с контейнером без его запуска. 2.Метод boot извлекает ранее зарегистрированный сервер из контейнера и вызывает метод start на нем. 3.Метод dispose извлекает ранее зарегистрированный сервер из контейнера и вызывает для него метод stop. Как видите, зарегистрировать свои собственные сервисы довольно легко и без особых хлопот, и все четко обозначено, давайте закончим перечислением некоторых преимуществ этой новой архитектуры по сравнению с Core 2.0. Преимущества нового жизненного цикла поставщика сервисов-Четкое разделение обязанностей при загрузке приложения. -Простое тестирование благодаря четкому разделению обязанностей. -Возможность включать и отключать пакеты во время выполнения без полного демонтажа. Самым большим преимуществом для разработчиков пакетов является то, что теперь возможно изменять или расширять другие пакеты благодаря тому, как работает самозагрузка приложения. Примером этого может быть плагин, который добавляет новые маршруты или плагины в пакет core-api перед запуском сервера. Все, что нужно - это разрешить сервер hapi.js из контейнера в методе register и вызвать обычные методы. Это избавляет от необходимости раскручивать свой собственный HTTP-сервер, если вам просто нужно 1-2 дополнительных конечных точки API. Возможность изменять другие плагины до их запуска предоставит разработчикам больший контроль и возможности изменять поведение ядра. Что дальше?На этом завершается третья часть серии ARK Core Adventures. В следующей части мы рассмотрим, как ARK Core 3.0 является более расширяемым, чем когда-либо, и как вы можете воспользоваться этим, чтобы сократить время, затрачиваемое на разработку пакетов. Предыдущие статьи: Часть 1: Инфраструктура https://blog.ark.io/lets-explore-ark-core-v3-part-1-infrastructure-5c8ba13c9c42Часть 2: Bootstrap & Events https://blog.ark.io/lets-explore-core-v3-part-2-bootstrap-events-f24adf70dfff
|
|
|
|
xandry
Moderator
Legendary
Offline
Activity: 3556
Merit: 4314
Crypto Swap Exchange
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
April 02, 2020, 05:40:16 PM Merited by Symmetrick (2) |
|
Вышел кошелёк ARK Desktop версии 2.9.1 Обновление включает в себя расширение функциональности плагинов, исправление множества ошибок и многое другое! Загрузить можно с https://ark.io/walletХэш-суммы для файлов кошелька 2.9.1 (SHA256)Linux (ark-desktop-wallet-linux-x64–2.9.1.tar.gz)708e52ee9eea5b21390bebd18d278a3c6f7579bd0d3d168f4c375a0984b24778 MacOS (ark-desktop-wallet-mac-2.9.1.dmg)fe428a1d7e89fcaa870c70db9a19de93bd9def66460e03eef0f80500f7d72669 Ubuntu (ark-desktop-wallet-linux-amd64–2.9.1.deb)06537ff90663560d82b710bb28d3826755924caf75b8d5ce5ddca271505ea7f1 Windows X86 & X64 (ark-desktop-wallet-win-2.9.1.exe)b73c6ef213f7ecf250e8ccb52f9e1171d51f090469b1b8aa1f0aeae1d1c94239 Linux-AppImage (ark-desktop-wallet-linux-x86_64–2.9.1.AppImage)c5d6f083630fcb9f1910714dac567678359c7c6563baa01b146e8244f0623950 Источник: https://bitcointalk.org/index.php?topic=1649695.msg54099868#msg54099868
|
|
|
|
BRANDONs
Member
![*](https://bitcointalk.org/Themes/custom1/images/star.gif)
Offline
Activity: 78
Merit: 14
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
April 03, 2020, 04:38:04 AM Last edit: April 03, 2020, 03:54:23 PM by BRANDONs Merited by xandry (7), wavug (1) |
|
Арк Мессенджер учебник - часть 2 Учебное пособие по разработке автономного и приватного приложения для обмена сообщениями
Приветствую всех во второй части нашей серии руководств, основанных на доказательстве концепции ARK Messenger (PoC). В первой части мы создали среду разработки и развернули собственную настраиваемую цепочку мостов. Эта серия была создана с документацией, предоставленной делегатом Лемием как часть ARK Messenger Proof-of-Concept, финансируемой программой грантов ARK.Одна из основных целей этой серии - успешно продемонстрировать различные способы работы разработчиков с ARK Core. В этой части серии мы научимся разрабатывать и тестировать пользовательские транзакции для нашей мостовой цепочки. Кроме того, мы также будем разрабатывать клиент, который пользователи интерфейсного приложения будут использовать для взаимодействия со службой обмена сообщениями. НачинаемПрежде чем мы начнем разработку и тестирование наших пользовательских транзакций, нам необходимо описать технические характеристики приложения. Это важно, потому что очень сложно вносить изменения после того, как эти параметры были установлены. В качестве примера рассмотрим технические характеристики ARK Messenger. ARK Messenger реализует пользовательскую транзакцию сообщения. Это транзакция, которая будет содержать зашифрованное сообщение, отправляемое пользователем. Транзакция должна соответствовать следующим правилам: - Установите сумму перевода на 0 и примените низкую статическую комиссию (в настоящее время 0,01).
- Уметь хранить относительно большой объем данных сообщения (1024 байта).
- Должен иметь уникальный тип и группу типов (101, 1001).
Это были соображения, сделанные до разработки пользовательской транзакции. В дополнение к изложению ваших технических спецификаций вы можете ознакомиться с принципами работы пользовательских транзакций в ARK. Приведенная ниже статья даст вам прочную основу для понимания того, как интеллектуальные / пользовательские транзакции работают в ARK Core Blockchain Framework. Как понимать и описывать типы пользовательских транзакций.Создание пользовательской транзакцииСоздание пользовательской транзакции - простой процесс. В качестве шаблона мы будем использовать пользовательскую транзакцию ARK Messenger - Message Transaction. Пользовательская транзакция сообщения основана на транзакции регистрации бизнеса из руководства выше. Для справки, вы можете найти код здесь. Чтобы создать собственную пользовательскую транзакцию, мы рассмотрим класс транзакции, обработчик транзакции и конструктор транзакций ниже. Пожалуйста, используйте файлы ниже, работая над каждым: Транзакция сообщения (создание нашей пользовательской транзакции)В самом верху мы определяем наш пользовательский тип и группу типов: const MESSAGE_TYPE = 101;const MESSAGE_TYPE_GROUP = 1001; Чуть ниже мы определяем нашу схему транзакций: public static getSchema(): Transactions.schemas.TransactionSchema {return schemas.extend(schemas.transactionBaseSchema, {…}} Одно отличие, которое вы заметите, в отличие от транзакции регистрации бизнеса, мы включили поле receientId в нашу схему. Это связано с тем, что это поле используется в качестве «идентификатора канала» для наших целей. Кроме того, мы определяем остальную часть транзакции и наш объект сообщения, который будет использоваться для данных сообщения. Ниже схемы мы определяем нашу статическую плату 0,01. Мы используем значение 1000000, поскольку ARK SDK не работает с числами с плавающей запятой, а количество десятичных разрядов равно 8. Что касается функциональности serde (сериализатор / десериализатор); в основном она работает так же, как транзакция регистрации бизнеса, за исключением двух важных вещей: Буферная функция writeUint8 ограничена размером 256 байт. Поскольку мы хотим обрабатывать данные сообщения максимум 1024 байта, мы должны вместо этого использовать вариант writeUint16.Поскольку мы хотим использовать в транзакции receientId, мы должны включить его и в процесс serde:Сериализатор: const { addressBuffer, addressError } = Identities.Address.toBuffer(data.recipientId); options.addressError = addressError; buffer.append(addressBuffer); Десериализатор: data.recipientId = Identities.Address.fromBuffer(buf.readBytes(21).toBuffer()); Обработчик сообщенийДалее мы будем работать с обработчиком транзакций сообщений. Поскольку транзакция сообщения относительно проста, мы можем опустить большую часть логики из обработчика транзакции регистрации бизнеса. Используя throwIfCannotBeApplied, мы явно проверяем правильность данных сообщения: const { data }: Interfaces.ITransaction = transaction;const { message }: { message: string } = data.asset.messageData;if (!message) {throw new MessageTransactionAssetError();}await super.throwIfCannotBeApplied(transaction, wallet, databaseWalletManager); В applyToSender и revertForSender мы выполняем действия по умолчанию применить и отменить. Методы applyToRecipient и revertForRecipient не используются, поскольку ни один из атрибутов получателя не изменяется в результате обработки Message Transaction. Кроме того, мы позволяем базовому TransactionHandler… обрабатывать все остальное. Построитель сообщений
Компоновщик, представленный в этом файле, будет использоваться в клиенте ARK Messenger для создания Message Transactions, когда пользователь отправляет сообщение. Сначала мы инициализируем объект данных с помощью метода class constructor (): constructor() {super();this.data.type = MessageTransaction.type;this.data.typeGroup = MessageTransaction.typeGroup;this.data.version = 2;this.data.fee = Utils.BigNumber.make("1000000");this.data.amount = Utils.BigNumber.ZERO;this.data.asset = { messageData: {} };this.data.recipientId = undefined;}; Далее мы создаем метод, который мы можем использовать для добавления данных сообщения в транзакцию: public messageData(message: string): MessageTransactionBuilder {this.data.asset.messageData = {message,};}; Наконец, нам нужно добавить нестандартные поля в объект данных транзакции, когда он вызывается с помощью getStruct (): const struct: Interfaces.ITransactionData = super.getStruct();struct.amount = this.data.amount;struct.asset = this.data.asset;struct.recipientId = this.data.recipientId;return struct;}; Тестирование построителя пользовательских транзакцийЕсть несколько способов проверить вашу пользовательскую транзакцию. Один из лучших вариантов - создать тестовый файл с помощью Jest. Этот тестер также используется для других пакетов ARK, так что это хорошая синергия. Вверху мы импортируем все необходимые пакеты: import “jest-extended”; import { Managers, Transactions } from “@arkecosystem/crypto”; import { MessageTransactionBuilder } from “../src/builders”; import { MessageTransaction } from “../src/transactions”; Затем нам нужно внести некоторые коррективы с помощью менеджера конфигурации, чтобы иметь возможность фактически создать транзакцию. Сначала мы выбираем предустановку сети testnet и устанавливаем height равной 2. Это активирует этап AIP11. Managers.configManager.setFromPreset(“testnet”); Managers.configManager.setHeight(2); Теперь мы включаем нашу новую пользовательскую транзакцию в реестр транзакций: Transactions.TransactionRegistry.registerTransactionType(MessageTransaction); На этом настройка завершена. Осталось создать тест, который проверяет, что транзакция может быть построена и проверена: describe(“Test builder”, () => { it(“should verify correctly”, () => { const builder = new MessageTransactionBuilder(); const tx = builder .messageData(“SomeMessage”) .nonce(“3”) .recipientId(“AYeceuGa7tTsyG6jgq7X6qKdoXt9iJJKN6”) .sign(“clay harbor enemy utility margin pretty hub comic piece aerobic umbrella acquire”); expect(tx.build().verified).toBeTrue(); expect(tx.verify()).toBeTrue(); }); }); Наконец, мы проверим эти транзакции в сети. Тестирование пользовательской транзакции в сетиКогда тест для сборщика пройден, мы можем продолжить интеграцию пользовательских транзакций для bridgechain. Во-первых, нам нужно включить пользовательскую транзакцию в качестве плагина в bridgechain. Информацию о том, как создать плагин, можно найти здесь: Как написать основной плагин.Вы можете посмотреть наш файл плагина Message Transaction здесь: plugin.js.Чтобы интегрировать плагин Message Transaction в bridgechain, мы просто должны включить его в конец файла plugins.js, который находится в ./packages/core/bin/config/ enjnetwork broadcast/plugins.js module.exports = {….“message-transaction”: {},}; Теперь, когда мы запустим yarn setup для установки bridgechain, она также автоматически установит пользовательскую транзакцию и включит ее в качестве плагина при запуске. Когда bridgechain работает (локально), мы можем проверить правильность интеграции пользовательской транзакции, проверив следующую конечную точку API: http://127.0.0.1:11003/api/transactions/typesЕсли наша пользовательская транзакция присутствует в списке доступных типов транзакций, мы можем попытаться опубликовать фактическую транзакцию в цепочке блоков, чтобы проверить, правильно ли она обрабатывается. Это можно сделать разными способами, но предпочтительным способом является использование простых скриптов. Проверка завершается, когда транзакция транслируется и обрабатывается сетью. Теперь мы успешно реализовали нашу Message Transaction! Следующим шагом является разработка клиента чата, с которым пользователь будет взаимодействовать. Использование пользовательской транзакции в клиентеКак упоминалось ранее, клиент был создан с помощью ReactJS и написан на TypeScript. С полной кодовой базой можно ознакомиться здесь.
Чтобы использовать пользовательскую транзакцию в нашем клиенте чата, мы сначала должны включить некоторые файлы в наш проект. Части, которые нам нужны - это Transaction Message и Message Transaction Builder. Мы можем просто скопировать и вставить их ранее и поместить в папку / src /. Поскольку Message Transaction Handler используется только для ядра, его можно опустить. Теперь мы можем просто импортировать Message Transaction Builder в любое место нашего приложения, чтобы использовать его. В клиенте ARK Messenger он импортируется в отдельный файл утилит, как вы можете видеть здесь.import { encryptMessage, fetchRemoteNonce, broadcastTransaction } from ‘./index’;import { Transactions } from ‘@arkecosystem/crypto’;import { ITransactionData, IPostTransactionResponse } from ‘../interfaces’;import { MessageTransaction } from ‘../custom-transactions/message-transaction/transactions’;import { MessageTransactionBuilder } from ‘../custom-transactions/message-transaction/builders’; Необходимо зарегистрировать новый тип транзакции в Реестре транзакций: Transactions.TransactionRegistry.registerTransactionType(MessageTransaction); Мы используем пользовательскую версию сети, определенную в переменной среды. Мы храним это в переменной const, которая будет передана построителю транзакций: const NETWORK = Number(process.env.REACT_APP_NETWORK); Наконец, мы можем вызывать конструктор в наших пользовательских функциях транзакций, которые будут использоваться для функциональности чата: const createMessageTransaction = async (recipientId: string,encryptedMessage: string,passphrase: string,senderId: string): Promise<ITransactionData> => {const nonce = await fetchRemoteNonce(senderId);const tx = new MessageTransactionBuilder().network(NETWORK).recipientId(recipientId).messageData(encryptedMessage).nonce(nonce).sign(passphrase);return tx.getStruct();};export const sendMessage = async (recipientId: string,text: string,channelPassphrase: string,userPassphrase: string,userAddress: string): Promise<IPostTransactionResponse | void> => {const encryptedMessage = encryptMessage(text, channelPassphrase);try {const tx = await createMessageTransaction(recipientId,encryptedMessage,userPassphrase,userAddress);return broadcastTransaction(tx);} catch (err) {console.error(err);}}; Альтернативы этому подходу: - Загрузите пользовательскую транзакцию в качестве модуля в NPM.
- Используйте подмодули Git.
Следующие шагиВ нашем следующем и последнем уроке мы будем развертывать bridgechain и запускать клиентское приложение. Кроме того, мы выделим все примеры, касающиеся того, как разработчики могут работать с ядром ARK. Благодаря будущим обновлениям и улучшениям, ARK Core будет оставаться одним из самых простых и гибких способов создания блокчейн-решений. Если вы застряли в какой-то момент, обязательно ознакомьтесь с нашими документами в центре обучения ARK. Кроме того, наша команда и разработчики сообщества активны в Slack, поэтому не стесняйтесь обращаться к нам! Прочитайте наш новый технический документ, следите за нами в социальных сетях ( Twitter | Facebook | Reddit), присоединяйтесь к нашему сообществу ( Slack | Discord) и следите за обновлениями в нашем блоге на Medium и Steemit. Перевод. Оригинал:ARK Messenger Tutorial — Part Two
|
|
|
|
KTChampions
Legendary
Online
Activity: 2436
Merit: 1931
Leading Crypto Sports Betting & Casino Platform
|
Релиз ARK Mobile Wallet v1.8.0 - расширенная поддержка разработчиков![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2FmKmZ9MU.png&t=665&c=sDYzxsQySKAJUw) Последнее обновление ARK Mobile Wallet уже здесь! Эта версия ориентирована на улучшение взаимодействия с пользователем с помощью новых полей ввода и упрощает разработку благодаря обновленным зависимостям, большему охвату тестовых возможностей и новым функциям (режим разработчика, Angular Storybook и т. д.). Мы перешли к более коротким циклам выпуска продуктов ARK, и ARK Mobile Wallet станет очередным обновлением. Этот релиз включает в себя несколько обновлений дизайна и улучшенное взаимодействие с пользователем. Вы можете обновить ARK Mobile Wallet из Google Play/Apple's App Store или посетить https://android.ark.io (Android)/https://ios.ark.io (iOS).Исходный код движется к тому, чтобы быть более ориентированным на разработчика (версии обновления Ionic и Angular), увеличивая охват тестами путем написания тестовых примеров и многого другого. Давайте рассмотрим изменения в этом новом выпуске. Что нового?- Унифицированные поля ввода - мы унифицировали дизайн полей ввода, которые будут использоваться в нашей линейке продуктов. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2FuhKuFIS.png&t=665&c=27Vc3y4-5VqRMQ) - Изменено поле выбора комиссии и исправлена ошибка при ручном вводе - мы обновили дизайн для выбора комиссии при передаче ARK или голосовании за делегата. У этого дизайна теперь есть ползунок в нижней строке поля оплаты. Вы можете выбрать минимальную, среднюю или максимальную комиссию, нажав на соответствующую кнопку. Мы также исправили поле ручного ввода (цифры можно редактировать напрямую). ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2FuETOGm0.jpg&t=665&c=4AHjoiNZKo6Big) - Выбор кошелька в окне транзакций - новое окно выбора кошелька облегчает поиск кошелька получателя транзакции из предварительно определенного списка (кошельки из ранее отправленных транзакций или списка контактов). ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2FalEEtOO.png&t=665&c=j5gwXcadYfxWXw) - Добавлен «Режим разработчика» - режим разработчика разблокирует функции, которые помогут нам (и разработчикам) отлаживать ошибки, обнаруженные пользователями. Режим разработчика можно включить, открыв боковое меню - откройте «Настройки» - щелкните 5 раз в поле «Версия». Теперь режим разработчика будет включен, и будет показывать новый «Просмотр журнала событий» на странице настроек. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2FIYVbgiC.png&t=665&c=6jo5ryklDp0EqQ) С помощью Журнала Событий вы сможете увидеть детали процессов, происходящих за кулисами (включая ошибки для упрощения отладки). ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2FkOIfQxN.jpg&t=665&c=KM1ESGuG02xHbQ) - Настройки стиля экрана подтверждения пароля - исправлены стили на обоих экранах подтверждения пароля и 2-го пароля. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2FrgdnekR.jpg&t=665&c=R_0TSlfbpqjXfw) - Реализована Angular Storybook - Storybook (Книга историй - прим. KTChampions) похожа на веб-редактор, где вы можете конструировать компоненты и их взаимодействия изолированно и визуально видеть, как они работают. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.imgur.com%2F14MUTiT.png&t=665&c=8bzsCa3WZ2R6tA) - Исправлена кнопка «Назад» на экране панели кошелька - навигация по маршруту кошелька при нажатии. - Крупное обновление версии Angular с 8 до 9 - мы обновили Angular до версии 9.x, добавив множество улучшений, ориентированных на разработчиков, исправление ошибок и повышение производительности. - Миграция из TSLint в ESLint - из-за устаревания TSLint мы обновляемся, чтобы использовать вместо него ESLint. - Обновление и экспорт из истории свойств кошелька - сброс свойств кошелька в свободный массив в случае отсутствия профиля или пустой текущейНастройки кошелька. Это помогает в случае, когда пользователь удаляет последний кошелек в портфеле. Изменения в цифрахСчитая с предыдущего релиза: - 4 разных разработчика, участвовали в работе над ARK Mobile Wallet. - 48 новых изменений в ARK Mobile Wallet. - 265 файлов изменено в ARK Mobile Wallet. - 26 472 строки кода добавлено в ARK Mobile Wallet. - 17,010 строк кода удалены из ARK Mobile Wallet. Я нашел ошибку/проблему - что мне делать?Пожалуйста, откройте обсуждение со всеми подробностями на странице Проблемы ARK Mobile Wallet. Я хочу помочь с разработкой - что мне делать?Пожалуйста, создайте запрос на добавление, и не забудьте, что мы также запускаем баунти для разработчиков на Github, так что вы можете заработать дополнительные токены ARK. Оригинал: https://blog.ark.io/ark-mobile-wallet-v1-8-0-released-enhanced-developer-support-ed64f4257020Автор: Rok ČernecПеревод: KTChampions Буду благодарен за помощь в исправлении ошибок и неточностей.
|
..Stake.com.. | | | ▄████████████████████████████████████▄ ██ ▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄ ██ ▄████▄ ██ ▀▀▀▀▀▀▀▀▀▀ ██████████ ▀▀▀▀▀▀▀▀▀▀ ██ ██████ ██ ██████████ ██ ██ ██████████ ██ ▀██▀ ██ ██ ██ ██████ ██ ██ ██ ██ ██ ██ ██████ ██ █████ ███ ██████ ██ ████▄ ██ ██ █████ ███ ████ ████ █████ ███ ████████ ██ ████ ████ ██████████ ████ ████ ████▀ ██ ██████████ ▄▄▄▄▄▄▄▄▄▄ ██████████ ██ ██ ▀▀▀▀▀▀▀▀▀▀ ██ ▀█████████▀ ▄████████████▄ ▀█████████▀ ▄▄▄▄▄▄▄▄▄▄▄▄███ ██ ██ ███▄▄▄▄▄▄▄▄▄▄▄▄ ██████████████████████████████████████████ | | | | | | ▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄ █ ▄▀▄ █▀▀█▀▄▄ █ █▀█ █ ▐ ▐▌ █ ▄██▄ █ ▌ █ █ ▄██████▄ █ ▌ ▐▌ █ ██████████ █ ▐ █ █ ▐██████████▌ █ ▐ ▐▌ █ ▀▀██████▀▀ █ ▌ █ █ ▄▄▄██▄▄▄ █ ▌▐▌ █ █▐ █ █ █▐▐▌ █ █▐█ ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀█ | | | | | | ▄▄█████████▄▄ ▄██▀▀▀▀█████▀▀▀▀██▄ ▄█▀ ▐█▌ ▀█▄ ██ ▐█▌ ██ ████▄ ▄█████▄ ▄████ ████████▄███████████▄████████ ███▀ █████████████ ▀███ ██ ███████████ ██ ▀█▄ █████████ ▄█▀ ▀█▄ ▄██▀▀▀▀▀▀▀██▄ ▄▄▄█▀ ▀███████ ███████▀ ▀█████▄ ▄█████▀ ▀▀▀███▄▄▄███▀▀▀ | | | ..PLAY NOW.. |
|
|
|
vaultman
Copper Member
Full Member
![*](https://bitcointalk.org/Themes/custom1/images/star.gif) ![*](https://bitcointalk.org/Themes/custom1/images/star.gif)
Offline
Activity: 493
Merit: 170
BountyMarketCap
|
ARK Desktop Wallet v2.9.1 - Расширенное использование плагиновВыпущена новая версия Desktop Wallet. Это обновление направлено на добавление дополнительных функций в диспетчер плагинов и устранение недавно обнаруженных проблем.Вы можете загрузить ARK Desktop Wallet по адресу https://ark.io/wallet или использовать новую функцию загрузки из своего текущего кошелька (доступна в v2.7.0 +). С более частыми обновлениями Desktop Wallet мы хотим приносить постоянный поток улучшений для наших пользователей. В этом обновлении мы расширили удобство использования менеджера плагинов, предоставив разработчикам больше внутренних возможностей, добавив новый раздел языковых плагинов и многое другое, так что давайте перейдем к нему! Что нового?• Добавлена иконка ARK Grants и обновлена конфигурация подключаемых модулей — с помощью разработки компании ARK новейшей программы ARK Grants (перейдите по ссылке, если вы хотите узнать больше о том, как вы можете получить финансирование, разрабатывая плагины Desktop Wallet), мы добавили специальный значок, который будет присваиваться каждому финансируемому плагину внутри рабочего стола кошелька. Мы также переместили иконку плагина ARK Official, чтобы она соответствовала этому дизайну и находилась рядом с названием плагина.
![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F1%2A-uUFdKP4qosXtrQqZWRYDQ.png&t=665&c=P74PU1tYLPdX2Q)
• Разрешение плагинам добавлять языки — добавляет разрешение LANGUAGES (языки) которое позволяет плагинам добавлять новые языки. Все потенциальные языки теперь будут доступны через плагины.
![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F2000%2F1%2AOYAT4XYBpOTvKtuSEUtBYw.png&t=665&c=qdx-1BlYCuExDA)
• Разбивка слов, если сообщение поля вендора велико — при просмотре модальной транзакции с большим полем вендора сообщение разбивается на отдельные строки, чтобы сохранить модальный размер разумным.
![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F1056%2F1%2Ap_vMuohlJOsudGK2uZdiyQ.png&t=665&c=y7eqz3CbqqTM0A)
• Возможность установить тип оплаты по умолчанию — добавляет новую опцию на страницу редактирования профиля, которая позволяет пользователю указать используемый тип оплаты транзакции по умолчанию, LAST (последний) или AVERAGE (средний).
![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F1%2ASUgRXN9pc0SN5huL9PKUDw.png&t=665&c=5j4SwCpcLwfPpg)
• Добавлена полоса прокрутки в список установленных плагинов — если установлено 5 или более плагинов, кошелек добавит полосу прокрутки в список плагинов.
![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F972%2F1%2ApQi3It3vqO2RWhUGYjHivw.gif&t=665&c=Pai8rGx3wZQsSA)
• Возможность использования стрелок влево и вправо на клавиатуре для переключения между изображениями плагинов — когда вы просматриваете определенные изображения плагинов с помощью ползунка, вы можете использовать стрелки влево или вправо для перемещения между ними.
![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F1338%2F1%2AdloERpGQPfhtloKG0X_KrQ.gif&t=665&c=AQJ29gN5sbWWYg)
• Возможность добавления имен в темы плагинов — темы плагинов могут иметь дополнительное свойство name (имя) в своих настройках, которое будет отображаться в соответствующих раскрывающихся списках в боковом меню приложения и на странице редактирования профиля.
![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fmiro.medium.com%2Fmax%2F980%2F1%2A3scxakEec93P8Ps9TVVSaQ.png&t=665&c=i3fZlwwGfWgZsg)
• Добавлено отображение модуля деталей множественных платежей — несколько улучшений вида множественных платежей, такие как: выравнивание умного соединения справа и пометки сверху, добавление счета получателей, добавление общей сумму, добавление поля вендора и комиссии. • Список соединительной цепочки не обновляется автоматически после регистрации — После регистрации цепочки список цепочки теперь автоматически обновляется без необходимости перезагрузки или смены однорангового узла для его отображения. • Улучшения в мультиподписях — исправлена ошибка при выполнении отказа цепочки, исправлена проблема, при которой кнопка «подписать» все еще отображалась для транзакции с несколькими подписями, даже если было достигнуто количество минимальных подписей, а также исправлена потенциальная ошибка с проверкой вида голосования транзакции. • Возможность выбора известные кошельки из хранилища — известные кошельки теперь доступны в общем хранилище. • Предоставление большего количества компонентов пользовательского интерфейса для плагинов — теперь разработчики могут использовать компоненты пользовательского интерфейса, так как они новые теперь доступны для плагинов: WalletIdenticon, SvgIcon, ModalCloseConfirmation, ModalConfirmation и ModalWindow. • Предоставление диалогов сохранения / открытия для плагинов — методы electron_writeFile и electron_readFile теперь доступны для системы плагинов. Доступ к ним можно получить, добавив разрешение DIALOGS: walletApi.dialogs.save(raw, filename, filters)и walletApi.dialogs.open(filters). • Замена API ценообразования на Platform SDK — мы заменили API ценообразования на недавно разработанный пакет Platform SDK, который будет использоваться для обмена данными между нашими приложениями. • Попробуйте сначала загрузить изображения локальных плагинов — вместо того, чтобы извлекать изображения для предварительного просмотра по определенным URL-адресам напрямую, попробуйте сначала получить изображения по пути по умолчанию (images/). • Добавлена область действия для маршрутов плагина и пунктов меню — область маршрутов плагина находится под идентификатором плагина. Навигация через разрешение ROUTES все еще может быть выполнена без использования области. • Возможность выставлять темы профилей для плагинов — для отображения графики в соответствующей цветовой схеме (темная / светлая) плагинам нужна информация о текущей определенной теме. • Разрешение одновременного поиска всех глобальных опций плагина — рефакторинг метода getOptions «песочниц» хранилища, чтобы можно было извлечь все глобальные опции. • Разрешение плагинам очистить все опции одновременно — расширяет изолированную программную среду хранения методом clear(global = false) , который позволяет плагинам очистить свои сохраненные данные сразу. • Скорректирована проверка формы транзакций для бизнеса и соединительной цепочки — мы добавили улучшенные проверки и исправили некоторые ошибки проверки при попытке зарегистрировать свой собственный бизнес или соединительную цепочку в APN. • Исправлена кнопка возврата после перезагрузки кошелька — кнопка возврата не работала должным образом, если вы перезагрузили кошелек. • Ошибка при воздействии с необработанной транзакцией при ее сохранении — исправлена ошибка, из-за которой повторная отправка просроченной транзакции завершалась неудачно, при этом все еще отображалось сообщение об успехе. • Обновление заголовков меню Mac — унифицированы заголовки меню на разных платформах. • Предоставление текущего однорангового модуля плагинам и разрешение параметров в запросах — текущий одноранговый узел может быть представлен через API-интерфейс кошелька к плагинам и может быть получен с помощью walletApi.peers.getCurrent(). Он также реорганизует методы get / post для принятия объекта параметров, который, например, позволяет передавать параметры запроса вместо создания URL-адреса. • Отображение однорангового обнаружения для плагинов — предоставление экземпляра однорангового обнаружения для системы плагинов. Экземпляр создается путем использования метода диспетчеризации getPeerDiscovery из модуля однорангового хранилища, чтобы не дублировать логику создания экземпляра. • Предоставление плагина BigNumber и сервиса Datetime для плагинов — мы добавили новое разрешение плагина UTILS, которое предоставляет плагин BigNumber и сервис datetime, к которым можно обращаться как walletApi.utils.bigNumber и walletApi.utils.datetime соответственно. • Добавлена функция «смотреть» для разрешенных ключей компонентов — позволяет использовать наблюдателей в компонентах плагинов. • Разрешено скрытие кнопки отмены в модуле подтверждения — при определенных обстоятельствах имеет смысл использовать модуль подтверждения только с одной опцией. Этот PR добавляет новое предложение к компоненту ModalConfirmation , которое позволяет скрыть кнопку отмены. • Добавлены группы типов при вводе последней комиссии — последние сохраненные комиссии сгруппированы по типу, что не позволяет магистральным транзакциям переопределять последние комиссии стандартных транзакций. • Ожидание следующего тика при фокусировке ввода пароля / парольной фразы — при переключении видимости парольной фразы и ввода пароля фокус устанавливается до полной визуализации компонента, таким образом вызывая фокусировку в начале ввода, а не в конце.Изменения в цифрахНачиная с предыдущего выпуска:
• 11 различных разработчиков вносят свой вклад в ARK Desktop Wallet. • 70 новых фиксаций в ARK Desktop Wallet. • 179 файлов изменено в ARK Desktop Wallet. • 6,978 строчек кода добавлено в ARK Desktop Wallet. • 1,804 строки кода удалены из ARK Desktop Wallet.Хеши для v2.9.1 Desktop Wallet • Linux (ark-desktop-wallet-linux-x64–2.9.1.tar.gz) 708e52ee9eea5b21390bebd18d278a3c6f7579bd0d3d168f4c375a0984b24778 • MacOS (ark-desktop-wallet-mac-2.9.1.dmg) fe428a1d7e89fcaa870c70db9a19de93bd9def66460e03eef0f80500f7d72669 • Ubuntu (ark-desktop-wallet-linux-amd64–2.9.1.deb) 06537ff90663560d82b710bb28d3826755924caf75b8d5ce5ddca271505ea7f1 • Windows X86 & X64 (ark-desktop-wallet-win-2.9.1.exe) b73c6ef213f7ecf250e8ccb52f9e1171d51f090469b1b8aa1f0aeae1d1c94239 • Linux-AppImage (ark-desktop-wallet-linux-x86_64–2.9.1.AppImage) c5d6f083630fcb9f1910714dac567678359c7c6563baa01b146e8244f0623950Я нашел ошибку / проблему - что мне делать?Пожалуйста, создайте тему и опишите все подробности или найдите уже созданную тему на странице ARK Desktop Wallet.Я хочу помочь с развитием - что мне делать?Пожалуйста, откройте пулл-запрос, и не забудьте, что мы также запускаем Github баунти кампанию для разработчиков, так что вы можете заработать дополнительный ARK.Оригинал статьи: https://blog.ark.io/ark-desktop-wallet-v2-9-1-expanded-plugin-usability-548d94e51dc3
|
|
|
|
safar1980
Legendary
Offline
Activity: 1834
Merit: 1650
Payment Gateway Allows Recurring Payments
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
April 04, 2020, 09:18:49 PM Last edit: April 08, 2020, 07:25:32 PM by safar1980 Merited by xandry (11), Symmetrick (2) |
|
Перевод https://blog.ark.io/ark-messenger-tutorial-part-three-e2618fdf2434Ray.Alva Руководство по ARK Messenger — 3 часть![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FRTcC9ys%2F1-Pg-I0nx2-Po9tc-Fo-KQ91-OGLQ.png&t=665&c=lr-5ezRsWjiO7w) Добро пожаловать на заключительную часть нашей серия руководств по ARK Messenger Proof-of-Concept (PoC). В первой части мы создали среду разработки и развернули собственную настраиваемую мостовую цепочку. Во второй части мы создали пользовательскую транзакцию и протестировали ее. Это руководство было написано частично с документацией, предоставленной делегатом Lemii в рамках его работы по ARK Messenger Proof-of-Concept, которая финансировалась ARK Grants Program. Теперь, когда мы достигли завершения этой серии, пришло время, наконец, запустить Proof-of-Concept. После запуска PoC мы расскажем об уникальных способах использования ARK в ARK Messenger PoC. Запуск PoCМостовая цепочка, поддерживающая ARK Messenger, была запущена с использованием ARK Deployer. С точки зрения разработки, ARK Deployer - это один из самых простых способов запуска блокчейна для вашего проекта. Однако для создания ARK Messenger PoC были сделаны некоторые конфигурации, чтобы каждое последующее клонирование репозитория включало в себя вышеупомянутые изменения. Изменения, описанные ниже, показывают, насколько просто построить и изменить блокчейн на ARK. Включая пользовательскую транзакциюФайлы, относящиеся к созданной нами пользовательской транзакции, были помещены в папку / plugins /. Пользовательская транзакция была добавлена в качестве плагина к мостовой цепочке путем вставки “message-transaction”: {} в конце файла plugins.js. https://github.com/ArkEcosystem/poc-ark-messenger-core/blob/master/packages/core/bin/config/testnet/plugins.jsОтключение кеширования APIПо умолчанию API кэширует результаты, которые возвращаются пользователю. Хотя обычно это очень хорошая функция, для приложения чата, где важна отзывчивость, но это не тот результат, что мы хотим. Поэтому кеширование API было отключено в файле plugins.js: https://github.com/ArkEcosystem/poc-ark-messenger-core/blob/master/packages/core/bin/config/testnet/plugins.js“@arkecosystem/core-api”: {cache: { enabled: false },…},
Отключение подсчета оценокПо умолчанию API возвращает оценки общего количества. Для ARK Messenger мы предпочитаем использовать точные цифры и поэтому принудительно устанавливаем этот параметр в переменной среде, которая используется в конфигурации: https://github.com/ArkEcosystem/poc-ark-messenger-core/blob/master/packages/core/bin/config/testnet/.envCORE_API_NO_ESTIMATED_TOTAL_COUNT=true
Установка минимального охвата сети
Поскольку ARK Messenger запускается как PoC, он запускается в Testnet. В этой сети другие ноды не подключены к сети. Чтобы процесс эмуляции не останавливался из-за несоблюдения условия минимального охвата сети, мы настроили его на 0 в файле plugins.js: “@arkecosystem/core-p2p”: {server: {…minimumNetworkReach: 0,},
|
|
|
|
safar1980
Legendary
Offline
Activity: 1834
Merit: 1650
Payment Gateway Allows Recurring Payments
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
April 04, 2020, 09:34:27 PM |
|
После внесения вышеуказанных изменений вы готовы запустить пробную версию! ARK Messenger - это инициатива сообщества, в которой каждый может принять участие. Если вы хотите внести свой вклад, не стесняйтесь отправлять задавать вопросы/ Скачать клиент Messenger и Core репозитории. Развитие с АРКПоскольку команда ARK продолжает совершенствовать наш широкий набор продуктов, мы хотим и впредь делать платформу ARK одним из лучших и самых надежных мест для создания ваших блокчейн решений. На протяжении всей этой серии вы видели несколько способов адаптации ARK к потребностям этого конкретного PoC. Завершая нашу серию статей, выделим некоторые из них сейчас. Custom TransactionsДля создания транзакций, которые станут основой ARK Messenger, необходимо внести изменения в некоторые из существующих типов транзакций в ARK Core. Для этого ARK упростил внесение этих изменений через наш универсальный интерфейс транзакций (GTI). Цель GTI - предоставить разработчикам простой способ внедрения и включения новых типов транзакций в ядро ARK без необходимости изменения больших частей ядра ARK. Если вы хотите узнать больше о разработке пользовательских типов транзакций с помощью GTI, тогда читайте здесь: https://blog.ark.io/an-introduction-to-blockchain-application-development-part-2-2-909b4984baeARK DeployerИспользуя ARK Deployer, автономный блокчейн ARK Messenger был создан быстро и эффективно. Созданный блокчейн также был адаптирован для удовлетворения потребностей этого конкретного PoC. ARK Deployer позволяет любому в состоянии подготовить, настроить и развернуть блокчейн всего за несколько простых шагов. Если вы хотите поближе познакомиться с тем, как это все возможно, пожалуйста, ознакомьтесь с документацией по ARK Deployer здесь: https://deployer.ark.dev/Финансирование ARK GrantsВ случае, если вы не слышали, ARK Messenger PoC полностью финансировался программой ARK Grants. ARK Grants - это программа поощрения разработчиков, предназначенная для роста сообщества разработчиков. Разработчики могут получить финансирование для создания PoC на основе ARK, плагинов и готовых приложений. Программа поддерживается 1 миллионом ARK и в настоящее время принимает заявки! Узнайте о принципах ARK Grants и порядке подачи заявок на http://ark.io/grantsСпасибо, что присоединились к нам! Если у вас есть какие-либо вопросы, обязательно ознакомьтесь с нашими документами в центре обучения ARK. Кроме того, наша команда и разработчики сообщества активны в Slack, поэтому не стесняйтесь обращаться к нам! ARK Messenger Учебное пособиеЕсли вы пропустили другие записи в блоге ARK Messenger Tutorial, вы можете прочитать их, перейдя по ссылкам ниже: Первая частьВторая частьЧасть третья (вы сейчас ее читайте ![Smiley](https://bitcointalk.org/Smileys/default/smiley.gif) )
|
|
|
|
xandry
Moderator
Legendary
Offline
Activity: 3556
Merit: 4314
Crypto Swap Exchange
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
June 12, 2020, 10:59:42 AM Merited by Symmetrick (1) |
|
|
|
|
|
FP91G
Legendary
Offline
Activity: 1750
Merit: 1077
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
June 16, 2020, 11:20:57 AM Last edit: June 16, 2020, 11:46:04 AM by FP91G Merited by xandry (8), Symmetrick (2) |
|
Перевод. Оригинальная статья Launching HTML5 Games In The ARK Desktop Wallet — Part One https://blog.ark.io/launching-html5-games-in-the-ark-desktop-wallet-part-one-b26fd444f0d79c42Запуск HTML5 игр в настольном кошельке ARK - часть первая![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2F163z24p%2F1-d-Yimg-Wzo-Tn-Xc-Nv-VFfdla-Zg.png&t=665&c=p-NOUntB2Im1SQ) Добро пожаловать в первый урок из нашей серии, посвященный запуску игр на HTML5 в ARK Desktop Wallet! Эта серия предназначена для разработчиков всех уровней. Цель этой серии - преобразовать игрs HTML5 в полноценный плагин ARK Desktop Wallet. Первое руководство объяснит, как взаимодействовать с блокчейном в автономной среде HTML5, прежде чем, наконец, перейти в ARK Desktop Wallet. На первый взгляд, этот учебник будет разбит на следующие части: Часть первая: как импортировать адрес кошелька ARK в ваше приложение Часть вторая: создание бэкенда для вашего плагина Часть третья: заставить вашу игру работать с системой ставок Часть четвертая: внедрение игровой логики в ваш плагин Часть пятая: определение того, как выпадают призы Часть шестая: запуск вашей игры в качестве плагина кошелька Прежде чем мы начнем, нужно помнить одну вещь: эти учебные пособия направлены на запуск HTML5-игры в ARK Desktop Wallet. Эти учебные пособия не предназначены для обучения разработчиков, как создавать игры. Однако, как только ваша игра будет готова, мы будем рады поддержать ее в ARK Desktop Wallet. Итак, давайте начнем с импорта адреса кошелька в вашу игру! Импортирование адреса кошелька в вашу игруВ этой первой части этой серии мы рассмотрим, как импортировать адрес кошелька, убедившись, что он действителен, чтобы игроки случайно не ошиблись, введя неправильный адрес и потеряв потенциальный приз. Это заложит основу для следующих частей, где мы напишем нашу игровую логику в нашем собственном плагине Core. Мы будем использовать бесплатный движок Construct 3 - среду разработки игры «укажи и щелкни» - чтобы создать нашу простую игру HTML5, так что зайди туда и начни новый проект. https://editor.construct.net/![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FdL3CVNM%2F1-d-Yimg-Wzo-Tn-Xc-Nv-VFfdla-Zg.png&t=665&c=emWHCZO_EZ8ufA) Это кому-нибудь знакомо? Это Сапер… Первая игра ARK для блокчейнов «игрок против игрока»! К сожалению, на момент написания ARK JavaScript SDK не был полностью совместим с играми HTML5 из коробки, поэтому мы будем использовать альтернативу bs58check для проверки адресов. Шаги для создания нашей альтернативы описаны ниже, но если вы предпочитаете пропустить это, вы можете использовать готовую версию, которую мы обсудим через секунду. Если вы хотите собрать его самостоятельно, убедитесь, что у вас установлены NodeJS и npm, а затем выполните: npm install -g browserify uglify-jsnpm install bs58check browserify — standalone bs58check -r bs58check | uglifyjs > bs58check.min.js
Затем мы импортируем наш файл bs58check.min.js в наш проект Construct 3, чтобы игра могла его использовать. Это действительно просто - просто щелкните правой кнопкой мыши «Сценарии» в правой верхней панели, выберите «Импорт сценариев» и перетащите файл bs58check.min.js в окно. Нажмите Импорт, и все готово! Что делает адрес кошелька ARK действительным?Теперь нам нужно отступить от практической деятельности и сосредоточиться на теоретической стороне. Что делает адрес действительным, и как мы можем отделить адрес публичной сети ARK от адреса в сети разработки ARK или другом бриджчейне? Каждый адрес должен быть ровно из 34 символов, а в случае публичной сети ARK каждый адрес начинается с буквы A; и наоборот, адреса в ARK Development Network начинаются с буквы D, а бриджченйны могут использовать свой собственный символ. Этот первый символ связан с сетевой версией - запомните, мы вернемся к нему через позже. Символы, используемые в адресе, известны как base58, который представляет собой группу из 58 буквенно-цифровых символов, которые легко различить для минимизации риска путаницы, например, 0 (ноль) и O (верхний регистр o) выглядят одинаково, поэтому они исключаются ; кроме того, I (прописные буквы i) и l (строчные буквы L) исключаются из набора символов по той же причине. Наконец, адрес включает контрольную сумму, чтобы убедиться, что остальная часть адреса была введена правильно, без опечаток. Итак, помните, как первый символ адреса ARK Public Network - A, а ARK Development Network - D? Это происходит от того, что называется сетевой версией, и каждый блокчейн может иметь различную сетевую версию, которая определяет первый символ всех адресов кошелька в этой сети. В случае, если вам интересно - и вам это понадобится позже, - сетевая версия для ARK Public Network - 23, а сетевая версия для ARK Development Network - 30. Теперь вы знаете, что адрес действителен, если - и только если - он имеет длину ровно 34 символа, начинается с правильного символа для сетевой версии блокчейна, содержит только символы в группе base58 и имеет действительную контрольную сумму. Теперь добавьте это в нашу игру! Добавление адреса кошелька ARK в вашу игруДавайте начнем с добавления некоторых объектов в наш макет. В нашем примере мы собираемся добавить поле ввода текста для ввода пользователем своего адреса, кнопку для подтверждения введенного адреса и текстовое отображение, чтобы сообщить нам, является ли адрес действительным. Дважды щелкните «Макет 1» в правой верхней панели, затем щелкните правой кнопкой мыши пустой холст и выберите «Вставить новый объект». Дважды щелкните ввод текста и поместите его на макет, где вы хотите, чтобы он появился. Повторите это, чтобы добавить объекты Button и Text тоже. Не стесняйтесь настраивать стиль объектов так, как вам нравится, и если вы чувствуете себя креативным, добавьте несколько спрайтов и фоновое изображение, чтобы оживить ваш макет. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FfQ7nxx1%2F3.png&t=665&c=5qZavRJVc-Xszw) Сейчас мы собираемся погрузиться в Лист событий, и именно здесь происходит вся магия. Конструкция 3 основана на событиях, то есть реагирует на ситуации, возникающие в течение жизненного цикла игры. В нашем случае это событие, когда пользователь нажимает нашу кнопку. Дважды щелкните «Лист событий 1» и выберите «Добавить событие». Дважды щелкните нашу кнопку и выберите событие «По нажатию». Он будет выделен желтым цветом, поскольку это обычное событие. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FM7HXg32%2F4.png&t=665&c=DH_LEgKwr-zgaQ)
|
█████████████████████████ ████████▀▀████▀▀█▀▀██████ █████▀████▄▄▄▄██████▀████ ███▀███▄████████▄████▀███ ██▀███████████████████▀██ █████████████████████████ █████████████████████████ █████████████████████████ ██▄███████████████▀▀▄▄███ ███▄███▀████████▀███▄████ █████▄████▀▀▀▀████▄██████ ████████▄▄████▄▄█████████ █████████████████████████ | BitList | | █▀▀▀▀ █ █ █ █ █ █ █ █ █ █ █ █▄▄▄▄ | ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ . REAL-TIME DATA TRACKING CURATED BY THE COMMUNITY . ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | ▀▀▀▀█ █ █ █ █ █ █ █ █ █ █ █ ▄▄▄▄█ | | List #kycfree Websites |
|
|
|
FP91G
Legendary
Offline
Activity: 1750
Merit: 1077
|
продолжение Теперь нам нужно сказать, что делать, когда кто-то нажимает кнопку. Но что именно мы хотим от этого? Адреса должны быть длиной 34 символа, начинаться с правильного символа для нашей сети, состоять только из символов base58 и проходить проверку контрольной суммы. К счастью, скрипт bs58check, который мы импортировали ранее, обрабатывает большую часть этого за нас. Мы будем использовать публичную сеть ARK, поэтому мы знаем, что наша сетевая версия - 23. Начнем с создания переменной для хранения сетевой версии. Щелкните правой кнопкой мыши наш лист событий и выберите Добавить глобальную переменную. Назовите его networkVersion с начальным значением 23. Мы создадим функцию для проверки адреса. Щелкните правой кнопкой мыши в любом месте листа событий и выберите «Добавить функцию». Назовите его validateAddress и установите тип возвращаемого значения Number. Нажмите OK, затем щелкните правой кнопкой мыши нашу новую функцию и добавьте параметр. Назовите это адресом, который является Строкой. Теперь щелкните правой кнопкой мыши на Добавить действие для нашей функции и выберите Добавить сценарий. Теперь мы можем наконец написать немного JavaScript! if (localVars.address.length === 34) {try {const networkVersion = bs58check.decode(localVars.address).readUInt8(0);if (networkVersion === runtime.globalVars.networkVersion) {runtime.setReturnValue(1);}} catch (error) {// the address is invalid}}
Давайте разберемся с этим. По умолчанию функция вернет ноль. Если адрес составляет 34 символа, он выполнит bs58check.decode, который выдаст ошибку и выйдет из функции, если адрес содержит недопустимые символы или контрольная сумма не пройдена. В противном случае мы проверяем, соответствует ли сетевая версия публичной сети ARK. Если это так, мы возвращаем значение 1. Проще говоря, если адрес проходит наши проверки, функция возвращает 1, в противном случае возвращает 0. Теперь мы включим нашу функцию! Мы хотим, чтобы он запускался при каждом нажатии нашей кнопки. Нажмите «Добавить» рядом с нашим событием «По нажатию» и «Добавить подсобытие». Прокрутите вниз до System и сравните два значения. По сути, мы хотим проверить, возвращает ли наша функция 1 или нет. Итак, наше первое значение должно быть Functions.validateAddress (TextInput.Text), а наше второе значение должно быть 1. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FMnsnT5h%2F5.png&t=665&c=XFSG2EigEhqPBw) Почти готово! Мы просто должны сказать ему, что делать, если функция проходит и не работает. Нажмите кнопку Добавить действие для нашего сравнения, дважды щелкните наш текстовый объект и выберите Установить текст. Введите «Адрес действителен!» и выберите ОК. Теперь для случая сбоя: нажмите кнопку Добавить ... рядом с нашим новым действием Установить текст и выберите Добавить еще. Нажмите «Добавить действие для нашего другого случая», дважды щелкните наш текстовый объект и выберите «Задать текст». Введите «Адрес недействителен» и нажмите ОК. ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2Fn1VwLg0%2F6.png&t=665&c=HTr6JMBtcD1RoA) Теперь мы можем проверить наше творение, щелкнув треугольник в строке меню. Попробуйте ввести действительный адрес ARK Public Network и нажмите кнопку, затем попробуйте неверный. Вернитесь в исходный код и измените переменную networkVersion с 23 на 30 и повторите попытку с адресом Devnet. Теперь все в порядке, и теперь вы сможете определить, является ли адрес действительным в публичной сети ARK или в сети разработчиков ARK! Следующие шаги Вот и все для первой части этого урока. В нашем следующем сеансе мы рассмотрим Construct немного больше и узнаем, как подключиться к одноранговому узлу, чтобы получить его сетевую версию, и использовать его вместо жесткого кодирования значения, чтобы наша игра могла быть совместима со всеми бриджчейнами, и мы изучим Core plugin для основной логики игры. Если вы отстали в какой-то момент, обязательно ознакомьтесь с нашими документами в центре обучения ARK. Кроме того, наша команда и разработчики активны в Slack, поэтому не стесняйтесь обращаться к нам! https://learn.ark.dev/core-getting-started/setting-up-your-development-environmenthttps://ark.io/slack
|
█████████████████████████ ████████▀▀████▀▀█▀▀██████ █████▀████▄▄▄▄██████▀████ ███▀███▄████████▄████▀███ ██▀███████████████████▀██ █████████████████████████ █████████████████████████ █████████████████████████ ██▄███████████████▀▀▄▄███ ███▄███▀████████▀███▄████ █████▄████▀▀▀▀████▄██████ ████████▄▄████▄▄█████████ █████████████████████████ | BitList | | █▀▀▀▀ █ █ █ █ █ █ █ █ █ █ █ █▄▄▄▄ | ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ . REAL-TIME DATA TRACKING CURATED BY THE COMMUNITY . ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | ▀▀▀▀█ █ █ █ █ █ █ █ █ █ █ █ ▄▄▄▄█ | | List #kycfree Websites |
|
|
|
safar1980
Legendary
Offline
Activity: 1834
Merit: 1650
Payment Gateway Allows Recurring Payments
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
June 17, 2020, 12:24:29 PM Last edit: June 17, 2020, 01:46:42 PM by safar1980 Merited by xandry (5), Symmetrick (2), zork (1) |
|
Перевод https://blog.ark.io/launching-html5-games-in-the-ark-desktop-wallet-part-two-d07b6620bd46Ray.Alva Запуск HTML5 игр в ARK Desktop Wallet - часть вторая![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2Fr69G32s%2F1-i-ZQu-F8jm0q-Dee9-C8f-Jbpsg.png&t=665&c=HipNla-9O-55GA) Добро пожаловать во второй урок из нашей серии, посвященной запуску HTML5 игр в ARK Desktop Wallet! Эта серия предназначена для разработчиков всех уровней квалификации. Цель этой серии - преобразовать игру HTML5 в полноценный плагин ARK Desktop Wallet. Первый набор руководств объяснит, как взаимодействовать с блокчейном ARK в автономной среде HTML5, прежде чем, наконец, перепрыгнуть в ARK Desktop Wallet. Мы остановились в прошлый раз в прошлый раз на автономном приложении Construct 3 ( https://editor.construct.net/ ), которое позволяет нам удостовериться, что указанный адрес действителен в публичной сети ARK. Теперь пришло время развить это, чтобы работать с любой сетью на базе ARK по нашему выбору и начать создавать серверную часть нашей игры. В оставшейся части этого учебного цикла мы сосредоточимся на создании серверной части нашей игры и использовании Connect 4, пошаговой блокчейн-игры в качестве нашего текущего примера и шаблона. Мы позволим игроку начать игру, установив ставку, и как только ставка будет получена, игра начнется. Мы будем использовать стандартную доску 7 x 6, и каждый игрок по очереди выберет колонку и вставит свой диск от 1 до 7. Если игрок выстроит в линию 4 диска по вертикали, горизонтали или диагонали, он получит приз ; если игра заканчивается ничьей, оба игрока получают обратно свой вступительный взнос. Для простоты мы будем использовать поле Smartbridge от ARK, чтобы выбрать выбранную колонку на доске от 1 до 7. Если вы хотите использовать более продвинутый подход, вы можете рассмотреть возможность совершения пользовательских транзакций с GTI на собственной мостовой цепочке, чтобы сделать эту игру по-настоящему децентрализовано. Хотя все это может показаться пугающим на первый взгляд, мы сделаем это максимально простым. Все эти задачи будут разбиты на управляемые разделы в следующих нескольких уроках. В следующем разделе мы рассмотрим, как отправлять и получать транзакции в игре. ПРЕДУПРЕЖДЕНИЕ: Прежде чем мы пойдем дальше, проверьте ARK Learning Hub , чтобы понять, как создать ваш первый модуль Core. Следуйте инструкциям и используйте шаблон стартового модуля. Это будет основой для остальной части урока. Теперь, когда вы настроили свой начальный модуль, давайте перечислим наши цели относительно того, что мы хотим, чтобы наш плагин Core сделал к концу этого урока. Начнем: 1.Настройте сервер WebSocket, чтобы наше приложение Construct 3 и плагин Core могли общаться друг с другом; 2.Отправляйте версию сети (о которой мы говорили в последнем уроке) всякий раз, когда приложение подключается к серверу, чтобы оно знало формат адреса для проверки; 3. Создайте новый адрес ARK для приема транзакций; 4. Проверьте входящие транзакции, отправленные на этот адрес. Давайте уделим некоторое время каждому из разделов выше. Весь наш код будет записан в defaults.ts и manager.ts, поэтому откройте их в своем любимом текстовом редакторе и начнем! Настройка сервера WebSocket Во-первых, мы хотим настроить сервер WebSocket. Мы будем использовать WebSockets, потому что он обеспечивает простую двунаправленную связь между нашим плагином и приложением Construct 3. WebSockets связываются с хостом и портом, и для начала мы определим их в defaults.ts. Замените содержимое этого файла следующим: export const defaults = { enabled: true, host: "0.0.0.0", port: 10000 };
Мы используем хост 0.0.0.0, что означает, что мы будем принимать подключения к любому из IP-адресов на нашем сервере, и мы будем соединяться через порт 10000. Сохраните этот файл и закройте его, так как все наши оставшиеся изменения будут внесены в менеджер .ts. Для этого мы сначала импортируем зависимость ws, добавив следующую строку в начало нашего файла: import * as WebSocket from “ws”;
Теперь мы хотим запустить наш сервер WebSocket при запуске нашего плагина. Возможно, вы уже заметили метод start в manager.ts, где мы и запустим наш сервер: public start(options: any) { this.logger.info("Initialization of dApp"); }
Давайте изменим это, чтобы запустить наш сервер WebSocket и напечатать более подробное сообщение: public start(options: any) { try { const server = new WebSocket.Server({ host: options.host, port: options.port }); this.logger.info(`Connect 4 WebSocket server listening on ws://${options.host}:${options.port}`); } catch (error) { this.logger.error(`Connect 4 WebSocket server could not start: ${error.message}`); } }
Что это делает? Он запускает сервер WebSocket, используя значения хоста и порта, которые мы ранее определили в defaults.ts, и печатает сообщение в наших журналах, чтобы подтвердить, что сервер успешно запущен, или, в случае сбоя, он объяснит, что пошло не так. Отправка версии сетиМы хотим отправить версию сети любому клиенту, который обращается к нашему WebSocket, как только он подключится. Для этого мы прослушиваем событие соединения с сервера WebSocket, которое срабатывает при установлении нового соединения, а затем отправляем версию сети новому соединению. Добавьте следующий код после строки this.logger.info: const config = app.getConfig(); const networkData = JSON.stringify({ networkVersion: config.get("network.pubKeyHash") });
server.on("connection", websocket => { websocket.send(networkData); });
На этом этапе вы можете запустить настройку плагина, перезапустить ядро Core и проверить журналы. Вы должны увидеть что-то вроде этого: 1|ark-relay | [2020–02–17 19:00:00.000] INFO : Connect 4 WebSocket server listening on ws://0.0.0.0:10000
Мы можем проверить, работает ли WebSocket, перейдя по адресу http://www.websocket.org/echo.html и введя ws: // XXXX: 10000 (где XXXX - IP-адрес вашего сервера, на котором работает наш плагин Core) и нажимая Connect. Если вы выполнили действия, описанные выше, вы должны увидеть, что версия сети появится в окне журнала: Генерация нового ARK-адреса для приема транзакцийНам нужен наш плагин для генерации нового адреса для получения ставок и обработки сообщений Smartbridge для обновления нашего игрового состояния. Для этого наше приложение Construct 3 отправит на сервер сообщение {action: «new»}, которое запустит это действие. Наш плагин Core должен прослушать это сообщение и действовать в соответствии с ним, поэтому мы добавим следующий код сразу после строки websocket.send (networkData) выше: websocket.on("message", message => { try { const data = JSON.parse(message.toString()); if (data.action === "new") { const { address, passphrase } = this.generateAddress(); this.addresses[address] = passphrase; // @ts-ignore websocket.address = address; websocket.send(JSON.stringify({ address })); } } catch (error) { this.logger.error(error.stack); } });
Вы увидите, что мы используем новый метод generateAddress, поэтому мы должны написать код и для этого. Вставьте это ниже конца нашего метода start и перед методом stop: private generateAddress() { const passphrase = generateMnemonic(); const address = Identities.Address.fromPassphrase(passphrase); return { address, passphrase }; }
Нам также нужно добавить несколько импортов в начало нашего кода, чтобы получить доступ к этим новым методам: import { generateMnemonic } from “bip39”; import { Identities } from “@arkecosystem/crypto”; // Lastly we add a new addresses private variable immediately above // the private readonly logger line: private addresses = {};
Это довольно большой код, поэтому давайте разберем его. Мы прослушиваем любые входящие сообщения через WebSocket, которые содержат {action: «new»}, сигнализирующий, что наше приложение Construct 3 хочет создать новый адрес для новой игры. Это вызывает наш новый метод generateAddress для внутреннего создания новой парольной фразы кошелька и преобразования ее в адрес. Теперь он хранится в объекте адресов, который отслеживает все адреса, созданные во время этого сеанса, которые будут использоваться для прослушивания входящих транзакций.
|
|
|
|
safar1980
Legendary
Offline
Activity: 1834
Merit: 1650
Payment Gateway Allows Recurring Payments
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
June 17, 2020, 12:24:49 PM Last edit: June 17, 2020, 01:45:12 PM by safar1980 Merited by xandry (5), Symmetrick (2) |
|
Прослушивайте входящие транзакцииПоследняя часть нашего основного плагина для этой части руководства будет прослушивать входящие транзакции. Если получающий адрес совпадает с одним из сгенерированных ранее адресов, мы отправим его данные обратно в наше приложение Construct 3 через WebSocket. Этот кусок кода будет идти сразу над второй строкой catch в нашем методе start: const emitter = app.resolvePlugin("event-emitter"); emitter.on(ApplicationEvents.TransactionApplied, transaction => { if (this.addresses[transaction.recipientId]) { for (const websocket of server.clients) { // @ts-ignore if (websocket.readyState === WebSocket.OPEN && websocket.address === transaction.recipientId) { websocket.send(JSON.stringify({ transaction })); } } } });
Чтобы закончить, нам нужен только один финальный импорт в верхней части кода для ApplicationEvents, которые мы использовали: import { ApplicationEvents } from “@arkecosystem/core-event-emitter”;
К этому моменту мы закончили с нашим плагином Core для этой части урока! Скомпилируйте его с настройкой плагина, перезапустите Core и перейдите к Construct 3, где мы будем взаимодействовать с нашим WebSocket. Откройте проект, который мы создали в последнем уроке, переключитесь на Layout 1, щелкните правой кнопкой мыши и вставьте новый объект. Добавьте WebSocket. Повторите процесс, добавив объект Browser, объект JSON и другую кнопку, которая будет использоваться для запуска процесса генерации адреса. Перейдите на лист событий 1 и добавьте новое событие. Разверните до System и затем On the layout. Мы хотим добавить действие для WebSocket для подключения. Введите URL в формате wss: //X.X.X.X: 10000 / где X.X.X.X - ваш базовый IP-адрес. Обратите внимание, что для этого требуется соединение HTTPS, поэтому вам может потребоваться использовать бесплатную службу, такую как CloudFlare, или использовать собственный сертификат SSL с обратным прокси-сервером, таким как Nginx. Добавьте другое событие, на этот раз прослушивая событие Websocket -> On Text Message. Для соответствующего действия выберите JSON -> Parse. Введите WebSocket.MessageText для строки JSON. Теперь мы хотим добавить несколько вложенных событий в событие Websocket -> On Text Message для обработки полученных нами данных WebSocket. Выберите JSON, а затем KEY. Введите «транзакция», затем добавьте новое действие. Это будет запущено, когда мы получим новую транзакцию. Сейчас, чтобы доказать, что это работает, мы просто собираемся отобразить данные транзакции в окне предупреждения в браузере. Выберите Browser, затем Alert. Введите JSON.GetAsBeautifiedString («transaction»). Добавьте другое вспомогательное событие и выберите JSON, а затем Has Key. Введите «networkVersion» на этот раз. Это будет использоваться для установки версии сети, чтобы наше приложение правильно проверяло адреса в зависимости от сети того партнера, к которому мы подключены. Наше соответствующее действие должно быть System -> Set Value. Убедитесь, что переменная имеет значение networkVersion, и установите значение JSON.Get («networkVersion»). Теперь мы должны проверить вновь сгенерированный адрес, показать его пользователю и разрешить пользователю отправлять транзакции через Desktop Wallet. Чтобы продолжить, мы должны добавить еще одно дополнительное событие. Это снова JSON -> Имеет ключ. Введите «адрес» и добавьте новое действие браузера. Выберите Alert и введите. Нажмите «ОК», чтобы отправить транзакцию в JSON.Get («адрес»). Добавьте еще одно действие для этого события, на этот раз для Браузер -> Перейти к URL. В качестве URL-адреса мы вводим «ark:» и JSON.Get («адрес»), который автоматически откроет рабочий стол и предварительно заполнит транзакцию, которая будет отправлена на вновь созданный адрес. Наконец, мы собираемся подключить нашу новую кнопку для запуска этого действия генерации адреса. Добавьте событие, выбрав Button2 (так как это наша вторая кнопка), а затем нажал кнопку «Вкл». Мы собираемся добавить действие для отправки сообщения через WebSocket, чтобы запустить процесс создания адреса, поэтому выберите WebSocket, а затем «Отправить текст». Текст, который мы отправим, будет “{“”action””: “”new””}” ». Теперь мы закончили! Наш лист событий должен выглядеть примерно так: ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FrpYRqzs%2F0-0-Lxt6j-Hu-I5-Hmgv-Qn.png&t=665&c=LGRMXNlUfyhM4Q) Если вы используете плагин Core в сети разработки ARK, вы должны обнаружить, что он теперь принимает только адреса Devnet. Нажав вновь добавленную кнопку, вы получите сообщение с новым сгенерированным адресом, после чего откроется ARK Desktop Wallet для автоматической отправки транзакции на этот адрес: ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2Fqj0q7BW%2F0-um-Tr-ZYS9nldv0y-O.png&t=665&c=xlvIvQaJnSizVA) ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FXJgMyTj%2F0-sn-O3-Md-Kg-OSx-Ms-IN.png&t=665&c=XwKB2wnapOgOLA) Теперь, если мы отправим транзакцию на этот адрес, наше приложение Construct 3 автоматически получит ее и покажет нам данные: ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FqnMg56G%2F0-Zbk6e7-Osdmg-E8fm-H.png&t=665&c=hGdXyHDVQEzBOA) Поздравляем с окончанием урока! Это может показаться малым, но мы многого достигли! Мы настроили наш базовый плагин Core, сделали сервер WebSocket, и теперь мы знаем, как генерировать новые адреса, отправлять и получать транзакции между нашим приложением и сетью и динамически проверять адреса на основе сети однорангового узла. Следующие шагиВот и все для второй части этого урока. На нашей следующей сессии мы заставим игру работать с системой ставок и создадим лобби для запуска игр и просмотра уже существующих! Если вы застряли в какой-то момент, обязательно ознакомьтесь с нашими документами в центре обучения ARK центре обучения ARK. Кроме того, наша команда и разработчики активны в Slack, поэтому не стесняйтесь обращаться к нам!
|
|
|
|
FP91G
Legendary
Offline
Activity: 1750
Merit: 1077
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
June 26, 2020, 10:20:17 AM Last edit: June 26, 2020, 10:35:25 AM by FP91G Merited by xandry (8), Symmetrick (2) |
|
Перевод. Оригинальная статья Launching HTML5 Games In The ARK Desktop Wallet — Part Three https://blog.ark.io/launching-html5-games-in-the-ark-desktop-wallet-part-three-74fc5398b96f Запуск HTML5 игр в ARK Desktop Wallet - часть третьяДобро пожаловать в третий урок из нашей серии о запуске игры HTML5 в ARK Desktop Wallet! Эта серия предназначена для разработчиков всех уровней квалификации. Цель этой серии - преобразовать игру HTML5 в полноценный плагин для ARK Desktop Wallet. В предыдущих частях ( Первая часть и Вторая часть) мы настраивали базовый игровой клиент, используя Construct 3, который взаимодействует с нашим собственным плагином ARK Core для проверки адресов и отправки и получения транзакций в блокчейне. Теперь пришло время заставить игру работать со ставками и создать лобби для запуска игр и просмотра уже существующих! Но давайте не будем забегать вперед, реальная игровая логика появится в следующей части этой серии, поскольку мы все еще закладываем основы для взаимодействия с сетью и блокчейном. Хорошая новость заключается в том, что код, который мы написали в этих предыдущих частях, может быть повторно использован в будущих проектах, так что у вас будет прочная база для взаимодействия между вашими будущими игровыми клиентами и ARK Core, без необходимости переделывать всю работу снова. Как и в прошлый раз, мы собираемся сосредоточиться на нашем плагине ARK Core, а затем расширить наш проект Construct 3 для взаимодействия с ним. К концу этого урока мы сможем: Отслеживать все сгенерированные игровые адреса и сохраняйте их на диск, чтобы наши ставки и игры не терялись при перезапуске Core. Записать ставку и убедиться, что партнер платит правильную сумму. Передать список игр клиенту. Фильтрация игр по их состоянию, т. е. Ожидают ли они партнера, завершены, или один из участников является нашим собственным подтвержденным адресом, чтобы отличать наши собственные игры. Итак, давайте не будем тратить больше времени - откройте файл manager.ts в вашем любимом текстовом редакторе, и мы приступим к работе! Отслеживание всех сгенерированных игровых адресов для сохраненияВ нашем последнем уроке нам уже удалось сгенерировать новый ARK-адрес для приема транзакций. Возможно, вы заметили, что сгенерированные адреса хранятся только в памяти и будут потеряны при перезапуске Core, без возможности восстановить сгенерированную фразу-пароль для последующей передачи ставок, отправленных на адрес. Чтобы исправить это, мы собираемся сделать так, чтобы эти данные сохранялись, сохраняя наш список игровых адресов и парольных фраз как отдельный объект на диске. Есть разные возможности. Например, вы можете захотеть использовать базу данных, будь то PostgreSQL, MySQL, SQLite3 или другие, но мы собираемся упростить задачу и использовать уже созданную библиотеку под названием FluiDB. Мы можем просто создать новый объект FluiDB для хранения наших игровых адресов, и он будет автоматически и прозрачно загружать и сохранять данные на диск для постоянного хранения, не беспокоясь о написании беспорядочных SQL-запросов или изобретении нашей собственной структуры данных. Давайте импортируем FluiDB в наш проект, выполнив следующую команду на нашем сервере для установки библиотеки: Теперь мы импортируем связь в наш плагин, добавив следующие строки в начало нашего файла manager.ts: import delay from "delay"; import FluiDB from "fluidb";// Replace our previous implementation with FluiDB. Find: private addresses = {};// Replace it with: private addresses = new FluiDB(`${process.env.CORE_PATH_DATA}/generated-addresses`); private gameStates = {};
Мы это сделали! Теперь это автоматически сохранит все наши сгенерированные адреса и парольные фразы в файле с именем generate-address.json в нашей папке данных Core, и будет прозрачно загружать их обратно в наш объект адресов при каждом перезапуске Core. Это также импортировало другой пакет, delay, и объявило другую переменную, gameStates, в ожидании нашего следующего раздела. Записать ставку и убедиться, что наш партнер ей соответствуетДалее, нам нужно проверить все наши сгенерированные кошельки с игровыми адресами для любых входящих транзакций, чтобы записать любые ставки каждого участника. Для этого есть два подхода. Во-первых, всякий раз, когда загружается наш плагин, мы будем перебирать существующие сгенерированные игровые адреса, чтобы изначально создать состояние наших существующих игр. Во-вторых, мы добавим прослушивание событий для новых входящих транзакций, чтобы мы могли обновлять состояние существующих игр и добавлять новые по мере их появления. Для простоты мы собираемся создать функцию, которая будет перебирать все транзакции для данного кошелька, чтобы генерировать его состояние. Под состоянием мы подразумеваем адреса участников и суммы ставок, а также пошаговые данные, такие как состояние доски, хотя мы не будем переходить к пошаговым вкусностям до следующей части этой серии. Затем при запуске мы будем вызывать эту функцию для каждого из адресов, которые мы загрузили из нашего объекта FluiDB, и каждый раз, когда один из наших адресов получает новую транзакцию, мы будем восстанавливать состояние для этого адреса, чтобы убедиться, что он находится в синхронизации с тем, что хранит блокчейн. Найдите нашу строку здесь, где мы объявляем нашу функцию запуска: public start(options: any) {// Make it asynchronous by adding the async keyword, so it looks like this: public async start(options: any) {
Находим const networkData = JSON.stringify({ networkVersion: config.get(“network.pubKeyHash”) });
Меняем код const networkData = JSON.stringify({ networkVersion: config.get("network.pubKeyHash"), symbol: config.get("network.client.symbol") });//On the next line, add the following block of code: for (const address of Object.keys(this.addresses)) { this.generateState(address); }
|
█████████████████████████ ████████▀▀████▀▀█▀▀██████ █████▀████▄▄▄▄██████▀████ ███▀███▄████████▄████▀███ ██▀███████████████████▀██ █████████████████████████ █████████████████████████ █████████████████████████ ██▄███████████████▀▀▄▄███ ███▄███▀████████▀███▄████ █████▄████▀▀▀▀████▄██████ ████████▄▄████▄▄█████████ █████████████████████████ | BitList | | █▀▀▀▀ █ █ █ █ █ █ █ █ █ █ █ █▄▄▄▄ | ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ . REAL-TIME DATA TRACKING CURATED BY THE COMMUNITY . ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | ▀▀▀▀█ █ █ █ █ █ █ █ █ █ █ █ ▄▄▄▄█ | | List #kycfree Websites |
|
|
|
FP91G
Legendary
Offline
Activity: 1750
Merit: 1077
|
Это будет проходить через все наши сгенерированные адреса и вызывать нашу еще не написанную функцию generateState для генерации их игрового состояния при первой загрузке нашего плагина. Затем найдите, где мы слушаем входящие транзакции, которые мы написали в нашем последнем уроке: emitter.on(ApplicationEvents.TransactionApplied, transaction => { if (this.addresses[transaction.recipientId]) { for (const websocket of server.clients) { // @ts-ignore if (websocket.readyState === WebSocket.OPEN && websocket.address === transaction.recipientId) { websocket.send(JSON.stringify({ transaction })); } } } });
Во-первых, в верхней строке измените транзакцию на асинхронную, чтобы наша функция была асинхронной. Затем посмотрите строку for (const websocket of server.clients) Непосредственно перед этой строкой добавьте это, чтобы восстановить состояние любого игрового адреса, который получает новую транзакцию, как только она записывается в базу данных блокчейна: while (!(await app.resolvePlugin(“database”).transactionsBusinessRepository.findById(transaction.id))) { await delay(100); }await this.generateState(transaction.recipientId);
Теперь пришло время написать эту неуловимую функцию generateState. Найдите наш блок кода, в котором мы написали функцию generateAddress, и непосредственно под этим блоком мы напишем наш новый код generateState: private async generateState(address: string) { const database = app.resolvePlugin("database"); const publicKey = Identities.PublicKey.fromPassphrase(this.addresses[address]); const transactions: any[] = await Promise.all( (await database.transactionsBusinessRepository.search({ limit: 0, walletAddress: address, publicKey })).rows.map(async transaction => ({ amount: transaction.amount, recipientId: transaction.recipientId, senderId: Identities.Address.fromPublicKey(transaction.senderPublicKey, app.getConfig().get("network.pubKeyHash")), timestamp: (await database.blocksBusinessRepository.findById(transaction.blockId)).timestamp, vendorField: transaction.vendorField ? transaction.vendorField.toString().trim().toUpperCase() : null }) )); transactions.sort((a: any, b: any) => (a.timestamp > b.timestamp) ? 1 : ((b.timestamp > a.timestamp) ? -1 : 0)); const players = { 1: null, 2: null }; let wager = 0; for (const transaction of transactions) { if (transaction.senderId !== address && transaction.amount >= 10000000) { players[1] = transaction.senderId; wager = transaction.amount; break; } } if (!players[1]) { return; } for (const transaction of transactions) { if (transaction.senderId !== address && transaction.senderId !== players[1] && transaction.amount === wager) { players[2] = transaction.senderId; break; } } this.gameStates[address] = { players, wager }; }
Это была большая работа за короткий промежуток времени, поэтому давайте разберемся с тем, что мы только что сделали. Мы передаем сгенерированный игровой адрес в эту функцию и преобразуем соответствующую парольную фразу в открытый ключ, который нам необходим для поиска всех входящих и исходящих транзакций с адреса кошелька. Мы извлекаем сумму, кошелек получателя, кошелек отправителя, отметку времени и сообщение smartbridge для каждой транзакции и сортируем их в хронологическом порядке. Затем мы перебираем транзакции от самых старых до самых новых, чтобы найти первую входящую транзакцию стоимостью не менее 1 ARK; сумма становится ставкой, а адрес игрока распределяется как игрок 1. Если соответствующий адрес не найден, игра недействительна, поэтому мы отменяем. В противном случае, мы повторяем транзакции, чтобы найти другого игрока, который соответствует ставке. Этот адрес становится игроком 2. Затем мы добавляем адреса и ставки игроков в наш объект gameStates. Передача списка игр клиентуЕсли вы сделали это, отлично! Мы завершили логику создания лобби и управления ставками. Следующим шагом является отправка наших данных через WebSocket нашему клиенту. Мы сделаем это, как только клиент подключится и когда состояние какой-либо игры изменится, поэтому наш клиент покажет самую последнюю информацию. Это займет всего несколько строк кода. Найдите: websocket.send(networkData);
Сразу после этого добавьте: websocket.send(JSON.stringify({ games: JSON.stringify(this.gameStates) })); // This will send all our game states to the client as soon as it connects.// Lastly, find: for (const websocket of server.clients) { // @ts-ignore if (websocket.readyState === WebSocket.OPEN && websocket.address === transaction.recipientId) { websocket.send(JSON.stringify({ transaction })); } }
И заменить его на: const state = JSON.stringify({ games: JSON.stringify(this.gameStates) });for (const websocket of server.clients) { if (websocket.readyState === WebSocket.OPEN) { websocket.send(state); // @ts-ignore if (websocket.address === transaction.recipientId) { websocket.send(JSON.stringify({ transaction })); } } }
Это повторно отправит наши игровые состояния всем подключенным клиентам, если какое-либо из состояний изменится, чтобы клиент синхронизировался. Мы закончили нашу работу с Core для этой части урока! Выполните сборку, чтобы собрать последнюю версию нашего плагина, а затем перезапустите Core. Фильтрация игр по их состоянию
Наш последний шаг - связать все это вместе в Construct 3 и иметь возможность фильтровать игры, чтобы отделить новые игры от существующих, и показать, в каких играх мы участвуем сами. Мы сделаем все это в Construct 3, так что запустите редактор игры, и мы можем начать. Перейдите в Layout Editor для Layout 1 и добавьте 3 новых объекта iframe. Назовите их NewIframe, ExistingIframe и OurIframe. В первом кадре будут перечислены новые игры, ожидающие соперника, во втором - все игры с соответствующими ставками, а в третьем - игры, в которых участвует наш адрес. Для каждого добавленного объекта iframe установите идентификатор, соответствующий назовите и удалите значения URL по умолчанию. Перейдите к нашему Листу событий 1 и щелкните правой кнопкой мыши пустую область нашего листа событий и выберите Добавить глобальную переменную. Назовите это «JSON», который должен быть String. Повторите это, но назовите нашу следующую глобальную переменную «ValidatedAddress». Сделайте это еще раз, но назовите нашу новую переменную «Symbol». ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FBNXZdqH%2F0-ab-A-Qm-Xc-AQITk-C.png&t=665&c=UQAESRwV3TbwYg) Глобальные переменные должны выглядеть так в верхней части таблицы событий
|
█████████████████████████ ████████▀▀████▀▀█▀▀██████ █████▀████▄▄▄▄██████▀████ ███▀███▄████████▄████▀███ ██▀███████████████████▀██ █████████████████████████ █████████████████████████ █████████████████████████ ██▄███████████████▀▀▄▄███ ███▄███▀████████▀███▄████ █████▄████▀▀▀▀████▄██████ ████████▄▄████▄▄█████████ █████████████████████████ | BitList | | █▀▀▀▀ █ █ █ █ █ █ █ █ █ █ █ █▄▄▄▄ | ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ . REAL-TIME DATA TRACKING CURATED BY THE COMMUNITY . ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | ▀▀▀▀█ █ █ █ █ █ █ █ █ █ █ █ ▄▄▄▄█ | | List #kycfree Websites |
|
|
|
FP91G
Legendary
Offline
Activity: 1750
Merit: 1077
|
![](https://bitcointalk.org/Themes/custom1/images/post/xx.gif) |
June 26, 2020, 10:56:18 AM Last edit: June 26, 2020, 04:29:47 PM by FP91G Merited by zork (1), Symmetrick (1) |
|
Теперь добавьте еще одно дополнительное событие в событие Websocket -> On Text Message, чтобы проанализировать данные лобби. Выберите JSON, а затем Has Key. Введите «games», затем нажмите Готово. Нажмите «Добавить действие» для нашего вновь созданного дополнительного события и перейдите к «Система»> «Установить значение». Мы хотим установить для нашего объекта JSON значение JSON.get («games»). Нажмите Готово. Мы добавим еще одно дополнительное событие для Websocket -> В текстовом сообщении, чтобы сохранить сетевой символ токена. Снова выберите JSON> Has Key. Введите «symbol», выберите «Готово», нажмите «Добавить действие» и выберите «Система»> «Установить значение». Установите для Symbol значение JSON.get («Symbol»). Далее мы собираемся создать функцию для анализа данных нашего лобби. Щелкните правой кнопкой мыши пустую область и выберите «Добавить функцию». Назовите это ParseLobby. Вернитесь к нашему дополнительному событию для «games» и выберите «Добавить действие», затем «Функции»> «ParseLobby». Затем найдите наше предыдущее событие, где мы установили наш текст «Адрес действителен!» и добавьте еще одно действие к нему. Выберите «Система»> «Установить значение» и установите для переменной ValidatedAddress значение TextInput.Text. Теперь выберите «Добавить действие», затем «Функции»> «ParseLobby». ![](https://ip.bitcointalk.org/?u=https%3A%2F%2Fi.ibb.co%2FwyqNspW%2F0-TXvptld-K-KOg5-A3-F.png&t=665&c=Fg-oo1D7v_Ecig) Наши модифицированные события Найдите нашу функцию ParseLobby и выберите Добавить действие. Выберите Добавить сценарий. Теперь мы собираемся ввести наш код, чтобы проанализировать список лобби и заполнить наши фреймы: const games = JSON.parse(runtime.globalVars.JSON); const newGames = []; const existingGames = []; const ourGames = [];for (const address of Object.keys(games)) { const game = games[address]; if (game.players[2]) { existingGames.push({ address, game }); if (game.players[1] === runtime.globalVars.ValidatedAddress || game.players[2] === runtime.globalVars.ValidatedAddress) ourGames.push({ address, game }); } } else { newGames.push({ address, game }); } }let html = "";for (const game of newGames) { const wager = (game.game.wager / 100000000); html += "<div>New game by " + game.game.players[1] + " for " + wager + runtime.globalVars.Symbol + " (<a href='ark:" + game.address + "&amount=" + wager + "'>Join</a>)</div>"; }document.getElementById("NewIframe").contentWindow.document.body.innerHTML = html; html = "";for (const game of existingGames) { const wager = game.game.wager / 100000000; html += "<div>Game between " + game.game.players[1] + " and " + game.game.players[2] + " for " + wager + runtime.globalVars.Symbol + "</div>"; }document.getElementById("ExistingIframe").contentWindow.document.body.innerHTML = html; html = "";for (const game of ourGames) { const wager = game.game.wager / 100000000; html += "<div>Game between " + (game.game.players[1] === runtime.globalVars.ValidatedAddress ? "you" : game.game.players[1]) + " and " + (game.game.players[2] === runtime.globalVars.ValidatedAddress ? "you" : game.game.players[2]) + " for " + wager + runtime.globalVars.Symbol + "</div>"; }document.getElementById("OurIframe").contentWindow.document.body.innerHTML = html;
Вы можете спросить, что делает код? Он будет проходить через все наши игры, и если будет два игрока, то это уже существующая игра, в противном случае это новая игра, и будет показана ссылка для автоматической отправки транзакции, чтобы присоединиться к игре, используя ark: URI, про которую мы писали в последнем уроке. Если адрес совпадает с нашим, он добавит игру в третью колонку для удобства идентификации. Конечно, вы можете поиграть с HTML-кодом и добавить стили к элементам div внутри наших фреймов, чтобы сделать его по-настоящему популярным! Попробуйте - запустите наш проект Construct, запустите несколько новых игр и отправьте несколько транзакций, чтобы присоединиться к играм. Вы должны увидеть списки, заполненные адресами и ставками, и они будут меняться и обновляться автоматически, когда транзакции сохраняются в блоки и хранятся в блокчейне. Следующие шагиПоздравляем с окончанием третьего урока! Сегодня мы узнали, как анализировать блокчейн для создания лобби и сопоставления ставок, при этом данные автоматически обновляются в клиенте без обновления вручную. В следующем уроке мы будем играть с полем «smartbridge field», также известным как vendor field, чтобы реализовать пошаговую игровую логику, чтобы сделать нашу игру рабочей. Если вы застряли в какой-то момент, обязательно ознакомьтесь с нашими документами в центре обучения ARK. Кроме того, наша команда и разработчики активны в Slack , поэтому не стесняйтесь обращаться к нам!
|
█████████████████████████ ████████▀▀████▀▀█▀▀██████ █████▀████▄▄▄▄██████▀████ ███▀███▄████████▄████▀███ ██▀███████████████████▀██ █████████████████████████ █████████████████████████ █████████████████████████ ██▄███████████████▀▀▄▄███ ███▄███▀████████▀███▄████ █████▄████▀▀▀▀████▄██████ ████████▄▄████▄▄█████████ █████████████████████████ | BitList | | █▀▀▀▀ █ █ █ █ █ █ █ █ █ █ █ █▄▄▄▄ | ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ . REAL-TIME DATA TRACKING CURATED BY THE COMMUNITY . ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | ▀▀▀▀█ █ █ █ █ █ █ █ █ █ █ █ ▄▄▄▄█ | | List #kycfree Websites |
|
|
|
|