Long Term R&D: Integration with the Ethereum Network

Hi everyone, we are Rocklabs and have been exploring this direction for a while now, would love to provide some input here:

Project Omnic basically implemented Phase 1, which enables message passing between EVM chains and the Internet Computer, the pic below shows how it works:

There are 3 major components:

  1. On each EVM chain, there is a gateway contract, responsible for receiving crosschain message requests from application contracts, message hashes are inserted into a Merkle tree. On the other hand, gateway contract is responsible for receiving crosschain messages from other chains, and notify application contracts on the local chain about the message. Gateway contracts are controlled by the Omnic Proxy Canister on the IC via threshold ECDSA, only Proxy Canister can instruct gateway contracts to process crosschain messages.
  2. Offchain relayer fetches crosschain messages from EVM chains, and generate a Merkle proof for each message, then submit the message with merkle proof to the Omnic Proxy Canister. The relayer is completely permissionless, which means everyone can run a relayer, this is because the Proxy canister will verify every message so we don’t have to trust the realyer.
  3. Omnic Proxy Canister is the core, responsible for verifying and handling crosschain messages, the proxy canister controls several gateway canisters on the IC, each EVM chain has a dedicated gateway canister responsible for periodically fetching crosschain message merkle tree root via canister HTTP outcalls, the merkle root is then used for crosschain message verification.
    If a crosschain message & proof submitted by the relayer passed the verification, then proxy canister will route the message to the destination chain, if the destination is IC, it’ll call the application canister to notify the message, if the destination is another EVM chain, it’ll send a tx to the destination chain, instruct the gateway contract on the destination chain to notify the application contract about the message.

Trust issue: the root of trust in this system is the validity of the merkle tree root hash in the gateway canister, to prevent single point of failure, gateway canister will choose several RPC providers from a RPC pool, then fetch the root hash from these multiple different RPC providers and compare the result to ensure the validity of the root hash.
Why not directly fetch crosschain messages via canister HTTP outcall: in the above design, we use an offchain relayer to submit crosschain messages and proofs, then verify messages in canister, the main reason is cycle cost issue, fetching crosschain messages via HTTP outcall can be expensive, especially if you want to eliminate the single point failure issue you have to fetch a crosschain message from multiple RPC providers, the cycle cost can be expensive.

The implementation repo is here: GitHub - rocklabs-io/omnic: Omnic protocol repo, and we’ve already built a token bridge on top of Omnic, users will be able to bridge token from EVM chains to the IC.
Internal test version of the token bridge: https://test.omnic.network, explorer: https://scan.omnic.network, currently supporting Ethereum Goerli Testnet and Polygon Mumbai Test. We’ll announce the official public testnet soon, the data in the internal test version will be cleared by then.

Note: Omnic is for crosschain message passing, if you only want to query data from or send transactions to EVM chains, we have a library called ic-web3: GitHub - rocklabs-io/ic-web3: Ethereum RPC client for canisters on the IC

We welcome comments and suggestions from the community! We’d love to provide help on the Ethereum Integration direction!