Despliegue y ejecución (parte 2)

Contratos desplegados

Esta sección de la pestaña Ejecutar contiene una lista de contratos desplegados con los que interactuar a través de la interfaz de usuario autogenerada del contrato desplegado (también denominada udapp).

El contrato desplegado aparece pero está en su forma colapsada.

Pulse el signo de intercalación lateral para abrirlo.

Verá las funciones en el contrato. Los botones de las funciones pueden tener diferentes colores.

  • Las funciones que son constantes o puras en Solidity tienen un botón azul. Hacer clic en uno de este tipo no crea una nueva transacción. Así que hacer clic no provocará cambios de estado -sólo devolverá un valor almacenado en el contrato-, por lo que no le costará nada en gastos de gas.

  • Las funciones que cambian el estado del contrato Y que no aceptan Ether se denominan funciones no pagables y tienen un botón naranja. Al hacer clic en ellas se creará una transacción y, por tanto, costará gas.

  • Las funciones que tienen botones rojos son funciones pagables en Solidity. Al hacer clic en una de ellas se creará una nueva transacción y esta transacción puede aceptar un valor. El valor se pone en el campo Valor que está debajo del campo Límite de Gasto.

Consulte más información sobre modificadores de Solidity en la documentación de Solidity. .

Si una función requiere parámetros de entrada, bueno… hay que ponerlos.

Introducción de parámetros

Introducción de parámetros en la vista contraída

(Introducción de todos los parámetros en un único cuadro de entrada)

  • El cuadro de entrada le indica de qué tipo debe ser cada parámetro.

  • Los números y las direcciones no necesitan ir entre comillas dobles.

  • No es necesario envolver las cadenas.

  • Los parámetros están separados por comas.

En el ejemplo anterior, la función «delegar» tiene 3 parámetros.

Introducción de parámetros en la vista ampliada

Al hacer clic en el signo «abajo» accederá al Administrador de parámetros múltiples, donde podrá introducir los parámetros de uno en uno. ¡Mucho menos confuso!

En la vista ampliada, no es necesario envolver las cadenas.

Al hacer clic en el icono del portapapeles se codificarán las entradas y se copiarán. Sólo se puede codificar un conjunto válido de entradas.

Así que si se ha equivocado y ha puesto un uint8 donde debería haber estado una dirección, al pulsar el portapapeles aquí le dará un error.

Interacciones de bajo nivel

Las interacciones de bajo nivel se utilizan para enviar fondos o datos de llamada o fondos y datos de llamada a un contrato a través de la función receive() o fallback(). Normalmente, sólo debería necesitar implementar la función fallback si sigue un patrón de actualización o proxy.

La sección de interacciones de bajo nivel se encuentra debajo de las funciones de cada contrato desplegado.

Tenga en cuenta lo siguiente:

  • Si está ejecutando una transferencia simple de Ether a un contrato, necesita tener la función receive() en su contrato. Si su contrato ha sido desplegado y desea enviarle fondos, introduciría la cantidad de Ether o Wei, etc. (véase A en el gráfico inferior), y a continuación introduciría NADA en el campo calldata de Interacciones de bajo nivel (véase B en el gráfico) y pulsaría el botón Transact (véase C en el gráfico inferior).

  • Si está enviando calldata a su contrato con Ether, entonces necesita utilizar la función fallback() y tenerla con la mutabilidad de estado de pagable.

  • Si no está enviando éter al contrato pero está enviando datos de llamada, entonces debe utilizar la función fallback().

  • Si incumple las normas al utilizar las Interacciones de bajo nivel recibirá una advertencia.

Consulte solidity docs para más detalles sobre el uso de las funciones fallback y receive.

Pasar una tupla o una estructura a una función

Para pasar una tupla, debe poner una matriz [].

Del mismo modo, para pasar un struct como parámetro de una función, es necesario ponerlo como un array []. También tenga en cuenta que la línea pragma experimental ABIEncoderV2; necesita ponerse en la parte superior del archivo solidity.

Ejemplo de paso de una estructura anidada a una función

Considere una estructura anidada definida así:

struct Garden {
    uint slugCount;  
    uint wormCount;
    Flower[] theFlowers;
}
struct Flower {
    uint flowerNum;
    string color;
}

Si una función tiene la firma fertilizante(memoria jardínparcelajardín) entonces la sintaxis correcta es:

[1,2,[[3,"Petunia"]]]

Para continuar con este ejemplo, he aquí un modelo de contrato:

pragma solidity >=0.4.22 <0.7.0;
pragma experimental ABIEncoderV2;

contract Sunshine {
    struct Garden {
      uint slugCount;  
      uint wormCount;
      Flower[] theFlowers;
    }
    struct Flower {
        uint flowerNum;
        string color;
    }
      
    function fertilizer(Garden memory gardenPlot) public {
        uint a = gardenPlot.slugCount;
        uint b = gardenPlot.wormCount;
        Flower[] memory cFlowers = gardenPlot.theFlowers;
        uint d = gardenPlot.theFlowers[0].flowerNum;
        string memory e = gardenPlot.theFlowers[0].color;
    }
}

Tras compilar, desplegar el contrato y abrir la instancia desplegada, podemos añadir los siguientes parámetros de entrada a la función denominada fertilizante :

[1,2,[[3,"Black-eyed Susan"],[4,"Pansy"]]]

La función fertilizante acepta un único parámetro del tipo Jardín. El tipo Jardín es una estructura. Los structs se envuelven en corchetes. Dentro de Jardín hay una matriz que es una matriz de structs llamada lasFlores. Tiene un conjunto de corchetes para el array y otro conjunto para el struct. De ahí los dobles corchetes.