Files
mono/components/contracts/docker/README.md
T
coopops 5865f6fc14 feat(contracts/apps): smart-contract каталога приложений + docker pipeline
Контракт `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.
2026-04-30 07:55:06 +00:00

3.7 KiB
Raw Blame History

dicoop/contracts — образ-артефакт всех контрактов

Контейнер собирает в один slim alpine-образ wasm/abi всех контрактов кооперативной экономики (apps, marketplace, ledger, meet, loan, wallet, capital, branch, contributor, fund, draft, soviet, registrator, gateway, system, test).

Зачем отдельный образ

  • Нода (dicoop/blockchain_v5.1.1) — это runtime с nodeos. Она одна и не должна повторно собираться вместе с контрактами.
  • Сборка контрактов (через CDT) — отдельный шаг CI, выполняется в том же dicoop/blockchain_v5.1.1-образе но в режиме toolchain.
  • Деплой — третий артефакт (ke-bootstrap), который читает контракты отсюда и применяет их к ноде через cleos set contract.

Эта декомпозиция даёт переиспользование: одна нода + N версий контрактов

  • один bootstrap.

Layout внутри образа

/contracts/
├── apps/
│   ├── apps.wasm
│   └── apps.abi
├── marketplace/
│   ├── marketplace.wasm
│   └── marketplace.abi
├── ...
└── manifest.json    # имена + sha256 + build_mode + git sha + timestamp

Тэги

Ветка Tag IS_TESTNET
dev dicoop/contracts:dev ON
testnet dicoop/contracts:testnet ON
main dicoop/contracts:main + :latest OFF

Дополнительно для воспроизводимости каждый push публикуется как dicoop/contracts:<tag>-<short_sha>.

Использование

1. Multi-stage в bootstrap-образе (production)

FROM dicoop/contracts:testnet AS contracts

FROM dicoop/blockchain_v5.1.1:dev
COPY --from=contracts /contracts /work/contracts
# ... bootstrap-script использует /work/contracts при cleos set contract

2. Volume-mount (debug, локальные dev-окружения)

mkdir -p ./out
docker run --rm -v "$PWD/out:/out" dicoop/contracts:testnet
ls out/
# apps/ marketplace/ ledger/ ... manifest.json

3. Точечно один контракт

docker run --rm -v "$PWD/out:/out" dicoop/contracts:testnet copy apps
ls out/apps/
# apps.wasm apps.abi

4. Аудит / диагностика

# Список всех контрактов в образе:
docker run --rm dicoop/contracts:testnet list

# Контрольные суммы:
docker run --rm dicoop/contracts:testnet sha256

# Манифест с метаданными сборки:
docker run --rm dicoop/contracts:testnet manifest | jq .

Локальная сборка

# 1. Скомпилировать контракты:
cd components/contracts
./build-all.sh prod    # или ./build-all.sh test для testnet-режима

# 2. Подготовить docker context:
mkdir -p docker/.context/contracts
for c in apps marketplace ledger meet loan wallet capital branch \
         contributor fund draft soviet registrator gateway system test; do
  if [ -f build/contracts/$c/$c.wasm ]; then
    mkdir -p docker/.context/contracts/$c
    cp build/contracts/$c/$c.wasm docker/.context/contracts/$c/
    cp build/contracts/$c/$c.abi  docker/.context/contracts/$c/
  fi
done
cp docker/Dockerfile docker/entrypoint.sh docker/.context/

# 3. Build:
docker build -t dicoop/contracts:local ./docker/.context

В CI этот pipeline автоматизирован — см. .github/workflows/build-contracts.yaml.