Інтеграція з CCIP (Chainlink Cross-Chain)

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Інтеграція з CCIP (Chainlink Cross-Chain)
Середній
~3-5 днів
Часті запитання

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

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

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

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

Інтеграція з Chainlink CCIP (Cross-Chain Interoperability Protocol)

CCIP — протокол мосту та мессенджингу від Chainlink, побудований на їхній децентралізованій мережі оракулів. Головне позиціонування: безпека рівня підприємства з незалежною Risk Management Network на вершині основної DON.

Архітектура безпеки

CCIP використовує два незалежні шари валідації:

  • Primary DON — Chainlink мережа оракулів, передає та валідує повідомлення
  • Risk Management Network (ARM) — незалежна мережа нод, які моніторять аномалії та можуть блокувати підозрілі повідомлення

Подвійний захист: навіть якщо Primary DON скомпрометована, ARM може зупинити шахрайську транзакцію. Цей дизайн позиціонує CCIP для фінансових установ з високими вимогами безпеки.

Відправка повідомлень та токенів

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import {IRouterClient} from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol";
import {Client} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol";
import {IERC20} from "@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol";

contract CCIPSender {
    IRouterClient public router;
    LinkTokenInterface public linkToken;
    
    constructor(address _router, address _link) {
        router = IRouterClient(_router);
        linkToken = LinkTokenInterface(_link);
    }
    
    function sendMessage(
        uint64 destinationChainSelector,
        address receiver,
        bytes calldata data,
        address tokenAddress,
        uint256 tokenAmount
    ) external returns (bytes32 messageId) {
        
        Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
        tokenAmounts[0] = Client.EVMTokenAmount({
            token: tokenAddress,
            amount: tokenAmount,
        });
        
        Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
            receiver: abi.encode(receiver),
            data: data,
            tokenAmounts: tokenAmounts,
            extraArgs: Client._argsToBytes(
                Client.EVMExtraArgsV1({ gasLimit: 200_000 })
            ),
            feeToken: address(linkToken),
        });
        
        uint256 fee = router.getFee(destinationChainSelector, message);
        linkToken.approve(address(router), fee);
        
        IERC20(tokenAddress).approve(address(router), tokenAmount);
        
        messageId = router.ccipSend(destinationChainSelector, message);
        
        emit MessageSent(messageId, destinationChainSelector, receiver, fee);
    }
}

Отримання повідомлень

import {CCIPReceiver} from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol";

contract CCIPReceiver is CCIPReceiver {
    mapping(uint64 => address) public allowedSenders;
    
    constructor(address router) CCIPReceiver(router) {}
    
    function _ccipReceive(
        Client.Any2EVMMessage memory message
    ) internal override {
        address sender = abi.decode(message.sender, (address));
        
        require(
            allowedSenders[message.sourceChainSelector] == sender,
            "Unknown sender"
        );
        
        for (uint i = 0; i < message.destTokenAmounts.length; i++) {
            address token = message.destTokenAmounts[i].token;
            uint256 amount = message.destTokenAmounts[i].amount;
        }
        
        (address recipient, uint256 action) = abi.decode(
            message.data,
            (address, uint256)
        );
        
        _executeAction(recipient, action, message.destTokenAmounts);
    }
}

Chain Selectors

Chain Selector
Ethereum Mainnet 5009297550715157269
Polygon 4051577828743386545
Avalanche 6433500567565415381
Arbitrum 4949039107694359620
Optimism 3734403246176062136
Base 15971525489660198786

Оплата нативним токеном замість LINK

Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
    receiver: abi.encode(receiver),
    data: data,
    tokenAmounts: tokenAmounts,
    extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({ gasLimit: 200_000 })),
    feeToken: address(0), // нативний токен
});

uint256 fee = router.getFee(destinationChainSelector, message);
messageId = router.ccipSend{value: fee}(destinationChainSelector, message);

CCIP хороший для: enterprise проектів з вимогами аудиту безпеки; DeFi протоколів з великим TVL де репутація Chainlink важлива; коли вже використовуєте Chainlink Price Feeds — CCIP добре інтегрується.

Інтеграція CCIP — 2-3 тижні. Офіційна документація та приклади високої якості, Chainlink підтримує enterprise клієнтів.