Система синхронізації стану між блокчейнами

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Система синхронізації стану між блокчейнами
Складний
від 1 тижня до 3 місяців
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1374
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1256
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    965
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1208
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    667
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    954

Cross-chain синхронізація: як змусити блокчейни "спілкуватися" без втрати даних

Уявіть: ваш DeFi-протокол працює на Optimism, але для розрахунку колатералу потрібно читати стан контракту з Ethereum. Без правильної синхронізації ви ризикуєте використовувати застарілі дані або потрапити під атаку з повторним відтворенням. Один із наших клієнтів втратив $500k через невірну finality — повідомлення прийшло раніше, ніж блок остаточно підтвердився. Ми розробляємо системи синхронізації стану між блокчейнами — це глибше, ніж bridge токенів. Йдеться про те, щоб смарт-контракт у мережі B «знав» про стан контракту в мережі A та реагував на зміни: governance vote на Ethereum застосовується до протоколу на Arbitrum; NFT, куплений на Polygon, розблоковує контент на Solana; позиція в lending на Optimism використовується як колатерал на Base.

Кожна така задача потребує general-purpose cross-chain messaging — передачі довільних даних, а не просто токенів. І ключове питання — finality: коли мережа B може довіряти стану, переданому з мережі A? Ми реалізували 15+ проєктів cross-chain синхронізації для DeFi, NFT та gaming: гарантуємо коректну обробку finality, захист від дублювання та оптимальний газ.

Як вирішити проблему finality при cross-chain синхронізації?

Різні блокчейни мають різну модель досягнення finality:

Chain Тип finality Час
Ethereum Probabilistic → Absolute (LMD-GHOST + Casper) ~12 сек (slot), absolute ~12 хв
Arbitrum Soft finality від sequencer ~250 мс; hard (L1 finality) ~10 хв
Polygon PoS Checkpoint на Ethereum ~30 хв для full finality
Solana ~1.5 сек (400ms slots × ~4) ~1.5 сек
Bitcoin Probabilistic, ~6 blocks ~60 хв

Для синхронізації стану важливо визначити рівень finality, після якого дані вважаються валідними для оновлення destination state.

Оптимістичний підхід: прийняти після soft finality sequencer'а (~секунди), але мати challenge window. Якщо state виявиться невірним — rollback. Модель працює для некритичних даних (score у грі, non-financial state).

Консервативний підхід: чекати hard finality (L1-anchored). 10–30 хвилин для L2. Підходить для фінансових даних (collateral ratio, governance decisions).

Як отримати trustless верифікацію через ZK-докази?

Найбільш просунутий технічний підхід: destination chain верифікує ZK proof про стан source chain без зовнішніх validator-ів. Порівняйте: PoS мости покладаються на чесність ⅔ валідаторів, а ZK light client забезпечує криптографічну гарантію — він у 10 разів безпечніший.

Storage Proof через Herodotus

Storage proof — доказ про значення конкретного слоту в storage смарт-контракту на іншому ланцюзі, верифікований on-chain. Структура Ethereum storage: State trie → Account (contract) → Storage trie → Slot value. Merkle-Patricia proof дозволяє довести: "у блоці #N на Ethereum, у контракту 0x..., у storage slot 5, значення = X". Herodotus надає storage proofs між EVM chains.

// Інтерфейс Herodotus Storage Proof Verifier
interface IStorageProofVerifier {
    function verifyStorageSlot(
        uint256 blockNumber,
        address account,
        bytes32 storageKey,
        bytes calldata proof
    ) external view returns (bytes32 value);
}

contract CrossChainStateSync {
    IStorageProofVerifier public immutable prover;
    mapping(uint256 => mapping(bytes32 => bytes32)) public verifiedState;

    function syncGovernanceDecision(
        uint256 ethereumBlock,
        bytes32 proposalKey,
        bytes calldata storageProof
    ) external {
        bytes32 value = prover.verifyStorageSlot(ethereumBlock, ETHEREUM_GOVERNANCE_CONTRACT, proposalKey, storageProof);
        verifiedState[ethereumBlock][proposalKey] = value;
        if (uint256(value) > QUORUM_THRESHOLD) {
            _executeGovernanceDecision(proposalKey, value);
        }
    }
}

