Intercomunicación entre capas
Clase 6 de 10 • Curso de Desarrollo en Protocolos de Segunda Capa sobre Ethereum
Resumen
La verdadera magia de los protocolos de segunda capa está en la total compatibilidad con la blockchain subyacente. Toda la información que se genera en un contrato en Capa 1, puede ser enviada a Capa 2 (y viceversa) por medio de un bridge.
¿Cómo se comunican contratos en diferentes capas?
Así como puedes utilizar los bridges entre Capa 1 y 2 para mover fondos, también puedes utilizarlos para enviar datos, ejecutar funciones entre contratos u obtener información.
Estos puentes no dejan de ser contratos inteligentes desplegados en Capa 1, que permiten comunicarte con contratos en Capa 2. Debemos localizar estos contratos en la red en donde nos encontremos para poder utilizarlos. Por ejemplo, sin nos encontramos en la testnet Goerli
, en la misma encontraremos el contrato 0x5086...bE294 que representa el bridge con la testnet de prueba de Optimism.
Intercambio de mensajes entre capas
Para ejecutar una función en un contrato desplegado en Optimism desde Ethereum Goerli
, comienza desplegando en L2 el contrato en cuestión que quieres ejecutar desde L1.
```c // SPDX-License-Identifier: MIT pragma solidity 0.8.17;
contract HelloWorld { string public hello = "Hola mundo!";
function setHello(string memory hello_) public {
hello = hello_;
}
} ```
Un sencillo contrato para persistir un mensaje del tipo string
. Para desplegarlo en Optimism, necesitarás fondos que puedes obtener utilizando este bridge para enviar algo de ETH desde Goerli. También tendrás que agregar la red a tu Metamask, puedes hacerlo desde el explorador de Optimism Goerli.
A continuación, sitúate en Remix, o en tu entorno de desarrollo preferido, para desplegar un contrato en L1. El contrato que se comunicará con la L2 será el siguiente:
```c // SPDX-License-Identifier: MIT pragma solidity 0.8.17;
interface CrossDomainMessenger { function sendMessage(address _target, bytes memory _message, uint32 _minGasLimit) payable external; }
contract HelloWorldOperatorL1 { // Instanciamos el bridge con su dirección CrossDomainMessenger ovmL1CrossDomainMessenger = CrossDomainMessenger(0x5086d1eEF304eb5284A0f6720f79403b4e9bE294);
function executeFuncionInL2(address l2ContractAddress, string memory hello_, uint32 gasLimit) public {
ovmL1CrossDomainMessenger.sendMessage(
l2ContractAddress,
abi.encodeWithSignature(
"setHello(string)",
hello_
),
gasLimit
);
}
} ```
Si observas en detalle el bridge, 0x5086...bE294, la función sendMessage()
te permitirá ejecutar una función en un contrato en L2.
Para esto, hacemos uso de una interfaz custom en nuestro contrato llamada CrossDomainMessenger
para instanciar el puente y que reconozca la función sendMessage()
. Luego, utilizamos el objeto abi
que nos ayudará a encriptar el mensaje y enviarlo a L2 cuando se ejecute la función executeFuncionInL2
.
Despliega este contrato en L1 y, al ejecutar la función mencionada, podrás observar el cambio del mensaje que guardamos en el contrato de la segunda capa. Esta transacción debe confirmarse en ambas capas, por lo que demorará algunos minutos en verse reflejado los cambios.
Hemos realizado un muy sencillo ejemplo para enviar un mensaje de texto desde Capa 1 hacia Capa 2. Pero con esto es suficiente para apreciar lo poderoso e interesante que puede ser la comunicación de contratos en diferentes capas.
Contribución creada por: Kevin Fiorentino.