Channels
XCM has instructions that aid in the establishment of a HRMP channel between parachains. HRMP channels are always unidirectional (one-way); every channel has a static sender and a static recipient. To send messages in the opposite direction (i.e. from recipient to sender), another new HRMP channel must be opened. Unlike other XCM instructions, these HRMP instructions are related to the underlying transport mechanism, and will normally not be sent by developers. We still want to list them, as they are part of XCM:
HrmpNewChannelOpenRequest
HrmpChannelAccepted
HrmpChannelClosing
HrmpNewChannelOpenRequest
HrmpNewChannelOpenRequest {
#[codec(compact)]
sender: u32,
#[codec(compact)]
max_message_size: u32,
#[codec(compact)]
max_capacity: u32,
}
The HrmpNewChannelOpenRequest
is an instruction to notify about a new incoming HRMP channel. This
message is meant to be sent by the relay chain to a parachain.
The sender
field represents the ParaId of the parachain initializing the channel. This parachain
will also be the sender in the to-be opened channel.
The max_message_size
field is the maximum size of a message that is send through the channel. This
field is the size proposed by the sender, and needs to be accepted by the recipient.
The max_capacity
is the maximum number of messages that can be queued in the channel.
HrmpChannelAccepted
HrmpChannelAccepted {
#[codec(compact)]
recipient: u32,
}
The HrmpChannelAccepted
instruction is used to notify about that a previously sent open channel
request has been accepted by the recipient. That means that the channel will be opened during the
next relay chain session change. This message is meant to be sent by the relay chain to a parachain.
The recipient
field represents the ParaId of the parachain that initialized the channel, so it
equals the sender
field in the preceding HrmpNewChannelOpenRequest
instruction.
HrmpChannelClosing
HrmpChannelClosing {
#[codec(compact)]
initiator: u32,
#[codec(compact)]
sender: u32,
#[codec(compact)]
recipient: u32,
}
The HrmpChannelClosing
instruction is used to notify that the other party in an open channel
decided to close it. In particular, initiator
is going to close the channel opened from sender
to the recipient
. The close will be enacted at the next relay chain session change. This message
is meant to be sent by the relay chain to a para.
The initiator
field represents the ParaId of the parachain that is closing the channel. It is
equal to either the sender
or recipient
field.
The sender
field represents the ParaId of the parachain that is the sender side of the channel.
The recipient
field represents the ParaId of the parachain that is the recipient side of the
channel.
Important to note is that both the sender and recipient can close the channel.
Message Export (Bridging)
XCM has an instruction that allows us to send an XCM to a Non-Local Consensus System, meaning to
MultiLocation that is outside our current GlobalConsensus. For example, it allows us to send an XCM
from Kusama to Polkadot or from Polkadot to an Ethereum-based chain. Exporting an XCM to another
Non-Local Consensus System will tend to utilize some extra consensus layer/mechanism, the obvious
one being a bridge. The instruction to export an XCM is called ExportMessage
.
ExportMessage
ExportMessage { network: NetworkId, destination: InteriorMultiLocation, xcm: Xcm<()> },
The ExportMessage
instruction can be used to export a message to a Non-Local Consensus System. The
message is sent to the bridge (or other consensus mechanism) that is able to export the message. A
fee is charged for exporting the message via the bridge.
The network
field is the remote consensus system to which the message should be exported.
The destination
field is the location relative to the remote consensus system to which the message
should be sent on arrival.
The xcm
field is the message to be exported.
As an example, to export a message for execution on Statemine (parachain #1000
in the Kusama
network), you would call with network: NetworkId::Kusama
and destination: X1(Parachain(1000))
.
Alternatively, to export a message for execution on Polkadot, you would call with
network: NetworkId:: Polkadot
and destination: Here
.