Il est bien connu que de nombreuses blockchains ont des problèmes d'évolutivité et de congestion. Ces problèmes ont de nombreux effets, allant de la lenteur des délais de transaction à l'augmentation des frais de transaction et à la dégradation de l'expérience utilisateur.
Une solution consiste à ce que web3 soit multi-chaînes en utilisant des chaînes L2 (couche deux). Les Ethereum L2, tels que Optimism , Arbitrum et Polygon , s'appuient sur le réseau Ethereum mais sont plus rapides et moins chers qu'Ethereum.
En contrepartie, cependant, ils sont souvent moins sûrs qu'Ethereum. C'est pourquoi les L2 gèrent les activités quotidiennes des utilisateurs tout en s'appuyant sur Ethereum L1 comme base en coulisse pour un règlement sécurisé et décentralisé et une couche de disponibilité des données.
C'est une excellente solution - cependant, il existe de nombreux L2 sur Ethereum seul; chacun un réseau autonome avec ses propres nuances et expériences.
Construire et utiliser des dapps qui interagissent et se déplacent entre ces réseaux et Ethereum L1 peut être fastidieux, difficile et une mauvaise expérience pour les utilisateurs et les développeurs.
Ce dont nous avons besoin, c'est que le web3 devienne une expérience multi-chaînes , où les consommateurs n'ont pas besoin de savoir quelle chaîne ils utilisent (et franchement, s'en fichent) et où les développeurs peuvent compter sur le réseau qui répond le mieux aux besoins de leurs dapps. .
En passant à cet Internet multi-chaînes de blockchains , le web3 devient une meilleure expérience pour toutes les personnes impliquées.
Malheureusement, permettre aux dapps de se déplacer entre les chaînes est un défi technique difficile. Dans cet article, nous examinerons une solution : utiliser les points de terminaison Infura RPC et les boîtes Truffle pour construire et relier ces réseaux de manière transparente.
Plus précisément, nous utiliserons l' Optimism Bridge Truffle Box pour créer un projet sur le testnet Ethereum Goerli et faire le pont vers Optimism Goerli.
Au cœur de notre exemple de solution, nous nous appuierons sur Truffle Boxes - des passe-partout "raccourcis" (tels que des contrats, des bibliothèques, des modules et même des dapps entièrement fonctionnels) de ConsenSys que vous pouvez utiliser pour créer votre dapp.
Pour les solutions multichaînes, ils s'appuient sur les nœuds Infura RPC pour de nombreux réseaux L2.
Comme mentionné ci-dessus, nous nous appuierons spécifiquement sur la boîte à truffes Optimism Bridge . Cette boîte contient tous les contrats nécessaires pour interagir avec le pont Optimism depuis L1 et L2, ainsi qu'un ensemble de migrations pour le déploiement, l'appel de fonctions et la transmission de messages/valeurs entre les couches.
Il a même un script d'assistance qui fait tout ce dont nous avons besoin pour voir tout cela en action. Nous avons simplement besoin de le déballer pour obtenir tout ce dont nous avons besoin ! Selon Trufflesuite.com, la boîte comprend :
Remarque : un pont est un outil qui permet à des blockchains indépendantes de communiquer entre elles, d'envoyer des jetons, des NFT, etc.
Avant de commencer, nous avons besoin des prérequis suivants :
node -v && npm -v
Une fois que vous avez pris en charge les prérequis, visitez le site Web d'Infura pour vous connecter (ou créez un nouveau compte).
Après une inscription réussie, la page redirige vers le tableau de bord Infura où nous pouvons créer une nouvelle clé API, comme indiqué ci-dessous.
Cliquez sur le bouton "Créer une nouvelle clé" et remplissez les informations requises.
Après avoir créé votre clé API, votre ID de projet sera visible sur votre tableau de bord sous la section API KEY, comme indiqué ci-dessous. Copiez-le et conservez-le quelque part ; vous en aurez besoin plus tard dans ce tutoriel.
Ensuite, nous allons mettre en place une Truffle Optimism Bridge Box . Nous pouvons exécuter la commande unbox dans n'importe quel répertoire de votre choix en utilisant la commande suivante.
npx truffle unbox optimism-bridge <DIRECTORY_NAME>
Remplacez <DIRECTORY_NAME> par le nom du répertoire de votre choix. Alternativement, vous pouvez installer Truffle globalement et exécuter la commande unbox.
npm install -g truffle truffle unbox optimism-bridge <DIRECTORY_NAME>
La commande doit télécharger et exécuter npm install dans le cadre du processus de déballage.
Maintenant, exécutez la commande suivante pour remplacer le répertoire par le nouveau que nous venons de créer.
cd truffle-bridge-demo
Remarque : truffle-bridge-demo est le nom de notre répertoire qui a été créé.
Nous devrions avoir quelque chose de similaire à ce qui apparaît ci-dessous.
Le . Le package dotenv
npm a été installé, mais nous devrons ajouter des informations au fichier .env créé après le déballage.
Le fichier truffle-config.ovm.js
s'attend à ce qu'une valeur GOERLI_MNEMONIC existe dans le fichier .env pour exécuter des commandes sur les réseaux de test Ethereum Goerli et Optimism Goerli et une INFURA_KEY pour se connecter au réseau.
GOERLI_MNEMONIC="<your-wallet-mnemonic>" INFURA_KEY="<your-infura-key>"
Remplacez <your-infura-key> par les informations que nous avons obtenues précédemment de notre tableau de bord Infura. ( Remarque : Ne partagez jamais vos clés privées (mnémotechniques) avec qui que ce soit et conservez-les en sécurité). Et remplacez <your-wallet-mnemonic> par votre mnémonique comme indiqué ci-dessous :
Pour récupérer le mnémonique de Metamask, cliquez sur l'icône ci-dessous sur votre Metamask.
Ensuite, cliquez sur le bouton Exporter la clé privée pour copier le mnémonique.
Git ignore le fichier .env dans ce projet pour aider à protéger vos données privées. C'est une bonne pratique de sécurité d'éviter de divulguer vos clés privées à GitHub.
Lorsque nous avons déballé le projet, tous les contrats et scripts requis pour notre projet ont été créés pour nous. Dans cette prochaine étape, passons en revue les contrats individuels et les migrations pour comprendre comment le pontage et les interactions se produisent entre les réseaux.
Le contrat contract/ethereum/GreeterL1.sol
vous montre comment envoyer un message sur le pont Optimism de L1 à L2.
//SPDX-License-Identifier: Unlicense // This contract runs on L1, and controls a Greeter on L2. pragma solidity ^0.8.0; import { ICrossDomainMessenger } from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol"; contract GreeterL1 { address crossDomainMessengerAddr = 0x5086d1eEF304eb5284A0f6720f79403b4e9bE294; address greeterL2Addr = 0xC0836cCc8FBa87637e782Dde6e6572aD624fb984; function setGreeting(string calldata _greeting) public { bytes memory message; message = abi.encodeWithSignature("setGreeting(string)", _greeting); ICrossDomainMessenger(crossDomainMessengerAddr).sendMessage( greeterL2Addr, message, 1000000 // within the free gas limit amount ); } // function setGreeting } // contract GreeterL1
La migration migrations/3_set_L2_greeting.js
utilise le contrat ci-dessus pour envoyer un message d'Ethereum à Optimism.
var Greeter = artifacts.require("GreeterL1"); /** * Set L2 Greeting * Run this migration on L1 to update the L1 greeting. */ module.exports = async function (deployer) { console.log("Updating the L2 Greetings contract from L1! 👋👋"); const instance = await Greeter.deployed(); const tx = await instance.setGreeting("👋 Greetings from Truffle!"); console.log(`🙌 Greeter txn confirmed on L1! ${tx.receipt.transactionHash}`); console.log(`🛣️ Bridging message to L2 Greeter contract...`); console.log( `🕐 In about 1 minute, check the Greeter contract "read" function: https://goerli-optimism.etherscan.io/address/0xC0836cCc8FBa87637e782Dde6e6572aD624fb984#readContract` ); };
Ensuite, le contracts/optimism/GreeterL2.sol
envoie un message dans l'autre sens (L2->L1) sur le pont Optimism.
//SPDX-License-Identifier: Unlicense // This contract runs on L2, and controls a Greeter on L1. pragma solidity ^0.8.0; import { ICrossDomainMessenger } from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol"; contract GreeterL2 { address crossDomainMessengerAddr = 0x4200000000000000000000000000000000000007; address greeterL1Addr = 0x7fA4D972bB15B71358da2D937E4A830A9084cf2e; function setGreeting(string calldata _greeting) public { bytes memory message; message = abi.encodeWithSignature("setGreeting(string)", _greeting); ICrossDomainMessenger(crossDomainMessengerAddr).sendMessage( greeterL1Addr, message, 1000000 // irrelevant here ); } // function setGreeting } // contract GreeterL2
La migration migrations/4_set_L1_greeting.js
utilise le contrat ci-dessus pour envoyer un message d'Optimism à Ethereum.
require("dotenv").config(); const sdk = require("@eth-optimism/sdk"); const ethers = require("ethers"); const Greeter = artifacts.require("GreeterL2"); const goerliMnemonic = process.env["GOERLI_MNEMONIC"]; const infuraKey = process.env["INFURA_KEY"]; const sleep = (milliseconds) => { return new Promise((resolve) => setTimeout(resolve, milliseconds)); }; /** * Set L1 Greeting * Run this migration on L1 to update the L1 greeting. */ module.exports = async function (deployer) { const newGreeting = "👋 Greetings from Truffle!"; //<---- CHANGE THIS VALUE TO YOUR NAME!!! const instance = await Greeter.deployed(); console.log("Updating the L1 Greetings contract from L2! 👋"); const tx = await instance.setGreeting(newGreeting); const txHash = tx.receipt.transactionHash; console.log(`🙌🙌 Greeter txn confirmed on L2! ${txHash}`); console.log( `🛣️ Bridging message to L1 Greeter contract.\n 🕐 This will take at least 1-5 min...` ); // Set providers for Optimism sdk const l1Provider = new ethers.providers.JsonRpcProvider( "https://goerli.infura.io/v3/" + infuraKey ); const l2Provider = new ethers.providers.JsonRpcProvider( "https://optimism-goerli.infura.io/v3/" + infuraKey ); // Connect an L1 signer const wallet = ethers.Wallet.fromMnemonic(goerliMnemonic); const l1Signer = wallet.connect(l1Provider); // Initialize sdk messenger const crossChainMessenger = new sdk.CrossChainMessenger({ l1ChainId: 5, l2ChainId: 420, l1SignerOrProvider: l1Signer, l2SignerOrProvider: l2Provider, }); let statusReady = false; // Sleep for 1 min during L2 -> L1 bridging await sleep(60000); // 60 seconds // Poll the L1 msg status while (!statusReady) { let status = null; status = await crossChainMessenger.getMessageStatus(txHash); statusReady = status == sdk.MessageStatus.READY_FOR_RELAY; if (!statusReady) { console.log( "Message not yet received on L1.\n 🕐 Retrying in 10 seconds..." ); await sleep(10000); // 10 seconds } } console.log("📬 Message received! Finalizing..."); // Open the message on L1 finalize = await crossChainMessenger.finalizeMessage(txHash); console.log( `🎉 Message finalized. Check the L1 Greeter contract "read" function: https://goerli.etherscan.io/address/0x7fA4D972bB15B71358da2D937E4A830A9084cf2e#readContract` ); };
Dans le répertoire des scripts, nous avons également goerli_bridge_message.mjs
et goerli_bridge_value.js
pour automatiser le processus de compilation des contrats, d'exécution des migrations et d'envoi de messages.
Ensuite, nous déploierons notre contrat sur Goerli. Le script d'assistance facilite la compilation, la migration et le pontage des messages entre Ethereum Goerli et Optimism Goerli.
Sur ces réseaux, nous aurons besoin de testnet ETH pour l'utiliser. Pour en recevoir, utilisez un robinet . Nous devrons également ajouter le module complémentaire Optimisme à votre compte Infura.
Ensuite, nous allons exécuter la commande suivante pour démarrer le projet.
npm run deploy
Vous trouverez ci-dessous une URL pour confirmer (via Etherscan) le message ponté après la migration complète.
Un lien pour confirmer le message ponté via Etherscan sera fourni à la fin de la 4ème migration.
Nous avons configuré, installé, construit, déployé et parcouru avec succès le projet que nous avons déballé plus tôt. Ensuite, nous vérifierons le projet sur le testnet Goerli Ethereum.
Dirigez-vous vers l'explorateur de blocs Goerli Etherscan et collez l'adresse txn 0xbcc1746a9ebbfcfb71665225c1a353a8c8dc9a1aa528a3babcb5b046d615a353 qui s'est affichée sur notre CLI lors du déploiement.
Un monde web3 multi-chaînes est crucial si nous voulons que l'expérience utilisateur et développeur continue de s'améliorer. Et pour y parvenir, nous avons besoin de moyens permettant aux dapps de communiquer rapidement et de manière transparente entre les chaînes.
J'espère que l'exemple que nous avons parcouru en utilisant la boîte à truffes Optimism Bridge vous a montré un moyen relativement simple et rapide de démarrer. Pour en savoir plus, consultez la documentation officielle .
Passez une très bonne journée !