Крос-чейн взаємодія — вузьке місце будь-якої multi-chain архітектури. Ми щодня стикаємося з кейсами, коли ізоляція блокчейнів гальмує продукт: токени заблоковані в одній мережі, користувачі не можуть використовувати DeFi на іншій. Історія знає дорогі помилки — зломи мостів Wormhole, Ronin, Nomad на суми, що вимірюються мільярдами доларів. Розкажемо, як правильно будувати крос-чейн месенджинг на трьох топових протоколах: LayerZero, Wormhole та Axelar. Крос-чейн месенджинг — це не просто пересилання даних, це архітектура довіри між ізольованими середовищами.
Чому крос-чейн месенджинг — це складно?
Проблема не у відправці даних — технічно це тривіально. Складність у довірі: як переконатися, що повідомлення на destination chain валідне, а не підроблене? Кожен протокол вирішує це по-своєму. LayerZero використовує configurable DVN, Wormhole — Guardian мережу з 19 нод, Axelar — валідатори Cosmos. Вибір визначає не тільки швидкість (від 15 секунд до 5 хвилин), але й безпеку.
LayerZero: Omnichain messaging
LayerZero v2 — найпопулярніший протокол для EVM-to-EVM та EVM-to-non-EVM, що підтримує понад 50 мереж. Архітектура розділяє верифікацію та виконання: DVN (Decentralized Verifier Networks) підтверджують повідомлення, Executors виконують його на destination chain. Це дозволяє налаштовувати security threshold: наприклад, потрібно 2 з 3 (LayerZero Labs DVN + Google Cloud DVN + Polyhedra DVN).
Як влаштований протокол
Повідомлення в LayerZero проходить шлях:
Source Chain: OApp.send() → EndpointV2.send() → emit PacketSent event
↓
DVNs моніторять подію
DVNs верифікують на destination
↓
Destination Chain: EndpointV2 отримує верифікації → Executor викликає lzReceive()
Написання OApp (Omnichain Application)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { OApp, Origin, MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol";
import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol";
contract CrossChainMessenger is OApp {
using OptionsBuilder for bytes;
event MessageReceived(uint32 srcEid, bytes32 sender, string message);
constructor(address _endpoint, address _owner)
OApp(_endpoint, _owner) {}
function sendMessage(
uint32 dstEid,
string calldata message,
bytes calldata options
) external payable {
bytes memory payload = abi.encode(message);
bytes memory lzOptions = OptionsBuilder.newOptions()
.addExecutorLzReceiveOption(200_000, 0);
MessagingFee memory fee = _quote(dstEid, payload, lzOptions, false);
require(msg.value >= fee.nativeFee, "Insufficient fee");
_lzSend(dstEid, payload, lzOptions, MessagingFee(msg.value, 0), payable(msg.sender));
}
function _lzReceive(
Origin calldata origin,
bytes32 guid,
bytes calldata payload,
address executor,
bytes calldata extraData
) internal override {
string memory message = abi.decode(payload, (string));
emit MessageReceived(origin.srcEid, origin.sender, message);
}
function quoteSend(
uint32 dstEid,
string calldata message
) external view returns (uint256 nativeFee) {
bytes memory payload = abi.encode(message);
bytes memory options = OptionsBuilder.newOptions()
.addExecutorLzReceiveOption(200_000, 0);
MessagingFee memory fee = _quote(dstEid, payload, options, false);
return fee.nativeFee;
}
}
Що таке OFT і для чого він потрібен?
Стандарт OFT дозволяє токену існувати на кількох мережах без wrapped версій: на source chain токени спалюються, на destination chain карбуються. Загальний supply залишається константним. Жодних liquidity pool'ів, жодного lock-and-mint. Це знижує ризики impermanent loss і скорочує кількість кроків для користувача.
import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol";
contract MyOFTToken is OFT {
constructor(
string memory name,
string memory symbol,
address lzEndpoint,
address owner
) OFT(name, symbol, lzEndpoint, owner) {}
}
Wormhole: універсальний месенджинг
Wormhole v2 підтримує 30+ мереж: Ethereum, Solana, Cosmos, Aptos, Sui. Архітектура — Guardian network з 19 нод (PoA), які публікують VAA (Verifiable Action Approval) — підписане підтвердження події. Середня вартість газу для VAA на Ethereum — $0.5–$2, а latency становить 15–60 секунд.
Core механіка VAA
import {
getSignedVAAWithRetry,
parseSequenceFromLogEth,
CHAIN_ID_ETH,
} from "@certusone/wormhole-sdk";
import { ethers } from "ethers";
const coreBridge = new ethers.Contract(WORMHOLE_ETH_BRIDGE, BRIDGE_ABI, signer);
const tx = await coreBridge.publishMessage(0, payload, 1);
const receipt = await tx.wait();
const sequence = parseSequenceFromLogEth(receipt, WORMHOLE_ETH_BRIDGE);
const { vaaBytes } = await getSignedVAAWithRetry(
["https://wormhole-v2-mainnet-api.certus.one"],
CHAIN_ID_ETH,
emitterAddress,
sequence,
{ retryTimeout: 1000, retryAttempts: 60 }
);
// vaaBytes містить підписаний VAA для редиму на destination chain
Wormhole vs LayerZero
| Критерій | LayerZero v2 | Wormhole v2 |
|---|---|---|
| Підтримувані мережі | ~50 (EVM-focused) | 30+ (включаючи non-EVM) |
| Модель безпеки | Configurable DVN | Guardian PoA (19 нод) |
| Токен стандарт | OFT | NTT / xERC20 |
| Solana підтримка | Так | Так (нативно) |
| Developer tooling | Відмінне | Добре |
| Latency | 2–5 хв (EVM→EVM) | 15–60 сек |
Якщо потрібно EVM-to-EVM — обирайте LayerZero v2. Якщо в проєкті Solana, Aptos або Cosmos — дивіться на Wormhole.
Axelar: General Message Passing
Axelar — Cosmos-based blockchain як routing layer. GMP (General Message Passing) для довільних викликів смарт-контрактів. Сильний для Cosmos↔EVM briding через IBC.
import { AxelarExecutable } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol";
import { IAxelarGasService } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol";
contract CrossChainNFTBridge is AxelarExecutable {
IAxelarGasService immutable gasService;
constructor(address gateway, address _gasService)
AxelarExecutable(gateway) {
gasService = IAxelarGasService(_gasService);
}
function bridgeNFT(
string calldata destChain,
string calldata destContract,
uint256 tokenId
) external payable {
bytes memory payload = abi.encode(msg.sender, tokenId);
gasService.payNativeGasForContractCall{value: msg.value}(
address(this), destChain, destContract, payload, msg.sender
);
gateway.callContract(destChain, destContract, payload);
// _burnNFT logic
}
function _execute(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) internal override {
(address recipient, uint256 tokenId) = abi.decode(payload, (address, uint256));
// _mintNFT logic
}
}
Порівняння протоколів за безпекою
| Протокол | Модель довіри | Ризики |
|---|---|---|
| LayerZero | DVN (configurable) | Компрометація DVN |
| Wormhole | Guardian (19 nodes) | Змова Guardians |
| Axelar | Cosmos validators | 1/3 slashing condition |
Що входить у розробку крос-чейн рішення
- Аналітика: вибір протоколу, проєктування архітектури, оцінка gas costs.
- Розробка: смарт-контракти (Solidity/Rust), off-chain relay services, frontend інтеграція.
- Тестування: unit тести, integration тести на testnet, fuzzing з Echidna.
- Аудит: внутрішній код-рев’ю, залучення зовнішніх аудиторів (Zellic, OtterSec).
- Деплой: налаштування mainnet, конфігурація моніторингу (Tenderly, Etherscan API).
- Документація: API reference, deploy guide, troubleshooting.
Як забезпечити безпеку крос-чейн передачі?
Rate limiting — обмежте обсяг коштів: якщо протокол скомпрометований, збиток буде обмеженим. Pause механізм з multisig (без timelock для екстрених випадків). Trusted path validation — перевіряйте, що повідомлення прийшло саме з вашого контракту.
Як вибрати протокол для крос-чейн месенджингу?
LayerZero — якщо будуєте omnichain токен (OFT), omnichain NFT, або EVM-to-EVM data messaging з гнучкою безпекою.
Wormhole — якщо потрібні Solana, Aptos або Sui, або максимально широке покриття мереж.
Axelar — якщо в архітектурі є Cosmos chains, або потрібен high-level GMP з абстракцією від мереж.
Ми інтегрували крос-чейн компоненти в 15+ проєктів — від NFT bridge до DeFi aggregator. Отримайте консультацію з архітектури крос-чейн рішення — ми проаналізуємо ваші вимоги та запропонуємо оптимальний протокол. Замовте розробку безпечного мосту під ваш проєкт.







