Skip to content

Latest commit

 

History

History
284 lines (222 loc) · 13.6 KB

File metadata and controls

284 lines (222 loc) · 13.6 KB

Протокол VM на блокчейне VIZ

Спецификация протокола

  • Тип протокола: Custom (Гибкий)
  • Название протокола: Viz Magic
  • Наименование протокола: VM
  • Тип доступа: Обычный
  • Расширения: VE (Viz Events) для изменяемого состояния; V (Голос) для социального слоя
  • Описание протокола: Открытый протокол для обратно-связанных JSON-объектов в блокчейне VIZ, созданный для детерминированных RPG-действий, записываемых как начертания в блокчейн.

Аккаунт создаёт операцию гибкого протокола и записывает JSON-объект с обратной ссылкой на предыдущий объект в истории. Каждое начертание ссылается на предыдущий блок, содержащий VM-операцию от того же аккаунта, формируя обратно-связанную цепочку всех игровых действий. Эта цепочка может быть прочитана с помощью плагина custom_protocol_api.

Пример: Аккаунт А выполнил VM-операции в блоках: 1000, 1500, 2000. Блокчейн хранит, что последняя гибкая операция аккаунта А находится в блоке 2000. Мы извлекаем операции из блока 2000, находим VM-начертание, которое ссылается на блок 1500 как предыдущее звено. Блок 1500, в свою очередь, ссылается на блок 1000. Это позволяет полностью восстановить игровую историю любого аккаунта.

URL-схема

Используется VIZ URL-схема:

viz://@account/block-number/*VM/

Обеспечивает прямой доступ к конкретному игровому начертанию аккаунта в заданном блоке.

Структура объектов

Операции гибкого протокола содержат данные в формате JSON. Короткие имена атрибутов минимизируют размер операций. Версия увеличивается при нарушении обратной совместимости. Атрибуты, отмеченные *, являются опциональными.

Атрибут коротко Атрибут полный Описание
p protocol Идентификатор протокола. Значение: VM
v* version Версия протокола. По умолчанию: 1. Увеличивается при нарушении обратной совместимости.
b back-link Номер блока предыдущей VM-операции от данного аккаунта.
t type Тип действия (см. таблицу Типов действий ниже).
d data Объект с данными, специфичными для действия.

Формат сообщения

{
  "p": "VM",
  "v": 1,
  "b": 12340000,
  "t": "hunt",
  "d": { "creature": "ember_wisp", "zone": "commons_first_light", "spell": "firebolt" }
}

Типы действий

Персонаж

Тип действия Описание Поля данных
char.attune Создание/настройка персонажа class — класс персонажа (stonewarden, embercaster, moonrunner, bloomsage)
rest Отдых для восстановления маны (нет)

PvE — Охота

Тип действия Описание Поля данных
hunt Охота на существо creature — ID существа, zone — ID зоны, spell — используемое заклинание

PvP — Дуэли

Тип действия Описание Поля данных
challenge Вызов другого игрока на дуэль target — аккаунт противника, wager — опциональная ставка в VIZ
accept Принятие вызова на дуэль challenger — аккаунт бросившего вызов
commit Отправка запечатанного намерения раунда hash — SHA-256 от intent + salt
reveal Раскрытие намерения раунда intent — выбранное действие (strike/guard/weave/mend), salt — случайная соль
forfeit Сдача в активной дуэли (нет)

Создание предметов

Тип действия Описание Поля данных
craft Создать предмет recipe — ID рецепта, materials — массив ID расходуемых предметов

Предметы

Тип действия Описание Поля данных
item.transfer Передать предмет другому аккаунту item — ID предмета, to — аккаунт получателя
item.equip Экипировать предмет item — ID предмета, slot — слот экипировки
item.unequip Снять предмет item — ID предмета

Рынок

Тип действия Описание Поля данных
market.list Выставить предмет на продажу item — ID предмета, price — цена в Эссенции Виз
market.cancel Отменить выставление item — ID предмета
market.buy Купить выставленный предмет item — ID предмета, seller — аккаунт продавца

Гильдии

Тип действия Описание Поля данных
guild.create Создать гильдию name — название гильдии, tag — короткий тег (2–5 символов)
guild.invite Пригласить игрока target — приглашаемый аккаунт
guild.accept Принять приглашение в гильдию guild — тег гильдии
guild.leave Покинуть текущую гильдию (нет)
guild.promote Повысить участника target — аккаунт, role — новая роль
guild.war Объявить войну другой гильдии target — тег вражеской гильдии
guild.peace Предложить мир target — тег вражеской гильдии

Осады и территории

