Розгортання контрактів
Розгортання — звичайна підписана транзакція на neuro:system.deploy. Кожен валідатор перевіряє байткод через VMGuardian у консенсусі; контракт, що не пройшов аудит, ніде не створюється.
1. Збірка
Контракти — це no_std Rust, скомпільований під wasm32-unknown-unknown як cdylib, що імпортує host-функції з модуля env — оголошуйте їх з #[link(wasm_import_module = "env")], щоб вони лінкувалися з сучасним Rust. Інтерфейс і повний приклад — у NeuroWASM.
[lib]
crate-type = ["cdylib"]
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1cargo build --release --target wasm32-unknown-unknown
od -An -tx1 -v target/wasm32-unknown-unknown/release/my_contract.wasm | tr -d ' \n' > my_contract.hexHex має починатися з 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 (рекомендовано):
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:
{ "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. Що робить кожен валідатор
- Шлюз. Декодує байткод і знаходить його хеш SHA3-256:
- у білому списку (офіційні шаблони, як-от NRC-20) → оцінка безпеки 100, без аналізу;
- шлюз вимкнено управлінням (
deploy_security_enabled = 0) → нейтральна оцінка 70; - інакше запускає VMGuardian
analyze_v2. Якщоrisk_score ≥ deploy_risk_threshold(за замовчуванням 0,80), транзакція невдала і комісія не стягується, відмову записано разом з порушеними правилами, а метрикаnc_deploy_rejected_totalїї рахує.
- Списання 10 000 одиниць газу ×
gas_price. - Створення контракту за адресою
neuro:<10 hex>.app— перші 5 байтівSHA3-256(власник ‖ nonce). Якщо назву вже має інший контракт, розгортання невдале. - Конструктор. Якщо модуль експортує
init, він виконується один раз. - Ініціалізація. Якщо є
init_args, контракт викликається з{"function": "initialize", …init_args}— аргументи на верхньому рівні JSON — і ви — той, хто викликає. - Плата за шаблон. Якщо
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. |