Арк Мессенджер учебник - часть 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