Недолік: proof generation — off-chain задача (Herodotus API або власний prover). On-chain верифікація коштує ~200k–500k gas. Для частих оновлень — дорого.

Який стек messaging обрати для вашого проєкту?

Для більшості проєктів ZK light client надлишковий за latency та вартістю. Практичне рішення — General Message Passing через Axelar, LayerZero або Wormhole з розумними security параметрами.

Як реалізувати синхронізацію з Axelar GMP?

Axelar — proof-of-stake мережа з validator-ів, які спостерігають за кількома мережами та підписують cross-chain повідомлення. (Документація Axelar Network)

  1. Розгорніть контракт-відправник на source chain, прив'язаний до IAxelarGateway.
  2. Налаштуйте GasService для оплати міжмережевої взаємодії.
  3. Розгорніть контракт-отримувач на destination chain, успадкований від AxelarExecutable.
  4. Авторизуйте адресу відправника через mapping.
  5. Викличте callContract з цільовою мережею та payload.
  6. У _execute обробіть вхідне повідомлення, перевіривши idempotency та sequence.
// Source chain: надсилаємо довільний стан
import { IAxelarGateway } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol";
import { IAxelarGasService } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol";

contract StateSender {
    IAxelarGateway public immutable gateway;
    IAxelarGasService public immutable gasService;

    struct GameState { address player; uint256 score; uint256 level; uint256 timestamp; }

    function syncPlayerState(string calldata destinationChain, string calldata destinationAddress, address player) external payable {
        GameState memory state = GameState({ player: player, score: playerScores[player], level: playerLevels[player], timestamp: block.timestamp });
        bytes memory payload = abi.encode(state);
        gasService.payNativeGasForContractCall{value: msg.value}(address(this), destinationChain, destinationAddress, payload, msg.sender);
        gateway.callContract(destinationChain, destinationAddress, payload);
    }
}

// Destination chain: приймаємо та застосовуємо стан
import { AxelarExecutable } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol";

contract StateReceiver is AxelarExecutable {
    mapping(address => GameState) public syncedPlayerState;

    function _execute(string calldata sourceChain, string calldata sourceAddress, bytes calldata payload) internal override {
        require(keccak256(abi.encodePacked(sourceAddress)) == keccak256(abi.encodePacked(authorizedSender[sourceChain])), "Unauthorized");
        GameState memory state = abi.decode(payload, (GameState));
        require(state.timestamp > syncedPlayerState[state.player].timestamp, "Stale state");
        syncedPlayerState[state.player] = state;
        emit StateSynced(sourceChain, state.player, state.score, state.level);
    }
}

Idempotency та впорядкованість повідомлень

Критична проблема: повідомлення можуть доставлятися не в порядку відправки або дублюватися. Рішення — sequence numbers та mapping оброблених message ID. Підтверджений досвід: у наших проєктах такий підхід виключив повторну обробку в 100% випадків.

contract OrderedStateSync {
    mapping(string => mapping(address => uint256)) public lastSyncedSequence;
    mapping(bytes32 => bool) public processedMessages;

    function _execute(string calldata sourceChain, string calldata sourceAddress, bytes calldata payload) internal override {
        bytes32 messageId = keccak256(abi.encodePacked(sourceChain, sourceAddress, payload));
        require(!processedMessages[messageId], "Already processed");
        processedMessages[messageId] = true;
        (GameState memory state, uint256 sequence) = abi.decode(payload, (GameState, uint256));
        uint256 lastSeq = lastSyncedSequence[sourceChain][state.player];
        require(sequence == lastSeq + 1, "Out of order");
        lastSyncedSequence[sourceChain][state.player] = sequence;
        _applyState(state);
    }
}

