Primeros pasos con Solidity|Lección 22: Convocatoria

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

En la lección 17: Envío de ETH, hablamos sobre el uso de call para enviar ETH, y en esta lección le mostraremos cómo usarlo para llamar contratos.

Convocatoria

call es una función miembro de bajo nivel del tipo Address, que se utiliza para interactuar con otros contratos. Devuelve (bool, data), que corresponde al éxito de la llamada y al valor devuelto de la función objetivo, respectivamente.

call es el método oficialmente recomendado para enviar ETH activando las funciones de reserva o recepción por solididad. No se recomienda llamar a otro contrato con una llamada, porque cuando llamas a la función de un contrato inseguro, le das la iniciativa. El método recomendado sigue siendo llamar a la función después de declarar la variable de contrato, consulte Lección 19: Llamar a otros contratos. Si no conocemos el código fuente o ABI del contrato de la otra parte, no podemos generar variables de contrato, pero aún podemos llamar a las funciones de contrato de la otra parte a través de call.

Reglas para el uso de call

Las reglas para usar call son las siguientes:

La codificación binaria utiliza la función de codificación estructurada abi.encodeWithSignature para obtener:

La firma de la función es “Nombre de la función (tipo de parámetro separado por comas)”. Por ejemplo, abi.encodeWithSignature(“f(uint256,address)”, _x, _addr).

Además, al llamar al contrato, puede especificar la cantidad de ETH y gas que enviará la transacción:

Parece un poco complicado, así que tomemos un ejemplo de una aplicación de llamadas.

Contrato objetivo

Comencemos escribiendo un contrato de destino simple, OtherContract, y desplegándolo, el código es básicamente el mismo que en la Lección 19, excepto con la adición de una función de reserva.

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.

Usar call para llamar al contrato de destino

1. Evento de respuesta

Vamos a escribir un contrato de llamada para llamar a la función de contrato de destino. En primer lugar, escriba una definición de un evento de respuesta y genere el éxito y los datos devueltos por la llamada, para que podamos observar el valor devuelto.

2. Llamar a la función setX

Definimos la función callSetX para llamar a setX() del contrato de destino, transferir la cantidad de ETH a msg.value y liberar el evento Response para generar éxito y datos:

A continuación, llamamos a callSetX para cambiar la variable de estado _x a 5, y los parámetros son la dirección OtherContract y 5, porque la función objetivo setX() no devuelve un valor, por lo que la salida de datos del evento Response es 0x, que está vacía.

3. Llamar a la función getX

Llamemos a la función getX(), que devolverá el valor del contrato de destino _x, de tipo uint256. Podemos usar abi.decode para decodificar el valor devuelto de la llamada, los datos y leer el valor.

A partir de la salida del evento Response, podemos ver que los datos son 0x0000000000000000000000000000000000000000000000000000000000000005. Después de abi.decode, el valor devuelto final es 5.

4. Llamar a una función que no existe

Si la función que introducimos en la llamada no existe en el contrato de destino, se activará la función de reserva del contrato de destino.

En el ejemplo anterior, llamamos a la función foo inexistente. La llamada aún se puede ejecutar correctamente y devolver el éxito, pero en realidad es la función de reserva del contrato de destino llamado.

Resumen

En esta charla, mostramos cómo usar la llamada a la función de bajo nivel para llamar a otros contratos. call no es el método recomendado para llamar a un contrato porque no es seguro. Pero es útil dejarnos llamar al contrato de destino sin conocer el código fuente y la ABI.

Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • Comentar
  • Republicar
  • Compartir
Comentar
0/400
Sin comentarios
  • Anclado

Opera con criptomonedas en cualquier momento y lugar
qrCode
Escanea para descargar la aplicación de Gate
Comunidad
Español
  • بالعربية
  • Português (Brasil)
  • 简体中文
  • English
  • Español
  • Français (Afrique)
  • Bahasa Indonesia
  • 日本語
  • Português (Portugal)
  • Русский
  • 繁體中文
  • Українська
  • Tiếng Việt