Интерфейсы контрактов
Разработчики протоколов должны использовать эти интерфейсы для отправки кросс-чейн сообщений и инициирования кросс-чейн чтений через Metalayer.
Создание протоколов через Metalayer
Metalayer требует, чтобы разработчики протоколов реализовывали два контракта - один на сети источника, а другой на сети назначения. Эта схема одинакова независимо от того, собирается ли разработчик выполнять чтение или запись.
Оба контракта взаимодействуют с контрактом MetalayerRouter на каждой сети - и на обеих сторонах разработчик должен разрешить список конкретных контрактов MetalayerRouter на локальной сети как часть конфигурации своего протокола.
Отправка сообщения в сети источнике
В сети источника контракт отправки вызывает функцию dispatch
контракта MetalayerRouter. Эта функция принимает домен назначения, адрес получателя, чтение, данные вызова записи, а также логическое значение, указывающее, нужно ли дожидаться завершения сети источника перед передачей сообщения.
/**
* @notice Dispatches a message to the destination domain & recipient with the given reads and write.
* @param _destinationDomain Domain of destination chain
* @param _recipientAddress Address of recipient on destination chain as bytes32
* @param _reads Read operations
* @param _writeCallData The raw bytes to be called on the recipient address.
* @param _useFinalized Whether or not to wait for finality before relaying the message.
*/
function dispatch(
uint32 _destinationDomain,
address _recipientAddress,
ReadOperation[] memory _reads, // can be empty
bytes memory _writeCallData,
bool _useFinalized
) external payable;
function quoteGasPayment(
uint32 _destinationDomain,
uint256 _gasLimit
) public view virtual override returns (uint256);
Оплата газа
Функция quoteGasPayment
используется для расчета количества газа, которое будет заплачено за сообщение. Эта функция принимает домен назначения и лимит газа и возвращает количество газа, необходимое для передачи сообщения. Эта плата за газ покрывает стоимость ретрансляции сообщения, а также стоимость газа, необходимого для доставки сообщения по сети назначения. Эта функция также работает при передаче сообщений на сети с токеном газа, отличным от токена на вашей локальной сети. Плата должна быть включена в значение, отправляемое функцию dispatch
.
Получение сообщения в сети назначения
В сети назначения контракт должен реализовать интерфейс IMetalayerRecipient
. MetalayerRouter
в сети назначения вызовет функциюhandle
в контракте получателя, чтобы доставить сообщение.
/**
* @notice Struct defining a cross-chain read operation
* @param sourceChainId Domain of the chain to read from
* @param sourceContract Contract address to read from as address
* @param callDataLength Length of the call data
* @param callData The encoded function call data
*/
struct ReadOperation {
uint32 sourceChainId;
address sourceContract;
bytes callData;
}
interface IMetalayerRecipient {
// Here, _readResults will be the results of every read in the message, in order. This will be input by the relayer.
function handle(
uint32 _chainId,
address _sender,
bytes calldata _message, // The body of the Metalayer message, or writeCallData.
ReadOperation[] calldata _reads,
bytes[] calldata _readResults
) external payable;
}
Last updated