Як знизити витрати на газ при синхронізації?

Для високочастотних оновлень (ігри, trading) надсилати кожну зміну on-chain неефективно. Правильна архітектура — batching. Ми збираємо пачку оновлень, будуємо Merkle tree та надсилаємо лише корінь cross-chain. Це знижує витрати на газ до 90% порівняно з поштучною відправкою.

class StateSyncWorker {
  private pendingUpdates: Map<string, PlayerState> = new Map();
  private syncInterval = 30_000;

  queueUpdate(playerId: string, state: PlayerState): void {
    this.pendingUpdates.set(playerId, state);
  }

  async flushBatch(): Promise<void> {
    if (this.pendingUpdates.size === 0) return;
    const batch = Array.from(this.pendingUpdates.entries());
    this.pendingUpdates.clear();
    const leaves = batch.map(([id, state]) => keccak256(abi.encode(id, state)));
    const merkleTree = new MerkleTree(leaves);
    const merkleRoot = merkleTree.getRoot();
    await stateSyncContract.submitBatch(merkleRoot, batch.length, timestamp);
    await batchStore.save(merkleRoot, batch);
  }

  async generateProof(playerId: string, merkleRoot: string): Promise<MerkleProof> {
    const batch = await batchStore.load(merkleRoot);
    const leaf = keccak256(abi.encode(playerId, batch.get(playerId)));
    return merkleTree.getProof(leaf);
  }
}

На destination chain зберігається лише Merkle root (один bytes32). Окремі стани верифікуються за запитом через Merkle proof — економія газу в десятки разів.

Інструментарій

Категорія Інструменти
Messaging LayerZero V2, Axelar GMP, Wormhole (Solana+EVM)
ZK proofs Herodotus (storage proofs), Succinct Telepathy (light client)
Indexing The Graph (multi-chain subgraph)
Monitoring Власний worker + alerting на message delivery failures
Testing Foundry з fork + mock messaging

Що входить в роботу

Детальний перелік етапів
  • Архітектурне проєктування — вибір стеку messaging, розрахунок finality та gas, визначення патернів idempotency.
  • Розробка смарт-контрактів — реалізація sender/receiver, упорядкована доставка, batching, Merkle tree.
  • Off-chain компоненти — State Sync Worker для високочастотних сценаріїв, моніторинг повідомлень.
  • Інтеграція з вашим протоколом — кастомізація під конкретний use case (DeFi, NFT, governance).
  • Тестування та аудит — Foundry, Mock messaging, симуляція finality затримок.
  • Документація — опис архітектури, процедура деплою, сценарії rollback.
  • Підтримка після запуску — моніторинг, хотфікси, оновлення при хардфорках.

Отримайте консультацію з архітектури cross-chain синхронізації — зв'яжіться з нами для обговорення вашого проєкту.

Орієнтири за термінами

  • Базова синхронізація (два chain, Axelar, ordered delivery) — 3–4 тижні.
  • Merkle-batched sync з off-chain worker — 8–12 тижнів.
  • Trustless ZK light client інтеграція (Succinct/Herodotus) — 12–20 тижнів.

Точну вартість та терміни оцінюємо індивідуально, виходячи з кількості мереж, частоти оновлень та рівня децентралізації. Зв'яжіться з нами для отримання попередньої оцінки.

Розробка крос-чейн мостів: архітектура, ризики, реалізація

Ми займаємося розробкою крос-чейн мостів та крос-чейн рішень під ключ. Знаємо, як уникнути катастроф. Кілька років тому міст Binance BNB Chain втратив $570M — атакуючий підробив Merkle proof у BSC's native bridge. Того ж року Wormhole втратив $320M (Wormhole bridge exploit): верифікація підписів guardians була обійдена через баг у Solana's secp256k1 program. Ronin Bridge — $625M. Це не випадковості. Мости — найбільш атакована інфраструктура в Web3, тому що вони агрегують ліквідність і мають складну міжланцюгову логіку верифікації. Замовте консультацію, щоб отримати захист від подібних вразливостей уже на етапі проєктування.

