Recientemente he estado volviendo a aprender Solidity, consolidando los detalles y escribiendo un “Solid Minimalist Primer” para que lo usen los principiantes (los chicos de programación pueden encontrar otro tutorial), actualizado de 1 a 3 veces por semana.
Todo el código y los tutoriales son de código abierto en github:github.com/AmazingAng/WTFSolidity
Los desarrolladores escriben contratos inteligentes para invocar otros contratos, lo que permite reutilizar los programas de la red Ethereum, construyendo así un ecosistema próspero. Muchos proyectos web3 se basan en la invocación de otros contratos, como el yield farming. En esta charla, le mostraremos cómo llamar a la función del contrato de destino cuando se conocen el código del contrato (o interfaz) y la dirección.
Comencemos escribiendo un contrato simple, OtherContract, para llamarlo.
Este contrato contiene una variable de estado x, un registro de eventos que se activa cuando se recibe ETH y tres funciones:
getBalance(): Devuelve el saldo de ETH del contrato.
setX(): función de pago externa, que puede establecer el valor de x y enviar ETH al contrato.
getX(): Lee el valor de x.
Podemos crear una referencia al contrato utilizando la dirección del contrato y el código del contrato (o interfaz): _Name(_Address), donde _Name es el nombre del contrato y _Address es la dirección del contrato. A continuación, llame a su función con una referencia al contrato: _Name(_Address).f(), donde f() es la función a la que se llamará.
A continuación, se muestran 4 ejemplos de invocación de contratos:
Podemos pasar la dirección del contrato de destino a la función, generar una referencia al contrato de destino y, a continuación, llamar a la función de destino. Por ejemplo, escribimos una función callSetX en el nuevo contrato, pasando la dirección de contrato OtherContract implementada _Address y el parámetro x de setX:
Podemos pasar directamente la referencia del contrato en la función, y solo necesitamos cambiar el tipo de dirección del parámetro anterior al nombre del contrato de destino, que es mejor que OtherContract. En el ejemplo siguiente se implementa la función getX() que llama al contrato de destino.
Podemos crear una variable de contrato y luego usarla para llamar a la función objetivo. En el siguiente ejemplo, almacenamos una referencia al contrato OtherContract para la variable oc:
Si la función del contrato objetivo es pagadera, entonces podemos transferir dinero al contrato llamándolo: _Name(_Address).f{value: _Value}(), donde _Name es el nombre del contrato, _Address es la dirección del contrato, f es el nombre de la función objetivo y _Value es la cantidad de ETH a transferir (en wei).
La función setX del contrato OtherContract es pagadera y, en el siguiente ejemplo, transferimos dinero hacia y desde el contrato de destino llamando a setX.
Después de la transferencia, podemos observar el cambio del saldo de ETH del contrato objetivo a través del evento Log y la función getBalance().
En esta charla, le mostraremos cómo crear una referencia al contrato a través del código (o interfaz) y la dirección del contrato de destino, para llamar a las funciones del contrato de destino.