Тип действия Описание Поля данных
siege.declare Объявить осаду территории territory — ID территории
siege.commit Запечатать действие осады hash — хеш запечатанного намерения
territory.claim Захватить незанятую территорию territory — ID территории

Локации

Тип действия Описание Поля данных
loc.create Создать игровую локацию name — название, zone — ID зоны, type — тип локации

Квесты

Тип действия Описание Поля данных
quest.accept Принять квест quest — ID квеста
quest.complete Завершить квест quest — ID квеста, proof — данные подтверждения выполнения

Мировые боссы

Тип действия Описание Поля данных
boss.attack Атаковать мирового босса boss — ID босса, spell — используемое заклинание

Гримуар (данные персонажа)

Данные персонажа хранятся в json_metadata аккаунта под ключом vm. Это публичный лист персонажа (Гримуар), доступный для чтения любому клиенту. Обновляется на стороне клиента и записывается в блокчейн через операцию account_metadata.

{
  "vm": {
    "class": "embercaster",
    "level": 12,
    "xp": 34500,
    "stats": {
      "potency": 15,
      "resilience": 10,
      "swiftness": 12,
      "intellect": 18,
      "fortune": 8
    },
    "equipment": {
      "weapon": "flame_staff_02",
      "armor": "ember_robe_01",
      "accessory": "ruby_pendant_01"
    },
    "guild": "phoenix",
    "spells": ["firebolt", "inferno", "flame_shield"],
    "title": "Keeper of Embers"
  }
}

Соответствие блокчейна и игры

Механика VIZ Игровая механика Использование
SHARES (доля) Магическое Ядро Привязанная к душе сила; определяет базовые характеристики и мощь заклинаний
Ликвидный VIZ Эссенция Виз Торгуемая валюта для рынка и ставок
Энергия (0–10000 бп) Мана Ёмкость для направления силы; расходуется действиями; полное восстановление за 5 дней
Операция награждения Заклинание Атаки, исцеления, баффы — передача наград на основе энергии
custom_sequence (VM) Начертания Все игровые действия, записанные в блокчейн
json_metadata аккаунта Гримуар Публичный лист персонажа
Хеш блока Энтропия Судьбы Детерминированная случайность для исходов охоты, качества создания, добычи
Номер блока Эфирный Тик Единица игрового времени (1 тик ≈ 3 секунды)
Делегирование Связь Покровителя Передача силы другому игроку
Бенефициары Ритуальные Круги Распределение наград между участниками группы

Определение исходов

Все кажущиеся случайными исходы (успех охоты, выпадение добычи, качество создания) вычисляются детерминированно из хеша блока, содержащего действие. Это обеспечивает:

  1. Отсутствие необходимости в серверной случайности.
  2. Все клиенты независимо вычисляют одинаковый результат.
  3. Результаты проверяемы любым, кто имеет доступ к блокчейну.

Формула комбинирует хеш блока с параметрами, специфичными для действия (тип существа, использованное заклинание, характеристики персонажа), для получения значений исхода.

Примеры

Настройка персонажа

{
  "p": "VM",
  "v": 1,
  "b": 0,
  "t": "char.attune",
  "d": { "class": "embercaster" }
}

Охота

{
  "p": "VM",
  "v": 1,
  "b": 12340000,
  "t": "hunt",
  "d": { "creature": "ember_wisp", "zone": "commons_first_light", "spell": "firebolt" }
}

Коммит дуэли (запечатанное намерение)

{
  "p": "VM",
  "v": 1,
  "b": 12340500,
  "t": "commit",
  "d": { "hash": "a3f2b7c9d1e4f6a8b0c2d4e6f8a0b2c4d6e8f0a2b4c6d8e0f2a4b6c8d0e2f4" }
}

Раскрытие дуэли

{
  "p": "VM",
  "v": 1,
  "b": 12340600,
  "t": "reveal",
  "d": { "intent": "strike", "salt": "xK9mP2qR" }
}

Создание предмета

{
  "p": "VM",
  "v": 1,
  "b": 12341000,
  "t": "craft",
  "d": { "recipe": "flame_staff", "materials": ["wood_01", "ember_crystal_03", "fire_essence_01"] }
}

Выставление предмета на рынок

{
  "p": "VM",
  "v": 1,
  "b": 12341500,
  "t": "market.list",
  "d": { "item": "flame_staff_02", "price": 150 }
}

Создание гильдии

{
  "p": "VM",
  "v": 1,
  "b": 12342000,
  "t": "guild.create",
  "d": { "name": "Order of the Phoenix", "tag": "PHX" }
}

Атака мирового босса

{
  "p": "VM",
  "v": 1,
  "b": 12343000,
  "t": "boss.attack",
  "d": { "boss": "ancient_drake", "spell": "inferno" }
}