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.
3.7 KiB
3.7 KiB
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.