Использование блоков Truffle L2 для объединения сетей блокчейна

Использование блоков Truffle L2 для объединения сетей блокчейна

23 декабря 2022 г.

Хорошо известно, что многие блокчейны имеют проблемы с масштабируемостью и перегрузкой. Эти проблемы имеют широкий спектр последствий: от медленного времени транзакций до увеличения комиссий за транзакции и ухудшения качества обслуживания пользователей.

Одно из решений состоит в том, чтобы web3 был мультицепным с использованием цепочек L2 (второй уровень). Ethereum L2, такие как Optimism, Arbitrum и Polygon, основанные на сети Ethereum, но быстрее и дешевле, чем Ethereum.

Однако в качестве компромисса они часто менее безопасны, чем Ethereum. Вот почему L2 обрабатывают повседневную деятельность пользователей, по-прежнему полагаясь на Ethereum L1 как на закулисную основу для безопасного и децентрализованного уровня расчетов и доступности данных.

Это отличное решение , однако только на Эфириуме есть много L2; каждая из них представляет собой отдельную сеть со своими нюансами и возможностями.

Создание и использование децентрализованных приложений, которые взаимодействуют и перемещаются между этими сетями и Ethereum L1, может быть утомительным, сложным и неудобным для пользователей и разработчиков.

Нам нужно, чтобы web3 стал мультичейн, где потребителям не нужно знать, какую цепочку они используют (и, честно говоря, им все равно), а разработчики могут положиться на что угодно. сеть наилучшим образом отвечает потребностям их децентрализованных приложений.

Благодаря переходу на многоцепочечный интернет блокчейнов, web3 становится удобнее для всех участников.

К сожалению, позволить децентрализованным приложениям перемещаться между цепочками — сложная техническая задача. В этой статье мы рассмотрим одно решение  — использование конечных точек Infura RPC и Truffle Boxes для построения и бесшовного соединения этих сетей.

В частности, мы будем использовать Truffle Box Optimism Bridge, чтобы создать проект в тестовой сети Ethereum Goerli и подключиться к Optimism Goerli. .

Запуск многоцепочечного децентрализованного приложения с использованием Infura и Truffle Boxes

Коробки с трюфелями

В качестве ядра нашего примера решения мы будем полагаться на Truffle Boxes  — "быстрые" шаблоны (такие как контракты, библиотеки , модули и даже полнофункциональные децентрализованные приложения) от ConsenSys, которые вы можете использовать для создания своего децентрализованного приложения.

Для многоцепочечных решений они строятся поверх узлов Infura RPC для многих сетей L2.

Как упоминалось выше, мы будем полагаться на коробку для трюфелей Optimism Bridge. В этом блоке есть все контракты, необходимые для взаимодействия с мостом Optimism из L1 и L2, а также набор миграций для развертывания, вызова функций и передачи сообщений/значений между уровнями.

У него даже есть вспомогательный скрипт, который делает все, что нам нужно, чтобы увидеть все это в действии. Нам просто нужно распаковать его, чтобы получить все, что нам нужно! Согласно Trufflesuite.com, в комплект входят:

* «Контракт L1, который отправляет сообщение по мосту Оптимизма * Миграция, которая отправляет сообщение из Ethereum в Optimism. * Контракт L2, который отправляет сообщение через мост Optimism. * Миграция, которая отправляет сообщение из Optimism в Ethereum. * Скрипт для автоматизации составления контрактов, выполнения миграций и отправки сообщений * Скрипт для автоматизации отправки ETH и DAO через мост”

Примечание: мост — это инструмент, который позволяет независимым цепочкам блоков взаимодействовать друг с другом, отправлять токены, NFT и т. д.

Предпосылки

Прежде чем начать, нам потребуются следующие предварительные условия:

* Node.js и его менеджер пакетов NPM. * Убедитесь, что у нас установлен Node.js, используя следующую команду терминала:

узел -v && нпм -v

Шаг 1 — Создание учетной записи Infura для доступа к сети

Выполнив все предварительные требования, посетите веб-сайт Infura, чтобы войти (или зарегистрируйте новую учетную запись).

После успешной регистрации страница перенаправляется на панель инструментов Infura, где мы можем создать новый ключ API, как показано ниже.

Нажмите кнопку "Создать новый ключ" и введите необходимую информацию.

После создания ключа API идентификатор вашего проекта будет отображаться на панели инструментов в разделе КЛЮЧ API, как показано ниже. Скопируйте и сохраните его где-нибудь; он понадобится вам позже в этом руководстве.

Шаг 2 — Настройка и установка

Далее мы настроим мост трюфельного оптимизма. Мы можем запустить команду распаковки в любом каталоге по вашему выбору, используя следующую команду.

