# Governance интеграция Нода может использовать governance-контракт для динамического управления параметрами (gas_price и другими) без перезапуска. ## Принцип работы ``` Governance contract (on-chain) state: param:gas_price = "5" param:relay_fee = "200" ... Node (blockchain/chain.go) GetEffectiveGasPrice() → читает BadgerDB напрямую GetGovParam(key) → cstate::param: ``` Нода читает параметры **напрямую из BadgerDB** без вызова VM — это быстро и дёшево. ## Привязка governance ### При запуске ноды (флаг) ```bash ./node \ --key node1.json \ --governance-contract a1b2c3d4e5f60001 \ ... ``` ### В рантайме (без перезапуска) ```bash curl -X POST http://localhost:8081/api/governance/link \ -H "Content-Type: application/json" \ -d '{"governance": "a1b2c3d4e5f60001"}' ``` **Response:** ```json {"status": "ok", "governance": "a1b2c3d4e5f60001"} ``` Изменение вступает в силу немедленно — следующий `CALL_CONTRACT` уже будет использовать новый governance. ### Через deploy-скрипт (автоматически) `scripts/deploy_contracts.sh` автоматически вызывает `link_governance` на всех нодах после деплоя: ```bash link_governance() { for NODE in http://node1:8080 http://node2:8080 http://node3:8080; do curl -sX POST "$NODE/api/governance/link" \ -H "Content-Type: application/json" \ -d "{\"governance\":\"$GOV_ID\"}" done } ``` ## Управляемые параметры | Ключ | Тип | По умолчанию | Описание | |------|-----|-------------|---------| | `gas_price` | uint64 (строка) | 1 | µT за 1 gas unit | Дополнительные параметры можно хранить в governance для читающих их контрактов (например, `messenger_entry_fee`, `relay_fee_override`, etc.) — нода их не читает, но они доступны через inter-contract вызовы. ## Изменение gas_price ```bash # 1. Любой предлагает новое значение client call-contract --method propose \ --arg gas_price --arg 5 \ --contract $GOV_ID --key key.json \ --gas 10000 --node http://node1:8080 # 2. Admin утверждает client call-contract --method approve \ --arg gas_price \ --contract $GOV_ID --key /keys/node1.json \ --gas 10000 --node http://node1:8080 # 3. Проверить текущее значение curl "http://localhost:8081/api/contracts/$GOV_ID/state/param:gas_price" ``` После approve — изменение вступает в силу немедленно на всех нодах которые привязали этот governance. ## Передача роли admin ```bash # Передать admin другому валидатору client call-contract --method set_admin \ --arg $NEW_ADMIN_PUBKEY \ --contract $GOV_ID --key /keys/node1.json \ --gas 10000 --node http://node1:8080 ``` ## Отвязать governance Если нужно вернуться к значениям по умолчанию: ```bash curl -X POST http://localhost:8081/api/governance/link \ -H "Content-Type: application/json" \ -d '{"governance": ""}' ``` После этого нода будет использовать встроенные константы (`GasPrice = 1 µT/gas`). ## Проверка привязки Прямого API для проверки текущего govContractID нет. Косвенно: если gas_price изменился через governance и применился — привязка работает. ```bash # Установить gas_price = 1 через governance # Затем вызвать контракт с --gas 1000 и проверить fee = 1000 µT ```