Déployer et exécuter

Le module Deploy & Run permet d’envoyer des transactions à l”Environnement actuel.

Pour le déploiement, vous devez disposer d’un contrat compilé. Pour vérifier qu’il existe un contrat compilé, trouvez la boîte de sélection CONTRACT (qui se trouve sous le champ de saisie VALUE), vous pouvez utiliser ce module.

S’il n’y a rien, vous devez compiler un fichier. Si vous ne voyez pas le contrat que vous souhaitez, vous devez sélectionner un contrat dans l’éditeur pour le rendre actif.

Environnement

  • Remix VM (Merge) : Se connecte à une blockchain sandbox dans le navigateur. La Remix VM (précédemment appelée JavaScript VM) est sa propre « blockchain » et à chaque rechargement, l’ancienne chaîne sera effacée et une nouvelle blockchain sera démarrée. **L’ancienne blockchain ne sera pas sauvegardée. Merge fait référence à la fourche d’Ethereum lorsque la fusion s’est produite. Cette fourche est également connue sous le nom de Paris fork.

  • Remix VM (London) : Identique à la précédente, sauf que cette chaîne utilise la fourchette de Londres d’Ethereum.

  • Remix VM (Berlin) : Même chose que ci-dessus, mais cette chaîne utilise la version berlinoise d’Ethereum.

  • Remix VM - Mainnet fork : Ceci forkera le mainnet Ethereum et le chargera dans la Remix VM. C’est utile pour développer des contrats qui ont besoin d’accéder à des contrats mainnet déployés. (Voir ci-dessous pour plus d’informations sur le Forking)

  • Remix VM - Goerli fork : Identique au précédent, sauf qu’il s’agit d’un fork du réseau de test Goerli. (Voir ci-dessous pour plus d’informations sur le forkage)

  • Remix VM - Sepolia fork : Identique à ce qui précède, sauf qu’il s’agit d’un fork du réseau de test Sepolia. (Voir ci-dessous pour plus d’informations sur le Forking)

  • Remix VM - Custom fork : Forks une chaîne, au numéro de bloc, et dans une version EVM de votre choix. (Voir ci-dessous pour plus d’informations sur le Forking)

  • Fournisseur injecté - nom du fournisseur : Connecte Remix à un fournisseur web3 injecté. Le fournisseur injecté le plus courant est Metamask.

  • Custom - External HTTP Provider : Remix se connectera à un nœud distant. Vous devrez fournir l’URL du fournisseur sélectionné : geth, parity ou n’importe quel client Ethereum. Cette option était auparavant appelée Web3 Provider. (Voir ci-dessous pour plus d’informations sur External HTTP Provider)

  • Dev - Hardhat Provider : Connecte Remix à une chaîne de test Hardhat locale.

  • Dev - Ganache Provider : Connecte Remix à une chaîne de test Truffle Ganache locale.

  • Dev - Foundry Provider : Connecte Remix à une chaîne de test Foundry Anvil locale.

  • L2 - Optimism Provider : Connecte Remix à un fournisseur injecté (habituellement Metamask) avec les paramètres du réseau principal d’Optimism.

  • L2 - Fournisseur Arbitrum One : Connecte Remix à un fournisseur injecté (habituellement Metamask) avec les paramètres du réseau Arbitrum One.

  • WalletConnect : Connecte Remix à un portefeuille sur un appareil mobile.

Chaînes de bifurcation dans Remix

Le forçage est une excellente technique pour développer un contrat qui interagit avec les contrats déployés sur une chaîne spécifique. En apportant une chaîne à la VM Remix, vous aurez les 10 comptes chargés avec 100ETH.

Attention cependant, si vous actualisez le navigateur, vous perdrez la chaîne bifurquée.

Fourche sur mesure

L’option Custom fork vous permet de spécifier le serveur RPC d’une chaîne, un numéro de bloc et une version EVM.

Vous pouvez obtenir l”URL du nœud à partir de chainlist.org. Si la chaîne ne se charge pas, vous devrez peut-être choisir un autre serveur RPC. Vous devrez également choisir une version d’EVM adaptée au numéro de bloc. Ainsi, si vous choisissez un numéro de bloc très bas, l’EVM avec la « saveur » Merge ne fonctionnera pas parce que cette version de l’EVM est sortie plus tard.

En savoir plus sur le fournisseur HTTP externe

Si vous utilisez Geth et https://remix.ethereum.org, veuillez utiliser la commande Geth suivante pour autoriser les requêtes provenant de Remix :

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

Voir aussi [Geth Docs about the http server] (https://geth.ethereum.org/docs/rpc/server)

Pour exécuter Remix à l’aide de https://remix.ethereum.org et d’un nœud de test local, utilisez cette commande 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

Si vous utilisez remix-alpha ou une version locale de remix, remplacez l’url de –http.corsdomain par l’url de Remix que vous utilisez.

Pour exécuter Remix Desktop et un nœud de test local, utilisez cette commande 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

Voir aussi [Geth Docs on Dev mode] (https://geth.ethereum.org/getting-started/dev-mode)

Le point de terminaison du fournisseur Web3 pour un nœud local est http://localhost:8545.


AVERTISSEMENT: Ne soyez pas paresseux. C’est une mauvaise idée d’utiliser le drapeau Geth –http.corsdomain avec un joker : --http.corsdomain *

Si vous mettez le joker *, cela signifie que tout le monde peut demander le noeud. Par contre, si vous mettez une URL, cela restreint les urls à cette seule URL - par exemple --http.corsdomain 'https://remix-alpha.ethereum.org'

N’utilisez --http.corsdomain * que lorsque vous utilisez une chaîne de test ET que vous n’utilisez que des comptes de test. Pour les comptes réels ou sur la chaîne principale spécifiez l’url.


Compte :

  • Compte : la liste des comptes associés à l’environnement actuel (et leurs soldes associés). Sur la VM Remix, vous avez le choix entre 5 comptes. Si vous utilisez Injected Web3 avec MetaMask, vous devez changer le compte dans MetaMask.

Limite de gaz :

  • Ceci définit la quantité maximale de gaz qui sera autorisée pour toutes les transactions créées dans Remix.

Valeur :

  • Ceci définit le montant d’ETH, WEI, GWEI etc. qui est envoyé à un contrat ou à une fonction de paiement.
    **Les fonctions payables ont un bouton rouge.

Le champ Valeur est toujours remis à 0 après l’exécution de chaque transaction.
Le champ Valeur est NOT pour le gaz.

Déployer et AtAddress

  • Dans l’image ci-dessus, la boîte de sélection est définie sur Ballot. Cette boîte de sélection contient la liste des contrats compilés.

  • Deploy envoie une transaction qui déploie le contrat sélectionné. Lorsque la transaction est analysée, l’instance nouvellement créée est ajoutée (cela peut prendre plusieurs secondes).
    Note: Si la fonction de construction du contrat a des paramètres, vous devez les spécifier.

  • At Address est utilisé pour accéder à un contrat qui a déjà été déployé. Comme le contrat est déjà déployé, l’accès à un contrat avec AtAddress ne coûte pas de gaz.

Note: Lorsque vous utilisez AtAddress, assurez-vous que vous avez confiance dans le contrat à cette adresse.

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.

Utilisation de l’ABI avec AtAddress

Le ABI est un tableau JSON qui décrit l’interface du contrat.

Pour interagir avec un contrat à l’aide de l’ABI, créez un nouveau fichier dans Remix avec l’extension *.abi et copiez-y le contenu de l’ABI.

Assurez-vous que ce fichier est l’onglet actif dans l’éditeur. Ensuite, dans le champ à côté de At Address, entrez l’adresse du contrat et cliquez sur At Address. Si vous réussissez, une instance du contrat apparaîtra ci-dessous - dans la liste des Contrats déployés.

Note: Pour générer l’ABI, dans le compilateur Solidity, après la compilation d’un contrat, cliquez sur le bouton Détails de compilation. Une fenêtre modale contenant l’ABI parmi d’autres informations apparaîtra.

Instances en attente

La validation d’une transaction prend plusieurs secondes. Pendant ce temps, l’interface graphique l’affiche en mode « pending » (en attente). Lorsque la transaction est traitée, le nombre de transactions en attente est mis à jour et la transaction est ajoutée au journal (voir terminal).

Utilisation de l’enregistreur

L’enregistreur est un outil utilisé pour enregistrer un ensemble de transactions dans un fichier JSON et les réexécuter plus tard, soit dans le même environnement, soit dans un autre.

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…

L’enregistreur peut être utilisé dans de nombreux cas.

Par exemple :

  • Après avoir codé et testé des contrats dans un environnement contraint (comme la VM Remix), vous pouvez changer l’environnement et le redéployer dans un environnement plus réaliste comme un réseau de test public ou un nœud Geth. En utilisant le fichier scenario.json généré, vous utiliserez tous les mêmes paramètres que ceux utilisés dans la VM Remix. Cela signifie que vous n’aurez pas besoin de cliquer sur l’interface 100 fois ou autre pour obtenir l’état que vous avez atteint à l’origine. L’enregistreur pourrait donc être un outil pour protéger votre santé mentale.

    Vous pouvez également modifier les paramètres du fichier scenario.json pour personnaliser la lecture.

  • Le déploiement d’un contrat nécessite souvent plus que la création d’une transaction et l’enregistreur automatise donc ce déploiement.

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

Lorsqu’elle est cochée, l’option Exécuter les transactions en utilisant le dernier résultat de compilation vous permet de développer un contrat et d’en définir facilement l’état en utilisant les dernières versions compilées des contrats.

scenario.json

Pour créer ce fichier dans l’enregistreur, vous devez bien sûr avoir effectué quelques transactions. Dans l’image ci-dessus - il y a un 0 à côté de Transactions enregistrées. Ce n’est donc pas le bon moment pour enregistrer des transactions parce que - eh bien, parce qu’il n’y en a pas. Chaque fois que vous effectuez une transaction, ce nombre s’incrémente. Lorsque vous êtes prêt, cliquez sur l’icône de la disquette et le fichier scenario.json sera créé.

Le fichier JSON ci-dessous est un exemple du fichier scenario.json.

Trois transactions y sont exécutées :

Le premier correspond au déploiement de la librairie testLib.

Le second correspond au déploiement du contrat test dont le premier paramètre du constructeur est fixé à 11. Ce contrat dépend d’une bibliothèque. Le lien est fait en utilisant la propriété linkReferences. Dans ce cas, nous utilisons l’adresse de la bibliothèque précédemment créée : created{1512830014773}. Le numéro est l’identifiant (timestamp) de la transaction qui a conduit à la création de la bibliothèque.

Le troisième enregistrement correspond à l’appel à la fonction set du contrat test (la propriété to est fixée à : created{1512830015080}). Les paramètres d’entrée sont 1 et xca35b7d915458ef540ade6068dfe2f44e8fa733c

Toutes ces transactions sont créées en utilisant la valeur des comptes compte{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"
    }
    ]
}
}