Skip to content

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

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

Схема розгортання: зберіть wasm32-контракт, за бажанням проаналізуйте, надішліть транзакцію розгортання; кожен валідатор проганяє шлюз VMGuardian; ризик на рівні порогу або вище робить транзакцію невдалою без комісії, інакше контракт створюється, виконується його експорт init, потім initialize з init_args

1. Збірка ​

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

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. Перевірка перед відправленням необов'язково ​

ЕндпоінтЩо отримаєте
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. Що робить кожен валідатор ​

  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.

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

ПомилкаПричина
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.