Розгортування блокчейну на Hyperledger Besu
Hyperledger Besu — єдиний enterprise Ethereum клієнт під ліцензією Apache 2.0, написаний на Java. Ключова відмінність від Geth та Erigon: Besu підтримує permissioned мережи через smart contract-based permissioning, кілька enterprise consensus алгоритмів (QBFT, IBFT 2.0, Clique), та нативно інтегрується в Hyperledger екосистему.
Вибирають Besu коли потрібна EVM-сумісність (смарт-контракти на Solidity, інструменти Hardhat/Foundry, MetaMask з коробки) плюс контроль над учасниками мережі — на відміну від Fabric де потрібен кастомний chaincode для кожної операції.
Архітектура permissioned мережи
┌──────────────────────────────────────────────────────┐
│ Besu Network │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Bootnode │ │Validator1│ │Validator2│ ... │
│ │(no vote) │ │(QBFT) │ │(QBFT) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ └─────────────┴─────────────┘ │
│ P2P Network │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ Permissioning Contracts │ │
│ │ NodePermissioning AccountPermissioning │ │
│ └──────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
QBFT vs IBFT 2.0: вибір консенсусу
QBFT (Quorum Byzantine Fault Tolerance) — рекомендований алгоритм для нових мереж. Фінальність негайно після включення в блок, немає форків. Терпить до (n-1)/3 Byzantine нод — при 4 валідаторах переживаємо 1 злонамеренний.
IBFT 2.0 — попередник QBFT, схожі властивості, менш продуктивний при більших validator sets. Залишений для обратної сумісності.
Clique — PoA алгоритм, аналог Ethereum Goerli. Менш суворі гарантії фінальності, але простіше в операції. Для dev/staging.
Мінімальне число валідаторів для QBFT: 4 (терпить 1 отказ). Для production: 4–7 валідаторів від різних організацій.
Genesis файл
{
"config": {
"chainId": 1337,
"berlinBlock": 0,
"londonBlock": 0,
"qbft": {
"blockperiodseconds": 2,
"epochlength": 30000,
"requesttimeoutseconds": 4,
"blockreward": "0",
"validatorcontractaddress": "0x0000000000000000000000000000000000008888"
}
},
"nonce": "0x0",
"timestamp": "0x5b3d92d7",
"gasLimit": "0x1fffffffffffff",
"difficulty": "0x1",
"mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"0xfe3b557e8fb62b89f4916b721be55ceb828dbd73": {
"privateKey": "...",
"comment": "validator 1",
"balance": "0xad78ebc5ac6200000"
}
},
"extraData": "0x..."
}
extraData для QBFT повинен містити RLP-кодований список адрес початкових валідаторів. Використовуємо besu operator generate-blockchain-config для генерації genesis з ключами:
besu operator generate-blockchain-config \
--config-file=qbftConfigFile.json \
--to=networkFiles \
--private-key-file-name=key
Генерує genesis.json + директорії для кожної ноди з ключами та enode URL.
Docker Compose для локальної мережи
version: '3.8'
services:
bootnode:
image: hyperledger/besu:latest
command: |
--node-private-key-file=/opt/besu/keys/bootnode/key
--data-path=/opt/besu/data
--genesis-file=/opt/besu/config/genesis.json
--rpc-http-enabled=true
--rpc-http-host=0.0.0.0
--rpc-http-port=8545
--rpc-http-api=ETH,NET,QBFT,ADMIN,WEB3
--host-allowlist=*
--rpc-http-cors-origins=all
--p2p-port=30303
--logging=INFO
volumes:
- ./config:/opt/besu/config:ro
- ./keys:/opt/besu/keys:ro
- bootnode-data:/opt/besu/data
ports:
- "8545:8545"
- "30303:30303"
validator1:
image: hyperledger/besu:latest
depends_on: [bootnode]
command: |
--node-private-key-file=/opt/besu/keys/validator1/key
--data-path=/opt/besu/data
--genesis-file=/opt/besu/config/genesis.json
--bootnodes=enode://${BOOTNODE_PUBKEY}@bootnode:30303
--rpc-http-enabled=true
--rpc-http-host=0.0.0.0
--rpc-http-port=8546
--rpc-http-api=ETH,NET,QBFT
--p2p-port=30304
volumes:
- ./config:/opt/besu/config:ro
- ./keys:/opt/besu/keys:ro
- validator1-data:/opt/besu/data
volumes:
bootnode-data:
validator1-data:
Permissioning: контроль учасників
Besu підтримує два рівні permissioning:
Node permissioning — які ноди можуть підключатися до P2P мережи. Smart contract-based: список дозволених enode URL зберігається в контракті, динамічно оновлюється без рестарту нод.
Account permissioning — які accounts можуть відправляти транзакції та деплоїти контракти. Також через контракт.
# Включення permissioning у конфісу ноди
--permissions-nodes-contract-enabled=true
--permissions-nodes-contract-address=0x0000000000000000000000000000000000009999
--permissions-accounts-contract-enabled=true
--permissions-accounts-contract-address=0x0000000000000000000000000000000000008888
Контракти permissioning деплоятся при genesis (додаємо в alloc з bytecode) або після запуску мережи. Besu надає reference implementation:
git clone https://github.com/ConsenSys/permissioning-smart-contracts
cd permissioning-smart-contracts
npm install
# Деплой через Hardhat з вказанням початкових валідаторів та нод
Моніторинг та управління
# Список поточних валідаторів через QBFT API
curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"],"id":1}' \
http://localhost:8545
# Додання нового валідатора (потребує BFT majority голосування)
curl -X POST --data '{"jsonrpc":"2.0","method":"qbft_proposeValidatorVote","params":["0xNewValidatorAddress",true],"id":1}' \
http://localhost:8545
Grafana + Prometheus: Besu експортує метрики у Prometheus формат на порту 9545 (--metrics-enabled=true --metrics-host=0.0.0.0 --metrics-port=9545). Офіційний Grafana dashboard: github.com/ConsenSys/quorum-monitoring.
Інтеграція з існуючими інструментами
Besu — EVM-сумісний, тому працюють без змін:
- Hardhat/Foundry — деплой контрактів, тесты
- MetaMask — додати кастомну мережу через Custom RPC
- ethers.js / web3.js / viem — без змін коду
- OpenZeppelin контракти — повністю сумісні
- The Graph — можна деплоїти локальний graph-node для індексації
Різниця: private/permissioned нода — це ваш власний RPC endpoint, а не загальнодоступний.
Типові етапи деплою
| Етап | Задачі | Час |
|---|---|---|
| Дизайн мережи | Кількість організацій, валідаторів, параметри консенсусу | 1–2 дні |
| Genesis | Генерація ключів, genesis.json, alloc | 1 день |
| Інфраструктура | Сервера, Docker/K8s, networking | 2–3 дні |
| Деплой | Запуск нод, синхронізація, перевірка | 1–2 дні |
| Permissioning | Деплой контрактів, налаштування ролей | 1–2 дні |
| Смарт-контракти | Деплой бізнес-логіки | залежить |
| Моніторинг | Prometheus, Grafana, алерти | 1 день |
| Документація | Runbook, onboarding для операторів | 1–2 дні |







