5865f6fc14
Контракт `apps` (координационная плоскость для apps-catalog): - 4 таблицы: packages, releases, subs, coops; ABI 21 KB, WASM 70 KB - 11 actions: regpackage, transferpkg, setrelease, reactivate, withdraw, cleanup, regsub, expsub, regcoop, setcoop, migrate - subs.chain_id и coops.chain_id — каноническая идентификация подсети - coops.signing_key — отдельный subnet-signing-key (не active), ротация через setcoop без потери ранее выпущенных JWT - releases с TTL retention 90 дней + inline cleanup до 50 записей - atomic supersede в setrelease — выполняет FR8 «approve → ACTIVE» на стороне blockchain'а CI контейнер `dicoop/contracts`: - упаковывает все 21 контракт (15 user + 6 system eosio.*) в alpine 10.8 MB - список контрактов берётся из CMakeLists (single source of truth) - триггер push на dev/testnet/main + workflow_dispatch - маппинг ветка→tag: dev/testnet/main + sha-pinned tag для воспроизводимости - manifest.json с sha256 каждого артефакта внутри образа - entrypoint: copy [name] | manifest | sha256 | list | ls - multi-stage потребление в ke-bootstrap = 0 MB на VPS Закрывает блокер Story 6.x (KE bootstrap) для apps-catalog.
64 lines
3.2 KiB
C++
64 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include <eosio/eosio.hpp>
|
|
#include <eosio/crypto.hpp>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "../consts.hpp"
|
|
|
|
namespace Apps {
|
|
|
|
using namespace eosio;
|
|
|
|
/**
|
|
* \brief Запись каталога: один зарегистрированный пакет.
|
|
*
|
|
* Идентификация: PK = `package_id` (Antelope `name`, ≤12 символов, [a-z1-5.]).
|
|
* Имя выбирает разработчик при публикации; уникальность гарантируется блокчейном
|
|
* (`emplace` фейлится, если такой `package_id` уже зарегистрирован).
|
|
*
|
|
* Имена пакета:
|
|
* - `package_id` — кодовое неизменяемое имя в каталоге (этот PK).
|
|
* - `package_name` — внешнее человекочитаемое имя (например, npm
|
|
* `@voskhod/sports-club-tracker`, go-module path или OCI-image name).
|
|
* Меняется через `setpkgname` (если потребуется) или re-publish; в текущей
|
|
* схеме допускается изменение через rename-action в будущем.
|
|
*
|
|
* `compatible_subnets` — human-labels подсетей (`ru`, `by`, ...). Реальная
|
|
* идентификация подсети — через `chain_id`, который хранится в `coops`/`subs`;
|
|
* здесь labels достаточно, потому что они используются только для display
|
|
* и грубой фильтрации в UI.
|
|
*
|
|
* `last_active_version` — semver самого свежего active-релиза c `scope.kind=all`.
|
|
* Поле обновляется только при `setrelease` со scope=all и используется для
|
|
* быстрого ответа `GET /v1/package/:id` без сканирования таблицы `releases`.
|
|
* Canary-релизы это поле не трогают — оно отражает «версию по умолчанию»
|
|
* для кооперативов вне canary-целей.
|
|
*
|
|
* \see lib/domain/table_apps_releases.hpp — связанные релизы (FK by_package).
|
|
*/
|
|
struct [[eosio::table, eosio::contract(APPS)]] package {
|
|
name package_id; // PK, кодовое имя
|
|
std::string package_name; // внешнее имя (npm/go/oci)
|
|
name owner; // владелец (username разработчика)
|
|
std::vector<name> compatible_subnets; // labels подсетей: "ru","by",...
|
|
std::string last_active_version; // semver последнего scope=all active
|
|
time_point_sec created_at;
|
|
time_point_sec updated_at;
|
|
|
|
uint64_t primary_key() const { return package_id.value; }
|
|
uint64_t by_owner() const { return owner.value; }
|
|
uint64_t by_subnet() const {
|
|
return compatible_subnets.empty() ? 0 : compatible_subnets[0].value;
|
|
}
|
|
};
|
|
|
|
typedef eosio::multi_index<
|
|
"packages"_n, package,
|
|
eosio::indexed_by<"byowner"_n, eosio::const_mem_fun<package, uint64_t, &package::by_owner>>,
|
|
eosio::indexed_by<"bysubnet"_n, eosio::const_mem_fun<package, uint64_t, &package::by_subnet>>>
|
|
packages_index;
|
|
|
|
} // namespace Apps
|