Чому мости ламаються: три архітектурних класи вразливостей

Проблема finality та reorg. Ethereum має probabilistic finality до Merge та economic finality після (2 епохи, ~12 хвилин). Bitcoin — ~6 блоків (~60 хвилин). Solana — ~400ms. Якщо міст мінтить wrapped tokens на цільовому ланцюгу одразу після 1-2 блоків на вихідному — reorg на 3+ блоків дозволяє атакуючому отримати токени на цільовому ланцюгу при відкаті транзакції на вихідному. Правильний захист: чекати finality confirmation, специфічний для кожного ланцюга. Для Ethereum — 64+ блоків (2 епохи). Не один блок.

Верифікація підписів. Більшість мостів використовують multisig committee або threshold signature: N з M валідаторів повинні підписати подію з вихідного ланцюга. Wormhole використовував 13 з 19 guardians. Атака була не на самі ключі — атакуючий знайшов вразливість у коді верифікації підписів на Solana, де застарілий sysvar account приймався як валідний без перевірки. On-chain верифікація підписів — складніше, ніж здається.

Lock-and-Mint vs Burn-and-Mint. У Lock-and-Mint моделі оригінальні токени заблоковані в контракті на вихідному ланцюгу, wrapped токени мінтяться на цільовому. Контракт на вихідному ланцюгу — honeypot: там весь locked TVL. Один баг в unlock логіці — і всі кошти доступні атакуючому без необхідності щось робити на цільовому ланцюгу. Native Burn-and-Mint (як у Circle CCTP для USDC) безпечніший: немає locked pool. Правильно спроектований міст з rate limiting може зекономити до $500k потенційних втрат при атаці.

Як обрати messaging layer під ваш проект?

LayerZero — протокол передачі довільних повідомлень між ланцюгами. Не міст сам по собі, а інфраструктура для побудови мостів та omnichain додатків.

Архітектура: Endpoint контракт на кожному ланцюгу, Executor (доставляє повідомлення на цільовий ланцюг), DVN (Decentralized Verifier Network — верифікує факт транзакції на вихідному ланцюгу).

Source chain:
  OApp.send() → Endpoint.send() → [emits packet event]

Destination chain:
  DVN verifies packet hash → Executor calls Endpoint.deliver() → OApp.lzReceive()

У v2 розробник обирає DVN: офіційні (LayerZero Labs, Google Cloud, Polyhedra), або кастомні. Можна налаштувати required DVN + optional DVN: повідомлення приймається тільки якщо всі required DVN підтвердили. Це дозволяє будувати мости з різним trade-off між безпекою та швидкістю.

OApp (Omnichain Application) — базовий контракт для інтеграції. Наслідуєш OApp, реалізуєш _lzSend та _lzReceive. Для токен-мостів — OFT (Omnichain Fungible Token) стандарт з коробки робить burn-on-source / mint-on-destination. LayerZero OFT інтегрується в 3 рази швидше, ніж кастомний міст.

Wormhole використовує мережу з 19 guardians (великі компанії типу Jump Crypto, Everstake тощо), кожен з яких підписує спостережувані події. Threshold — 13 з 19. VAA (Verified Action Approval) — підписане повідомлення, яке приймається на цільовому ланцюгу.

Головна відмінність від LayerZero: Wormhole має нативну підтримку не-EVM: Solana, Aptos, Sui, Algorand, Near. Для проектів, яким потрібен міст між Ethereum та Solana — Wormhole часто єдиний production-ready варіант.

Після експлойту Wormhole додав Native Token Transfers (NTT) — архітектура без locked pool, аналогічна CCTP. NTT + Hub-and-Spoke модель: надлишкова ліквідність не накопичується на одному ланцюгу.

