Інтеграція з 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 клієнтів.