npx truffle unbox optimism-bridge <DIRECTORY_NAME>

Замените <имя_каталога> на имя каталога по вашему выбору. Кроме того, вы можете установить Truffle глобально и выполнить команду распаковки.

npm install -g truffle
truffle unbox optimism-bridge <DIRECTORY_NAME>

Команда должна загрузить и запустить npm install как часть процесса распаковки.

Теперь выполните следующую команду, чтобы изменить каталог на новый, который мы только что создали.

cd truffle-bridge-demo

Примечание: truffle-bridge-demo — это имя нашего созданного каталога.

У нас должно получиться что-то похожее на то, что показано ниже.

Пакет .dotenv npm установлен, но нам нужно добавить некоторую информацию в файл .env, созданный после распаковки.

Файл truffle-config.ovm.js предполагает наличие значения GOERLI_MNEMONIC в файле .env для запуска команд в тестовых сетях Ethereum Goerli и Optimism Goerli и INFURA_KEY для подключения к сети.

GOERLI_MNEMONIC="<your-wallet-mnemonic>"
INFURA_KEY="<your-infura-key>"

Замените информацией, которую мы получили ранее из нашей информационной панели Infura. (Примечание: никому не сообщайте свои закрытые ключи (мнемоники) и храните их в безопасности). И замените своим мнемоническим кодом, как показано ниже:

Чтобы получить мнемонику из Metamask, щелкните значок, показанный ниже в вашей Metamask.

Затем нажмите кнопку Экспорт закрытого ключа, чтобы скопировать мнемонику.

Git игнорирует файл .env в этом проекте, чтобы защитить ваши личные данные. Хорошей практикой безопасности является избегание раскрытия ваших закрытых ключей GitHub.

Шаг 3 — Соединение с помощью блоков Truffle L2

Когда мы распаковали проект, для нас были созданы все необходимые контракты и сценарии. На следующем этапе давайте рассмотрим отдельные контракты и миграции, чтобы понять, как происходит соединение и взаимодействие между сетями.

Контракт contract/ethereum/GreeterL1.sol показывает, как отправить сообщение по мосту Optimism с 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

Миграция migrations/3_set_L2_greeting.js использует приведенный выше контракт для отправки сообщения из 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`
  );
};

Затем контракт contracts/optimism/GreeterL2.sol отправляет сообщение в другом направлении (L2->L1) по мосту 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

Миграция migrations/4_set_L1_greeting.js использует приведенный выше контракт для отправки сообщения из 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`
  );
};

В каталоге скриптов у нас также есть goerli_bridge_message.mjs и goerli_bridge_value.js для автоматизации процесса составления контрактов, выполнения миграций и отправки сообщений.

Шаг 4  — «Завершение компиляции, миграции и согласования контракта между Ethereum Goerli и Optimism Goerli

Далее мы развернем наш контракт с Goerli. Вспомогательный скрипт облегчает компиляцию, перенос и соединение сообщений между Ethereum Goerli и Optimism Goerli.

В этих сетях нам понадобится тестовая сеть ETH, чтобы использовать ее. Чтобы получить их, используйте кран. Нам также потребуется добавить надстройку Optimism в вашу учетную запись Infura.

Затем мы запустим следующую команду, чтобы запустить проект.

npm run deploy

Ниже приведен URL-адрес для подтверждения (через Etherscan) сообщения с мостом после полной миграции.

Ссылка для подтверждения пересылки сообщения через Etherscan будет предоставлена ​​после завершения четвертой миграции.

Шаг 5  — «Убедитесь, что проект успешно запущен в тестовой сети Goerli с помощью Block Explore

Мы успешно настроили, установили, построили, развернули и прошлись по проекту, который распаковали ранее. Далее мы проверим проект в тестовой сети Goerli Ethereum.

Перейдите в обозреватель блоков Goerli Etherscan и вставьте адрес txn 0xbcc1746a9ebbfcfb71665225c1a353a8c8dc9a1aa528a3babcb5b046d615a353, который отображался в нашем интерфейсе командной строки при развертывании.

https://goerli-optimism.etherscan.io/tx/0xbcc1746a9ebbfcfb71665225c1a353a8c8dc9a1aa528a3babcb5b046d615a353

Заключение

Мир web3 с несколькими цепочками имеет решающее значение, если мы хотим, чтобы взаимодействие пользователей и разработчиков продолжало улучшаться. И для этого нам нужны способы, с помощью которых децентрализованные приложения смогут быстро и беспрепятственно обмениваться данными между цепочками.

Надеемся, что пример, который мы рассмотрели с использованием трюфельной коробки Optimism Bridge, показал вам относительно простой и быстрый способ начать работу. Чтобы узнать больше, ознакомьтесь с официальной документацией.

Хорошего дня!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE