์Šคํฌ๋กค Testnet a lance! ๐Ÿš€๐Ÿš€

30048 ๋‹จ์–ด
2022 ๋ฐ 2023 sera l'รฉpoque des zkRollups๋Š” Solidity์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. VA explorer Scroll์˜ ๋น„๋””์˜ค cette, 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.



์˜์กด์„ฑ



Pour cetutorial tu vas avoir besoin deNodeJs , je vous conseille de le tรฉlรฉcharger avecNVM , aussi on aura besoin deMetamask .

1. Ajoutez ์Šคํฌ๋กค ๋ ˆ์ด์–ด 1 ๋ฐ ๋ ˆ์ด์–ด 2 ๋ฐ ๋ฉ”ํƒ€๋งˆ์Šคํฌ



๋ ˆ์ด์–ด 1 ํ…Œ์ŠคํŠธ๋„ท



Nom du rรฉseau: Scroll L1 TestnetRPC์˜ ๋ˆ„๋ฒจ URL: https://prealpha.scroll.io/l1ID ๋“œ ์ฒด์ธ: 534351Symbole de la devise: TSETHURL de l'explorateur de blocs: https://l1scan.scroll.io/

๋ ˆ์ด์–ด 2 ํ…Œ์ŠคํŠธ๋„ท



Nom du rรฉseau: Scroll L2 TestnetRPC์˜ ๋ˆ„๋ฒจ URL: https://prealpha.scroll.io/l2ID ๋“œ ์ฒด์ธ: 534354Symbole de la devise: TSETHURL de l'explorateur de blocs: https://l2scan.scroll.io/

2. Recevoir du Ether d'une ์ˆ˜๋„๊ผญ์ง€



๋ฆฌ์„ธ๋ฒ ์ฆˆTSETH ๋“„faucet . Et envoyez des fonds de L1 a L2 a travers lebridge .

3. ๋ž€์„ธ์ฆˆ์œ ๋„ค DApp


ใ…. ๋ฅด ์Šค๋งˆํŠธ ๊ณ„์•ฝ



Vous pouvez lancer ce smart contract en Remix , Assurez-vous de selectionner 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_;
    }
}


๋น„. ๋ฅด 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>


์”จ. ๋ฅด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ



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 ๋ณ€์ˆ˜HELLO_WORLD_CONTRACT_ADDRESS avec l'adresse de ton ๊ณ„์•ฝ.
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)
  });
}


๋””. ๋ฅด 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"
  }
]


4. ์—์„ธ์ด์ฆˆ ๋ฅด ์‚ฌ์ดํŠธ ์›น




npm install -g lite-server
lite-server


Allez alocalhost:3000์™€ ๋ธŒ๋ผ์šฐ์ €๋Š” DApp์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