Omnic: Crosschain messaging powered by the Internet Computer

Hi devs, we are Rocklabs, today we opensourced Omnic.
Omnic is a crosschain messaging protocol powered by the Internet Computer’s threshold ECDSA and outbound HTTP call features, with Omnic, we can have programmability built into the message passing process.
This is an overview of Omnic:

The code is at: GitHub - rocklabs-io/omnic: Omnic protocol repo, we are looking forward to the feedback from the community!

We’ve built a crosschain token bridge based on Omnic, and will release the omnic bridge demo videos soon.

  1. Can app developers run their own Omnic relayer?
  2. Is Pocket Network (POKT) supported as an RPC provider?
  3. This architecture seems similar to other cross-chain protocols like IBC, LayerZero, etc… What are the advantages/disadvantages to using Omnic over those other protocols?
  4. How does Omnic compare to Terabethia?
1 Like

This looks amazing! Can’t wait to dive in. Any chance of a Motoko listener?

  1. Yes. We’ll run an official relayer at the early stage, but in theory relayers can be totally permissionless, and relayers can get reward once the incentive mechanism is on.
  2. The proxy canister fetches merkle roots from multiple RPC providers and then aggregate the result, this is to prevent single point of failure, so the goal is to diversify RPC providers, Pocket Network can definitely be one of the RPC providers.
  3. Powered by IC’s threshold ECDSA, the whole messaging process is trustless, and another important feature is we can have programmability in the messaging process, devs can build their own message processing logic into canisters, and a canister on IC can control and coordinate all App contracts on other chains, this effectively makes IC the layer0 of the multichain ecosystem.
  4. Omnic is a trustless construction powered by t-ECDSA and canister outbound HTTP calls.

Yes of course!
Application developers can build their App canisters with Rust or Motoko, as long as the canister implements the handle_message function:

type Result = variant { Ok : bool; Err : text };
service : {
  handle_message : (nat32, vec nat8, nat32, vec nat8) -> (Result);

the 4 params are: message_origin_chain, sender_on_origin_chain, nonce, message_body.