Expand description
Pallet for committing outbound messages for delivery to Ethereum
§Overview
Messages come either from sibling parachains via XCM, or BridgeHub itself
via the snowbridge-pallet-system-v2
:
snowbridge_outbound_queue_primitives::v2::EthereumBlobExporter::deliver
snowbridge_pallet_system_v2::Pallet::send
The message submission pipeline works like this:
- The message is first validated via the implementation for
[
snowbridge_outbound_queue_primitives::v2::SendMessage::validate
] - The message is then enqueued for later processing via the implementation for
[
snowbridge_outbound_queue_primitives::v2::SendMessage::deliver
] - The underlying message queue is implemented by
Config::MessageQueue
- The message queue delivers messages to this pallet via the implementation for
[
frame_support::traits::ProcessMessage::process_message
] - The message is processed in
Pallet::do_process_message
: a. Convert toOutboundMessage
, and stored into theMessages
vector storage b. ABI-encode theOutboundMessage
and store the committed Keccak256 hash inMessageLeaves
c. GeneratePendingOrder
with assigned nonce and fee attached, stored into thePendingOrders
map storage, with nonce as the key d. Increment nonce and update theNonce
storage - At the end of the block, a merkle root is constructed from all the leaves in
MessageLeaves
. At the beginning of the next block, bothMessages
andMessageLeaves
are dropped so that state at each block only holds the messages processed in that block. - This merkle root is inserted into the parachain header as a digest item
- Offchain relayers are able to relay the message to Ethereum after:
a. Generating a merkle proof for the committed message using the
prove_message
runtime API b. Reading the actual message content from theMessages
vector in storage - On the Ethereum side, the message root is ultimately the thing being verified by the Beefy light client.
- When the message has been verified and executed, the relayer will call the extrinsic
submit_delivery_receipt
to: a. Verify the message with proof for a transaction receipt containing the event log, same as the inbound queue verification flow b. Fetch the pending order by nonce of the message, pay reward with fee attached in the order c. Remove the order fromPendingOrders
map storage by nonce
§Extrinsics
Call::submit_delivery_receipt
: Submit delivery proof
§Runtime API
prove_message
: Generate a merkle proof for a committed message
Re-exports§
pub use types::PendingOrder;
pub use types::ProcessMessageOriginOf;
pub use weights::WeightInfo;
pub use pallet::*;
Modules§
- Helpers for implementing runtime api
- The
pallet
module in each FRAME pallet hosts the most important items needed to construct this pallet. - Implementation for [
frame_support::traits::ProcessMessage
] - Implementation for [
snowbridge_outbound_queue_primitives::v2::SendMessage
] - Autogenerated weights for
snowbridge-pallet-outbound-queue