DEV Community

Cover image for Scroll Testnet a lancé! 🚀🚀
Ahmed Castro
Ahmed Castro

Posted on • Updated on

Scroll Testnet a lancé! 🚀🚀

2022 et 2023 sera l'époque des zkRollups compatibles avec Solidity. Dans cette vidéo on va explorer Scroll, un zkRollup très facile à utiliser parce qu'il nous offre une expérience similaire à Layer 1.

En ce moment Scroll est dans une Alpha fermé, alors si vous voulez être whitelisté vous devez remplir ce formulaire et attendre la confirmation.

Dépendances

Pour ce tutoriel tu vas avoir besoin de NodeJs, je vous conseille de le télécharger avec NVM, aussi on aura besoin de Metamask.

1. Ajoutez Scroll Layer 1 et Layer 2 en Metamask

Layer 1 testnet

Nom du réseau: Scroll L1 Testnet
Nouvelle URL de RPC: https://prealpha.scroll.io/l1
ID de chaîne: 534351
Symbole de la devise: TSETH
URL de l’explorateur de blocs: https://l1scan.scroll.io/

Layer 2 testnet

Nom du réseau: Scroll L2 Testnet
Nouvelle URL de RPC: https://prealpha.scroll.io/l2
ID de chaîne: 534354
Symbole de la devise: TSETH
URL de l’explorateur de blocs: https://l2scan.scroll.io/

2. Recevoir du Ether d'une faucet

Recevez TSETH d'une faucet. Et envoyez des fonds de L1 a L2 a travers le bridge.

3. Lancez une DApp

a. Le Smart Contract

Vous pouvez lancer ce smart contract en Remix, assurez-vous de sélectionner a Scroll L2 en Metamask.

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

contract HelloWorld {
    string public hello = "Hola mundo!";

    function setHello(string memory hello_) public
    {
        hello = hello_;
    }
}
Enter fullscreen mode Exit fullscreen mode

b. Le HTML

Créez le fichier HTML dans un nouveau dossier.

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
</head>
<body>
  <input id="connect_button" type="button" value="Connect" onclick="connectWallet()" style="display: none"></input>
  <p id="web3_message"></p>
  <p id="contract_state"></p>
  <h1>Hola Mundo! DApp</h1>
  <p id="hello"></p>
  <input type="input"  value="" id="hello_"></input>
  <input type="button" value="Set Hello" onclick="_setHello()"></input>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.3.5/web3.min.js"></script>
  <script type="text/javascript" src="blockchain_stuff.js"></script>
</body>
</html>

<script>
  function _setHello()
  {
    hello_ = document.getElementById("hello_").value
    setHello(hello_)
  }
</script>
Enter fullscreen mode Exit fullscreen mode

c. Le Javascript

Dans le même dossier ajoutez un fichier Javascript. Remarquez qu'on est on train d'utiliser le réseau 534354. De plus, rappelez vous de etablir la variableHELLO_WORLD_CONTRACT_ADDRESS avec l'adresse de ton contract.

blockchain_stuff.js

const NETWORK_ID = 534354
const HELLO_WORLD_CONTRACT_ADDRESS = "ADDRESS DE TU CONTRATO AQUI"
const HELLO_WORLD_ABI_PATH = "./HelloWorld.json"

var helloWorldContract
var accounts
var web3

function metamaskReloadCallback() {
  window.ethereum.on('accountsChanged', (accounts) => {
    document.getElementById("web3_message").textContent="Account changed, refreshing...";
    window.location.reload()
  })
  window.ethereum.on('networkChanged', (accounts) => {
    document.getElementById("web3_message").textContent="Network changed, refreshing...";
    window.location.reload()
  })
}

const getWeb3 = async () => {
  return new Promise((resolve, reject) => {
    if(document.readyState=="complete")
    {
      if (window.ethereum) {
        const web3 = new Web3(window.ethereum)
        window.location.reload()
        resolve(web3)
      } else {
        reject("must install MetaMask")
        document.getElementById("web3_message").textContent="Error: Please connect to metamask";
      }
    }else
    {
      window.addEventListener("load", async () => {
        if (window.ethereum) {
          const web3 = new Web3(window.ethereum)
          resolve(web3)
        } else {
          reject("must install MetaMask")
          document.getElementById("web3_message").textContent="Error: Please install Metamask";
        }
      });
    }
  });
};

const getContract = async (web3, address, abi_path) => {
  const response = await fetch(abi_path);
  const data = await response.json();

  const netId = await web3.eth.net.getId();
  contract = new web3.eth.Contract(
    data,
    address
    );
  return contract
}

async function loadDapp() {
  metamaskReloadCallback()
  document.getElementById("web3_message").textContent="Please connect to Metamask"
  var awaitWeb3 = async function () {
    web3 = await getWeb3()
    web3.eth.net.getId((err, netId) => {
      if (netId == NETWORK_ID) {
        var awaitContract = async function () {
          helloWorldContract = await getContract(web3, HELLO_WORLD_CONTRACT_ADDRESS, HELLO_WORLD_ABI_PATH)
          document.getElementById("web3_message").textContent="You are connected to Metamask"
          onContractInitCallback()
          web3.eth.getAccounts(function(err, _accounts){
            accounts = _accounts
            if (err != null)
            {
              console.error("An error occurred: "+err)
            } else if (accounts.length > 0)
            {
              onWalletConnectedCallback()
            } else
            {
              document.getElementById("connect_button").style.display = "block"
            }
          });
        };
        awaitContract();
      } else {
        document.getElementById("web3_message").textContent="Please connect to Arbitrum Testnet";
      }
    });
  };
  awaitWeb3();
}

async function connectWallet() {
  await window.ethereum.request({ method: "eth_requestAccounts" })
  accounts = await web3.eth.getAccounts()
  onWalletConnectedCallback()
}

loadDapp()

const onContractInitCallback = async () => {
  var hello = await helloWorldContract.methods.hello().call()
  document.getElementById("hello").textContent = hello;
}

const onWalletConnectedCallback = async () => {
}

//// Functions ////

const setHello = async (hello_) => {
  const result = await helloWorldContract.methods.setHello(hello_)
  .send({ from: accounts[0], gas: 0, value: 0 })
  .on('transactionHash', function(hash){
    document.getElementById("web3_message").textContent="Executing...";
  })
  .on('receipt', function(receipt){
    document.getElementById("web3_message").textContent="Success.";    })
  .catch((revertReason) => {
    console.log("ERROR! Transaction reverted: " + revertReason.receipt.transactionHash)
  });
}
Enter fullscreen mode Exit fullscreen mode

d. Le JSON ABI

Finalement ajoutez le fichier JSON ABI.

HelloWorld.json

[
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "hello_",
        "type": "string"
      }
    ],
    "name": "setHello",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "hello",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]
Enter fullscreen mode Exit fullscreen mode

4. Essayez le site web

npm install -g lite-server
lite-server
Enter fullscreen mode Exit fullscreen mode

Allez a localhost:3000 en ton browser pour essayer la DApp.

¡Merci pour voir ce video!

Suivez nous ici en dev.to et en Youtube pour tout ce qui a à voir avec Blockchain en Francais.

Top comments (0)