Distribuisci & Esegui (Parte 2)

Contratti distribuiti

Questa sezione della scheda Esegui contiene un elenco di contratti distribuiti con cui interagire attraverso l’interfaccia utente generata automaticamente del contratto distribuito (chiamata anche udapp).

Il contratto distribuito viene visualizzato, ma è nella sua forma collassata.

Fai clic sul cursore laterale per aprirlo.

Vedrai le funzioni nel contratto. I pulsanti delle funzioni possono essere di colore diverso.

  • Le funzioni costanti o pure in Solidity hanno un pulsante blu. Facendo clic su uno di questi pulsanti non si crea una nuova transazione. Pertanto, il clic non causerà cambiamenti di stato - ma restituirà solo un valore archiviato nel contratto - quindi non costerà nulla in termini di costi di carburante.

  • Le funzioni che modificano lo stato del contratto E che non accettano Ether sono chiamate funzioni non pagabili e hanno un pulsante arancione. Facendo clic su di esse si crea una transazione e quindi viene addebitato il costo del carburante.

  • Le funzioni con i pulsanti rossi sono funzioni pagabili in Solidity. Facendo clic su una di queste funzioni si crea una nuova transazione che può accettare un valore. Il valore viene inserito nel campo Valore che si trova sotto il campo Limite del Carburante.

Per ulteriori informazioni su modificatori di Solidity, consultare i documenti di Solidity. .

Se una funzione richiede parametri di input, beh… bisogna inserirli.

Inserimento dei parametri

Inserimento dei parametri nella modalità di vista collassata

(Inserimento di tutti i parametri in un’unica casella di input)

  • La casella di input indica il tipo di parametro da utilizzare.

  • I numeri e gli indirizzi non hanno bisogno di essere racchiusi in virgolette doppie.

  • Le stringhe non hanno bisogno di essere impacchettate.

  • I parametri sono separati da virgole.

Nell’esempio precedente, la funzione «delega» ha 3 parametri.

Inserimento dei parametri nella modalità di vista estesa

Facendo clic sul cursore “giù” si accede alla Gestione Multiparametrica, dove è possibile inserire i parametri uno alla volta. Molto meno caotico!

Nella vista espansa, le stringhe non hanno bisogno di essere impacchettate.

Facendo clic sull’icona degli appunti, gli input vengono codificati e copiati. È possibile codificare solo un insieme valido di input.

Quindi, se si è commesso un errore e si è inserito un uint8 al posto di un indirizzo, facendo clic sugli appunti si otterrà un errore.

Interazioni di livello basso

Le interazioni di basso livello sono utilizzate per inviare fondi o calldata o fondi & calldata a un contratto tramite la funzione recieve() o fallback(). In genere, è necessario implementare la funzione di fallback solo se si segue uno schema di aggiornamento o proxy.

La sezione delle interazioni di basso livello si trova al di sotto delle funzioni in ciascun contratto distribuito.

Si prega di notare quanto segue:

  • Se stai eseguendo un semplice trasferimento di Ether a un contratto, devi avere la funzione receive() nel tuo contratto. Se il tuo contratto è stato distribuito e vuoi inviargli dei fondi, devi inserire la quantità di Ether o Wei ecc. (vedi A nel grafico sottostante), e poi non inserire NULLA nel campo calldata delle Interazioni di basso livello (vedi B nel grafico) e fare clic sul pulsante «Transact» (vedi C nel grafico sottostante).

  • Se si inviano calldata al contratto con Ether, è necessario utilizzare la funzione fallback() e dotarla della mutabilità di stato di pagabile.

  • Se non stai inviando ether al contratto, ma stai inviando calldata, allora devi utilizzare la funzione fallback().

  • Se si violano le regole quando si utilizzano le Interazioni di basso livello, si riceve un avvertimento.

Per maggiori informazioni sull’uso delle funzioni fallback e receive, consultare i documenti di Solidity.

Passare una tupla o una struct a una funzione

Per passare una tupla, è necessario inserire una matrice [].

Allo stesso modo, per passare una struct come parametro di una funzione, è necessario inserirla come una matrice []. Si noti anche che la riga pragma experimental ABIEncoderV2; deve essere inserita all’inizio del file Solidity.

Esempio di come passare una struct annidata a una funzione

Considera una struct annidata come definita in questo modo:

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

Se una funzione ha la firma fertilizer(Garden memory gardenPlot), la sintassi corretta è:

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

Per continuare con questo esempio, ecco un esempio di contratto:

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;
    }
}

Dopo aver compilato, distribuito il contratto e aperto l’istanza distribuita, possiamo aggiungere i seguenti parametri di input alla funzione denominata fertilizzante :

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

La funzione fertilizzante accetta un singolo parametro del tipo Giardino. Il tipo Giardino è una struct. Le struct sono racchiuse tra parentesi quadre. All’interno di Giardino c’è una matrice che è una matrice di struct denominata iFiori. Si ottiene un insieme di parentesi per la matrice e un altro insieme per la struct. Ecco perché le doppie parentesi quadre.