Cross-Chain Messaging Development: LayerZero, Wormhole, Axelar

Cross-chain interaction is the bottleneck of any multi-chain architecture. We encounter daily cases where blockchain isolation hinders a product: tokens locked in one network, users unable to use DeFi on another. History remembers costly mistakes — Wormhole, Ronin, Nomad bridge hacks totaling billio

Blockchain Development Services

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1441
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    998
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1267
  • image_logo-advance_0.webp
    B2B Advance company logo design
    713
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    1003

Cross-chain interaction is the bottleneck of any multi-chain architecture. We encounter daily cases where blockchain isolation hinders a product: tokens locked in one network, users unable to use DeFi on another. History remembers costly mistakes — Wormhole, Ronin, Nomad bridge hacks totaling billions of dollars. Let's explore how to build cross-chain messaging correctly using three top protocols: LayerZero, Wormhole, and Axelar. Cross-chain messaging is not just data transfer; it's an architecture of trust between isolated environments.

Why is cross-chain messaging hard?

The problem isn't sending data — technically that's trivial. The difficulty lies in trust: how to ensure that a message on the destination chain is valid and not forged? Each protocol solves this differently. LayerZero uses configurable DVNs, Wormhole uses a Guardian network of 19 nodes, Axelar uses Cosmos validators. The choice determines not only speed (from 15 seconds to 5 minutes) but also security.

LayerZero: Omnichain messaging

LayerZero v2 is the most popular protocol for EVM-to-EVM and EVM-to-non-EVM, supporting over 50 networks. The architecture separates verification and execution: DVNs (Decentralized Verifier Networks) confirm the message, Executors execute it on the destination chain. This allows configuring a security threshold: e.g., require 2 out of 3 (LayerZero Labs DVN + Google Cloud DVN + Polyhedra DVN).

How the protocol works

A message in LayerZero goes through the following path:

Source Chain: OApp.send() → EndpointV2.send() → emit PacketSent event ↓ DVNs monitor the event DVNs verify on destination ↓ Destination Chain: EndpointV2 receives verifications → Executor calls lzReceive() 

Writing an 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; } } 

What is OFT and why is it needed?

The OFT standard allows a token to exist on multiple networks without wrapped versions: tokens are burned on the source chain and minted on the destination chain. The total supply remains constant. No liquidity pools, no lock-and-mint. This reduces impermanent loss risks and decreases the number of steps for the user.

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: Universal messaging

Wormhole v2 supports 30+ networks: Ethereum, Solana, Cosmos, Aptos, Sui. Its architecture is a Guardian network of 19 nodes (PoA) that publish VAAs (Verifiable Action Approvals) — signed confirmations of events. Average gas cost for a VAA on Ethereum is $0.5–$2, and latency is 15–60 seconds.

Core VAA mechanics

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 contains the signed VAA for redemption on the destination chain 

Wormhole vs LayerZero

Criteria LayerZero v2 Wormhole v2
Supported networks ~50 (EVM-focused) 30+ (including non-EVM)
Security model Configurable DVN Guardian PoA (19 nodes)
Token standard OFT NTT / xERC20
Solana support Yes Yes (native)
Developer tooling Excellent Good
Latency 2–5 min (EVM→EVM) 15–60 sec

If you need EVM-to-EVM — choose LayerZero v2. If your project includes Solana, Aptos, or Cosmos — look at Wormhole.

Axelar: General Message Passing

Axelar is a Cosmos-based blockchain acting as a routing layer. GMP (General Message Passing) allows arbitrary smart contract calls. It is strong for Cosmos↔EVM bridging via 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 } } 

Protocol security comparison

Protocol Trust model Risks
LayerZero DVN (configurable) DVN compromise
Wormhole Guardian (19 nodes) Guardian collusion
Axelar Cosmos validators 1/3 slashing condition

What is included in cross-chain solution development

  • Analytics: protocol selection, architecture design, gas cost estimation.
  • Development: smart contracts (Solidity/Rust), off-chain relay services, frontend integration.
  • Testing: unit tests, integration tests on testnet, fuzzing with Echidna.
  • Audit: internal code review, external auditors (Zellic, OtterSec).
  • Deployment: mainnet setup, monitoring configuration (Tenderly, Etherscan API).
  • Documentation: API reference, deploy guide, troubleshooting.

How to ensure cross-chain transfer security?

Rate limiting — cap the amount of funds: if the protocol is compromised, the damage is limited. Pause mechanism with multisig (no timelock for emergencies). Trusted path validation — check that the message came from your contract.

How to choose a protocol for cross-chain messaging?

LayerZero — if you are building an omnichain token (OFT), omnichain NFT, or EVM-to-EVM data messaging with flexible security.

Wormhole — if you need Solana, Aptos, or Sui, or the widest network coverage.

Axelar — if your architecture includes Cosmos chains, or you need high-level GMP with network abstraction.

We have integrated cross-chain components in 15+ projects — from NFT bridges to DeFi aggregators. Get a consultation on cross-chain solution architecture — we will analyze your requirements and suggest the optimal protocol. Order the development of a secure bridge for your project.