Distribuisci & Esegui

Il modulo Distribuisci & Esegui serve per inviare le transazioni all”Ambiente corrente.

Per la distribuzione, è necessario disporre di un contratto compilato. Per verificare se c’è un contratto compilato, trovare la casella di selezione CONTRACT (CONTRATTO) (che si trova sotto il campo di immissione VALUE (VALORE)), è possibile utilizzare questo modulo.

Se non c’è niente, è necessario compilare un file. Se non si vede il contratto desiderato, è necessario selezionare un contratto nell’editor per renderlo attivo.

Ambiente

  • Remix VM (Merge)` : si collega ad una blockchain sandbox nel browser. La VM Remix (precedentemente chiamata VM JavaScript) è la propria «blockchain» ed a ogni ricarica la vecchia catena verrà cancellata e verrà avviata una nuova blockchain. La vecchia non verrà salvata. Merge (unione) si riferisce alla biforcazione (fork) di Ethereum quando si è verificato il Merge. Questo fork è noto anche come fork di Parigi.

  • Remix VM (London) : come sopra, eccetto per il fatto che questa catena utilizza la biforcazione (fork) Londra di Ethereum.

  • Remix VM (Berlin) : come sopra, ma questa catena utilizza la biforcazione (fork) Berlin di Ethereum.

  • Remix VM - Mainnet fork : questa biforca (fork) la rete principale (mainnet) di Ethereum e viene caricato nella VM Remix. È utile per sviluppare contratti che devono accedere ai contratti della rete principale. (Per maggiori informazioni sulla biforcazione, vedere sotto)

  • Remix VM - Goerli fork : come sopra, tranne che per la biforcazione (fork) della rete di test di Goerli. (Vedere sotto per maggiori informazioni sulla biforcazione)

  • Remix VM - Sepolia fork : come sopra, ma con la biforcazione (fork) della rete di test Sepolia. (Vedere sotto per maggiori informazioni sulla biforcazione)

  • Remix VM - Custom fork : biforca una catena ad un numero di blocco e in una versione EVM a tua scelta. (Vedere sotto per maggiori informazioni sulla biforcazione)

  • Injected Provider - provider name: connette Remix a un fornitore di web3 iniettato. Il fornitore iniettato più comune è Metamask.

  • Custom - External HTTP Provider: Remix si connetterà a un nodo remoto. È necessario fornire l’URL del fornitore selezionato: geth, parity o qualsiasi altro client Ethereum. In precedenza si chiamava Fornitore Web3. (Vedere sotto per maggiori informazioni sul Provider HTTP esterno)

  • Dev - Hardhat Provider: connette Remix a una catena di test Hardhat locale.

  • Dev - Ganache Provider: connette Remix a una catena di test Ganache di Truffle locale.

  • Dev - Foundry Provider: connette Remix a una catena di test Anvil di Foundry locale.

  • L2 - Optimism Provider: connette Remix a un fornitore iniettato (di solito Metamask) con le impostazioni per la rete principale di Optimism.

  • L2 - Arbitrum One Provider: connette Remix a un fornitore iniettato (di solito Metamask) con le impostazioni per la rete principale di Arbitrum One.

  • WalletConnect: connette Remix a un portafoglio su un dispositivo mobile.

Catene di biforcazione in Remix

La biforcazione (fork) è un’ottima tecnica per sviluppare un contratto che interagisce con i contratti distribuiti su una catena specifica. Portando una catena nella VM di Remix, avrete i 10 account caricati con 100ETH.

Attenzione però, se si aggiorna il browser, si perderà la catena biforcata.

Biforcazione personalizzata

L’opzione biforcazione personalizzata consente di specificare il server RPC di una catena, un numero di blocco e una versione EVM.

È possibile ottenere l” URL del Nodo da chainlist.org. Se la catena non viene caricata, potrebbe essere necessario scegliere un altro server RPC. È inoltre necessario scegliere una versione EVM appropriata al numero del blocco. Quindi, se si sceglie un numero di blocco molto basso, l’EVM con il «flavor» Merge non funzionerà perché questa versione dell’EVM è uscita più tardi.

Ulteriori informazioni sul provider HTTP esterno

Se si utilizzano Geth e https://remix.ethereum.org, utilizzare il seguente comando Geth per consentire le richieste da Remix:

geth --http --http.corsdomain https://remix.ethereum.org

Si veda anche Documenti Geth sul server http

Per eseguire Remix usando https://remix.ethereum.org e un nodo di prova locale, usare questo comando Geth:

geth --http --http.corsdomain="https://remix.ethereum.org" --http.api web3,eth,debug,personal,net --vmdebug --datadir <path/to/local/folder/for/test/chain> --dev console

Se si utilizza remix-alpha o una versione locale di remix - sostituire l’url di –http.corsdomain con l’url di Remix in uso.

Per eseguire Remix Desktop e un nodo di prova locale, utilizzate questo comando Geth:

geth --http --http.corsdomain="package://a7df6d3c223593f3550b35e90d7b0b1f.mod" --http.api web3,eth,debug,personal,net --vmdebug --datadir <path/to/local/folder/for/test/chain> --dev console

Si veda anche Documenti Geth in modalità Dev

L’endpoint del provider Web3 per un nodo locale è http://localhost:8545


ATTENZIONE: Non siate pigri. È una cattiva idea usare il flag di Geth –http.corsdomain con un carattere jolly: --http.corsdomain *

Se si mette il carattere jolly *, significa che tutti possono richiedere il nodo. Invece, se si mette un URL, si restringe l’url solo a quello - ad esempio --http.corsdomain 'https://remix-alpha.ethereum.org'

Utilizzare --http.corsdomain * solo quando si utilizza una catena di prova E si utilizzano solo account di prova. Per gli account reali o sulla catena principale specificare l’url.


Account:

  • Account: la lista degli account associati all’ambiente corrente (e i relativi saldi). Nella macchina virtuale Remix è possibile scegliere tra 5 conti. Se si utilizza Web3 iniettato con MetaMask, è necessario modificare l’account in MetaMask.

Limite del Gas:

  • Questo imposta la quantità massima di gas consentita per tutte le transazioni create in Remix.

Valore:

  • Questo imposta la quantità di ETH, WEI, GWEI ecc. che viene inviata a un contratto o a una funzione pagabile.
    Nota: le funzioni pagabili hanno un pulsante rosso.

Il campo Value (Valore) viene sempre resettato a 0 dopo l’esecuzione di ogni transazione.
Il campo Value NON è per il gas.

Distribuzione e All’indirizzo

  • Nell’immagine sopra, la casella di selezione è impostata su Ballot (Votazione). Questa casella di selezione conterrà l’elenco dei contratti compilati.

  • Deploy (distribuisci) invia una transazione che distribuisce il contratto selezionato. Quando la transazione viene minata, l’istanza appena creata viene aggiunta (questo potrebbe richiedere alcuni secondi).
    **Nota: ** Se la funzione costruttore del contratto ha dei parametri, è necessario specificarli.

  • At Address (All’indirizzo) è usato per accedere ad un contratto che è già stato distribuito. Poiché il contratto è già distribuito, l’accesso a un contratto con AtAddress non costa gas.

**Nota: ** Quando si utilizza AtAddress (All’indirizzo), assicurarsi di avere fiducia nel contratto a quell’indirizzo.

To use AtAddress, you need to have the source code or ABI of the deployed contract in the active tab of the editor. When using the source code, it must be compiled with the same compilation settings as the deployed contract that you are trying to access.

Utilizzo dell’ABI con AtAddress (All’indirizzo)

L”ABI è un array JSON che descrive l’interfaccia del contratto.

Per interagire con un contratto utilizzando l’ABI, creare un nuovo file in Remix con estensione *.abi e copiare in esso il contenuto dell’ABI.

Assicurarsi che questo file sia la scheda attiva nell’editor. Quindi, nel campo accanto a At Address (All’indirizzo), inserire l’indirizzo del contratto e cliccare su At Address. In caso di successo, un’istanza del contratto apparirà in basso - nell’elenco dei Contratti distribuiti.

Nota: Per generare l’ABI, nel compilatore Solidity, dopo che un contratto è stato compilato, cliccare sul pulsante Compilation Details(Dettagli di compilazione). Verrà visualizzata una finestra contenente l’ABI e altre informazioni.

Istanze in corso

La convalida di una transazione richiede alcuni secondi. Durante questo tempo, la GUI la mostra in modalità pending (in corso). Quando la transazione viene minata, il numero di transazioni pending viene aggiornato e la transazione viene aggiunta al log (vedi terminale).

Utilizzo del registratore

Il Recorder (Registratore) è uno strumento utilizzato per salvare un gruppo di transazioni in un file JSON e rieseguirle successivamente nello stesso ambiente o in un altro.

Saving to the JSON file (by default it’s called scenario.json) allows one to easily check the transaction list, tweak input parameters, change linked library, etc…

Ci sono molti casi di utilizzo del registratore.

Per esempio:

  • Dopo aver codificato e testato i contratti in un ambiente limitato (come la VM Remix), si può cambiare l’ambiente e distribuirlo nuovamente in un ambiente più realistico, come una testnet pubblica o un nodo Geth. Utilizzando il file scenario.json generato, si useranno tutte le stesse impostazioni utilizzate nella VM Remix. Ciò significa che non sarà necessario cliccare sull’interfaccia 100 volte o altro per ottenere lo stato ottenuto in origine. Quindi il registratore potrebbe essere uno strumento per proteggere la vostra sanità mentale.

    È inoltre possibile modificare le impostazioni nel file scenario.json per personalizzare la riproduzione.

  • La distribuzione di un contratto richiede spesso più della creazione di una transazione, per cui il registratore automatizzerà questa distribuzione.

  • Working in a dev environment often requires setting up the state in the first place.

Se selezionata, l’opzione Run transactions using the last compilation result (Esegui le transazioni usando l’ultimo risultato della compilazione) consente di sviluppare un contratto e di impostare facilmente lo stato usando le ultime versioni compilate dei contratti

scenario.json

Per creare questo file nel registratore, ovviamente è necessario aver eseguito prima alcune transazioni. Nell’immagine sopra - c’è uno 0 accanto a Transactions Recorded (Transazioni registrate). Quindi questo non è il momento giusto per salvare le transazioni - perché non ce ne sono. Ogni volta che si effettua una transazione, il numero aumenterà. Quando si è pronti, fare cliccare sull’icona del floppy disk e il file scenario.json verrà creato.

Il file JSON sotto è un esempio del file scenario.json.

In esso, vengono eseguite 3 transazioni:

La prima corrisponde alla distribuzione della libreria testLib.

La seconda corrisponde al deployment del contratto test con il primo parametro del costruttore impostato a 11. Questo contratto dipende da una libreria. Il collegamento è fatto usando la proprietà linkReferences. In questo caso si utilizza l’indirizzo della libreria precedentemente creata: created{1512830014773}. Il numero è l’id (timestamp) della transazione che ha portato alla creazione della libreria.

Il terzo record corrisponde alla chiamata alla funzione set del contratto test (la proprietà a è impostata a: created{1512830015080}). I parametri di ingresso sono 1 e 0xca35b7d915458ef540ade6068dfe2f44e8fa733c

Tutte queste transazioni sono create utilizzando il valore dell’account account{0}.

{
"accounts": {
    "account{0}": "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
},
"linkReferences": {
    "testLib": "created{1512830014773}"
},
"transactions": [
    {
    "timestamp": 1512830014773,
    "record": {
        "value": "0",
        "parameters": [],
        "abi": "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a",
        "contractName": "testLib",
        "bytecode": "60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029",
        "linkReferences": {},
        "type": "constructor",
        "from": "account{0}"
    }
    },
    {
    "timestamp": 1512830015080,
    "record": {
        "value": "100",
        "parameters": [
        11
        ],
        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
        "contractName": "test",
        "bytecode": "60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__browser/ballot.sol:testLib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029",
        "linkReferences": {
        "browser/ballot.sol": {
            "testLib": [
            {
                "length": 20,
                "start": 511
            }
            ]
        }
        },
        "name": "",
        "type": "constructor",
        "from": "account{0}"
    }
    },
    {
    "timestamp": 1512830034180,
    "record": {
        "value": "1000000000000000000",
        "parameters": [
        1,
        "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
        ],
        "to": "created{1512830015080}",
        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
        "name": "set",
        "type": "function",
        "from": "account{0}"
    }
    }
],
"abis": {
    "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a": [
    {
        "constant": true,
        "inputs": [],
        "name": "get",
        "outputs": [
        {
            "name": "",
            "type": "uint256"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    }
    ],
    "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec": [
    {
        "constant": true,
        "inputs": [],
        "name": "getInt",
        "outputs": [
        {
            "name": "",
            "type": "uint256"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "getFromLib",
        "outputs": [
        {
            "name": "",
            "type": "uint256"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "getAddress",
        "outputs": [
        {
            "name": "",
            "type": "address"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
        {
            "name": "_t",
            "type": "uint256"
        },
        {
            "name": "_add",
            "type": "address"
        }
        ],
        "name": "set",
        "outputs": [],
        "payable": true,
        "stateMutability": "payable",
        "type": "function"
    },
    {
        "inputs": [
        {
            "name": "_r",
            "type": "uint256"
        }
        ],
        "payable": true,
        "stateMutability": "payable",
        "type": "constructor"
    }
    ]
}
}