Relay архітектура та light client верифікація

Relay-based мости (IBC в Cosmos ecosystem, Succinct's Telepathy) верифікують стан вихідного ланцюга через light client на цільовому ланцюгу. Для EVM→EVM: контракт на Ethereum зберігає та верифікує BLS-підписи блоків вихідного ланцюга.

ZK-bridges — наступний рівень. Succinct, Polyhedra zkBridge, Electron Labs генерують ZK-proof коректності консенсусу вихідного ланцюга. На цільовому ланцюгу верифікується proof, не підписи валідаторів. Усуває довіру до committee. Але верифікація ZK-proof дорога по газу — від 200k до 500k gas на Ethereum L1 залежно від системи доведень. ZK-bridge безпечніший за relay-based міст, але вимагає в 2-3 рази більше газу на верифікацію.

Характеристика LayerZero Wormhole IBC (Cosmos) ZK-bridge
EVM підтримка Всі EVM + Solana, Aptos Всі EVM + Solana, Aptos, Sui Cosmos chains Зростає
Модель довіри DVN (обирається) 13/19 guardians Light client ZK proof
Latency 1-5 хв 1-5 хв ~30 сек 5-30 хв
Gas на верифікацію ~100-150k ~150-200k ~200-300k 200-500k

Що потрібно врахувати до першого рядка коду?

Обов'язкові компоненти будь-якого production мосту:

Паузер. Emergency pause функція, що викликається мультисигом або автоматично при виявленні аномалії (підозрілий обсяг, нехарактерна послідовність викликів). Більшість зламаних мостів не мали або не використовували паузер вчасно.

Rate limiting. Обмеження обсягу виводу за часовий інтервал. Якщо атакуючий дренує міст — rate limit дає час на реакцію. Реалізація: transferVolume[currentEpoch] += amount; require(transferVolume[currentEpoch] <= epochLimit).

Finality checks. Специфічні для кожного ланцюга. Не "почекати 1 блок", а використовувати finality API або чекати потрібної кількості confirmations.

Relayer моніторинг. Автономний сервіс, який слідкує за станом обох сторін мосту. Якщо повідомлення відправлено але не доставлено за N хвилин — alert. Якщо locked balance розходиться з totalSupply wrapped token — critical alert.

Що входить в розробку крос-чейн мосту

Ми реалізуємо проект під ключ і передаємо повний набір результатів. Наші замовники отримують:

Етап Результат
Аналіз та вибір архітектури Технічне завдання, обґрунтування вибору messaging layer
Проектування смарт-контрактів Специфікація, діаграми потоків, опис моделі довіри
Розробка та тестування Вихідний код, unit/інтеграційні тести, симуляція cross-chain сценаріїв
Аудит безпеки Звіт зовнішніх аудиторів, виправлені вразливості
Деплой та моніторинг Контракти в mainnet, дашборд з алертами, документація для експлуатації
Підтримка після запуску 3 місяці гарантійної підтримки, допомога з експлуатацією

Строки та вартість

Простий ERC-20 міст поверх існуючого messaging layer (LayerZero OFT або Wormhole NTT) — 4-8 тижнів включаючи тестування та аудит. Кастомний міст з власною верифікацією, multi-chain підтримкою, rate limiting, моніторингом — 12-24 тижні. ZK-bridge з кастомними proof circuits — від 6 місяців.

Аудит мосту займає більше часу, ніж аудит звичайного DeFi протоколу: потрібно тестувати cross-chain сценарії, finality edge cases, атаки через reorg. Мінімум 3-4 тижні для production-grade рішення.

Вартість розраховується індивідуально після оцінки обсягу робіт. Маємо понад 5 років досвіду в індустрії, реалізували 15+ проектів у галузі блокчейн-інфраструктури. Свяжитесь с нами для детальної консультації — оцінимо ваш проект і запропонуємо оптимальну архітектуру мосту.