Розробка кросс-чейн мессенджингу (LayerZero, Wormhole, Axelar)
Interoperability — одна з невирішених проблем індустрії блокчейна. Ethereum не знає, що відбувається на Solana. Arbitrum ізольований від Cosmos. Кожен кросс-чейн міст — це окрема точка довіри, і історія показує, що це коштує дорого: Wormhole ($325M хак, 2022), Ronin ($625M, 2022), Nomad ($190M, 2022). Незважаючи на це, кросс-чейн мессенджинг — фундаментальна інфраструктура для будь-якого мультичейн продукту. Розберемо три основні протоколи та як правильно з ними працювати.
LayerZero: Omnichain мессенджинг
LayerZero v2 — найпопулярніший протокол для EVM-to-EVM та EVM-to-non-EVM мессенджингу. Архітектура заснована на розподілі відповідальності: DVN (Decentralized Verifier Networks) верифікують повідомлення, Executors виконують їх на цільовому чейні.
Як працює протокол
Повідомлення в LayerZero проходить шлях:
Source Chain: OApp.send() → EndpointV2.send() → emit PacketSent event
↓
DVNs моніторять подію
DVNs верифікують на цільовому
↓
Destination Chain: EndpointV2 отримує верифікацію → Executor викликає lzReceive()
DVN — верифікатори, які читають вихідний чейн та атестують коректність пакету на цільовому чейні. Можна налаштувати Required DVN + Optional DVN + threshold. Приклад: потрібно 2 з 3 (LayerZero Labs DVN + Google Cloud DVN + Polyhedra DVN).
Написання 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, // destination endpoint ID (наприклад, 30101 = Ethereum)
string calldata message,
bytes calldata options // ліміт газу для execution на цільовому
) external payable {
bytes memory payload = abi.encode(message);
// Опції: скільки газу виділити на цільовому чейні
bytes memory lzOptions = OptionsBuilder.newOptions()
.addExecutorLzReceiveOption(200_000, 0); // 200k газу, 0 msg.value
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: Omnichain Fungible Token
Найпопулярніший use case LayerZero — кросс-чейн токен. OFT стандарт дозволяє токену нативно існувати на кількох мережах без wrapped версій:
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) {}
}
На вихідному чейні токени спалюються, на цільовому чейні випускаються. Загальна пропозиція залишається постійною. Немає wrapped токенів, немає пулів ліквідності для bridging.
Wormhole: універсальний мессенджинг
Wormhole v2 підтримує 30+ мереж включаючи Ethereum, Solana, Cosmos chains, Aptos, Sui — ширше покриття, ніж LayerZero. Архітектура: Guardian мережа з 19 нод (PoA) публікує VAA (Verifiable Action Approval) — підписане підтвердження події на вихідному чейні.
Основна механіка VAA
import {
getSignedVAAWithRetry,
parseSequenceFromLogEth,
CHAIN_ID_ETH,
CHAIN_ID_SOLANA,
} from "@certusone/wormhole-sdk";
import { ethers } from "ethers";
// 1. Публікуємо повідомлення на ETH стороні
const coreBridge = new ethers.Contract(WORMHOLE_ETH_BRIDGE, BRIDGE_ABI, signer);
const tx = await coreBridge.publishMessage(
0, // nonce
payload, // bytes дані
1 // consistency level (вимога фіналізації)
);
// 2. Отримуємо sequence з receipt
const receipt = await tx.wait();
const sequence = parseSequenceFromLogEth(receipt, WORMHOLE_ETH_BRIDGE);
// 3. Чекаємо VAA від Guardians (зазвичай 15-60 секунд)
const { vaaBytes } = await getSignedVAAWithRetry(
["https://wormhole-v2-mainnet-api.certus.one"],
CHAIN_ID_ETH,
emitterAddress,
sequence,
{ retryTimeout: 1000, retryAttempts: 60 }
);
// 4. Redeem на цільовому чейні (наприклад, Solana)
// vaaBytes містить підписаний VAA, передайте програмі
// на Solana для верифікації та виконання
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 блокчейн, який виступає як routing layer між мережами. GMP (General Message Passing) — протокол для довільних викликів смарт-контрактів на цільовому чейні.
import { AxelarExecutable } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol";
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 CrossChainNFTBridge is AxelarExecutable {
IAxelarGasService immutable gasService;
constructor(address gateway, address _gasService)
AxelarExecutable(gateway) {
gasService = IAxelarGasService(_gasService);
}
function bridgeNFT(
string calldata destChain, // "Polygon", "Avalanche", тощо
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(msg.sender, tokenId);
}
// Викликається Axelar relayer на цільовому чейні
function _execute(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) internal override {
(address recipient, uint256 tokenId) = abi.decode(payload, (address, uint256));
_mintNFT(recipient, tokenId);
}
}
Axelar особливо сильний для Cosmos↔EVM bridging — нативна IBC підтримка дозволяє маршрутизувати через всю Cosmos екосистему.
Безпека кросс-чейн протоколів
Кросс-чейн мессенджинг — висько-ризикова область. Кілька обов'язкових практик:
Rate limiting — обмежте обсяг коштів, які можна перевести за період. Якщо протокол скомпрометований, це обмежує потенційну шкоду.
mapping(uint256 => uint256) public dailyVolume; // день → обсяг
function _checkRateLimit(uint256 amount) internal {
uint256 today = block.timestamp / 1 days;
dailyVolume[today] += amount;
require(dailyVolume[today] <= DAILY_LIMIT, "Daily limit exceeded");
}
Pause механізм — emergency pause на обох сторонах мосту. Контролюється multisig з коротким timelock (або без нього — для надзвичайних ситуацій).
Trusted path validation — на цільовому чейні перевірте, що повідомлення прийшло саме з вашого контракту на вихідному чейні, а не від довільного дзвінка.
Уникайте зберігання великих сум в bridge контрактах — модель liquidity pool (lock-and-mint) створює величезний honeypot. Mint-and-burn (як у OFT) безпечніше.
Коли вибрати який протокол
LayerZero — будуєте omnichain токен (OFT), omnichain NFT, або EVM-to-EVM data messaging з гнучкою конфігурацією безпеки.
Wormhole — потрібен Solana, Aptos, Sui, або максимальне покриття мереж.
Axelar — архітектура має Cosmos chains, або потрібен high-level GMP абстрагований від конкретних мереж.
Для production систем з реальними коштами: аудит кросс-чейн логіки обов'язковий, команда з досвідом bridge безпеки (Zellic, OtterSec, Trail of Bits).







