# Розгортання контрактів

> Розгортання WASM-контракту в NeuroChain — збірка під wasm32, транзакція розгортання, шлюз аудиту VMGuardian на кожному валідаторі, конструктор і initialize, комісії, ліміти й безперервний моніторинг після розгортання.

Source: https://docs.nro.world/uk/build/deploy

Розгортання — звичайна підписана транзакція на `neuro:system.deploy`. Кожен валідатор перевіряє байткод через [VMGuardian](/uk/ai/vmguardian) у консенсусі; контракт, що не пройшов аудит, ніде не створюється.

![Схема розгортання: зберіть wasm32-контракт, за бажанням проаналізуйте, надішліть транзакцію розгортання; кожен валідатор проганяє шлюз VMGuardian; ризик на рівні порогу або вище робить транзакцію невдалою без комісії, інакше контракт створюється, виконується його експорт init, потім initialize з init_args](/diagrams/uk/deploy-flow.svg)

## 1. Збірка

Контракти — це `no_std` Rust, скомпільований під `wasm32-unknown-unknown` як `cdylib`, що імпортує host-функції з модуля `env` — оголошуйте їх з `#[link(wasm_import_module = "env")]`, щоб вони лінкувалися з сучасним Rust. Інтерфейс і повний приклад — у [NeuroWASM](/uk/neurowasm/#a-minimal-contract).

```toml
[lib]
crate-type = ["cdylib"]

[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
```

```bash
cargo build --release --target wasm32-unknown-unknown
od -An -tx1 -v target/wasm32-unknown-unknown/release/my_contract.wasm | tr -d ' \n' > my_contract.hex
```

Hex має починатися з `0061736d` (сигнатура WASM). Найбільший розмір байткоду — **512 KiB** (`MAX_BYTECODE_SIZE`).

Робочі приклади в репозиторії: `neurochain/contracts/nrc20` (взаємозамінний токен), `ncert` (сертифікати безпеки в стилі NRC-721), `dao` і `gov_dao`.

## 2. Перевірка перед відправленням <Badge type="tip" text="необов'язково" />

| Ендпоінт | Що отримаєте |
|----------|--------------|
| `POST /api/v1/contracts/analyze` `{ "bytecode_hex": "…" }` | `risk_score`, `security_score`, `ml_score`, `model`, `violations` — той самий аналіз, що і в шлюзі |
| `POST /api/v1/contracts/attest` `{ "bytecode_hex": "…" }` | Той самий результат, підписаний нодою ML-DSA-65, який можна перевірити в браузері |

Сторінка розгортання у вебзастосунку спершу аналізує контракт у браузері, а потім просить у ноди підписану атестацію.

## 3. Надсилання

**Через SDK** (рекомендовано):

```js
await nc.deployContract({
  wallet,
  bytecodeHex,
  name: 'MyToken',            // унікальна назва контракту, необов'язково
  description: '…',
  template: 'nrc20',          // id зареєстрованого шаблону, необов'язково
  initArgs: { … },            // передаються в initialize, необов'язково; decimals — числом
  gasPrice,
})
```

**Вручну** — `POST /api/v1/transactions` з `to: "neuro:system.deploy"`, `value: 0` і `data` — таким рядком JSON:

```json
{ "bytecode_hex": "0061736d…", "name": "MyToken", "description": "", "template": "", "init_args": { } }
```

підписаним як будь-яка транзакція (`nc-tx-v2|from|neuro:system.deploy|0|nonce`).

Нода також має `POST /api/v1/contracts/deploy` (`owner`, `bytecode_hex` або `base64_wasm`, плюс підписана операція для `neuro:system.deploy`); він складає ту саму транзакцію за вас.

## 4. Що робить кожен валідатор {#_4-what-every-validator-does}

1. **Шлюз.** Декодує байткод і знаходить його хеш SHA3-256:
   - у білому списку (офіційні шаблони, як-от NRC-20) → оцінка безпеки 100, без аналізу;
   - шлюз вимкнено управлінням (`deploy_security_enabled = 0`) → нейтральна оцінка 70;
   - інакше запускає VMGuardian `analyze_v2`. Якщо `risk_score ≥ deploy_risk_threshold` (за замовчуванням 0,80), транзакція **невдала і комісія не стягується**, відмову записано разом з порушеними правилами, а метрика `nc_deploy_rejected_total` її рахує.
2. **Списання** 10 000 одиниць газу × `gas_price`.
3. **Створення** контракту за адресою `neuro:<10 hex>.app` — перші 5 байтів `SHA3-256(власник ‖ nonce)`. Якщо назву вже має інший контракт, розгортання невдале.
4. **Конструктор.** Якщо модуль експортує `init`, він виконується один раз.
5. **Ініціалізація.** Якщо є `init_args`, контракт викликається з `{"function": "initialize", …init_args}` — аргументи на верхньому рівні JSON — і ви — той, хто викликає.
6. **Плата за шаблон.** Якщо `template` вказує на зареєстрований шаблон із платою, вона переходить від вас до автора шаблону.

Підсумкова **оцінка безпеки** — `100 − risk_score × 100`, зберігається разом із контрактом.

## Комісії

| Що | Вартість |
|----|----------|
| Розгортання | 10 000 одиниць газу × `gas_price` (при 1 uNRO — 0,01 NRO) |
| Відхилено шлюзом | Нічого |
| Шаблон | Власна плата шаблону, якщо є |

## Після розгортання: безперервний моніторинг

Кожна нода повторно перевіряє розгорнуті контракти кожні 20 секунд (`MONITOR_INTERVAL_SECS`). Коли оцінка контракту змінюється на 10 пунктів чи більше (`MONITOR_SCORE_THRESHOLD`) — наприклад, після оновлення моделі, — через консенсус надсилається транзакція оновлення сертифіката. Сертифікати доступні за `GET /api/v1/certificates/contract/:address`. Див. [VMGuardian](/uk/ai/vmguardian).

## Типові помилки

| Помилка | Причина |
|---------|---------|
| `Deploy rejected by VMGuardian: risk_score … >= threshold …` | Аудит знайшов ризиковані шаблони; `analyze` їх перелічує. |
| `gas_price … below block base_fee …` | Підніміть `gasPrice` вище поточної базової комісії. |
| `Contract name '…' is already taken` | Оберіть іншу `name` або залиште порожньою. |
| Помилка розміру | Байткод понад 512 KiB — збирайте з `opt-level = "z"` і LTO. |
