11J ethereum hardhat : Форкинг других сетей

— Форкинг из mainnet

— Закрепление блока

— Пользовательские HTTP-заголовки

— Имперсонификация учетных записей

— Сброс форка

— Использование пользовательской истории хардфорка

— Учебники по хардфорку , хардфорк 教程

— Контакт 联系方式

— Форкинг от mainnet

Самый простой способ опробовать эту функцию — запустить узел из командной строки:

npx hardhat node --fork https://eth-mainnet.alchemyapi.io/v2/<key>
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы также можете настроить Hardhat Network так, чтобы она всегда это делала:

networks: {
  hardhat: {
    forking: {
      url: "https://eth-mainnet.alchemyapi.io/v2/<key>",
    }
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

(Обратите внимание, что вам нужно заменить компонент URL <key> на ваш личный ключ API Alchemy).

Обращаясь к любому состоянию, существующему в mainnet, Hardhat Network будет извлекать данные и открывать их прозрачно, как если бы они были доступны локально.

— Закрепление блока

По умолчанию Hardhat Network будет форкать с последнего блока mainnet. Хотя это может быть практичным в зависимости от контекста, для создания набора тестов, которые зависят от форков, мы рекомендуем форкать с определенного номера блока.

На это есть две причины:

  • Состояние, на котором работают ваши тесты, может меняться между запусками. Это может привести к тому, что ваши тесты или скрипты будут вести себя по-разному.
  • Соединять блоки позволяет кэширование. Каждый раз, когда данные извлекаются из mainnet, Hardhat Network кэширует их на диске, чтобы ускорить доступ к ним в будущем. Если не закрепить блок, то с каждым новым блоком будут поступать новые данные, и кэш не будет полезен. Мы измеряли до 20-кратного увеличения скорости при закреплении блока.

Для этого вам понадобится доступ к узлу с архивными данными. Поэтому мы рекомендуем [Alchemy], поскольку их бесплатные планы включают архивные данные.

Чтобы закрепить номер блока:

networks: {
  hardhat: {
    forking: {
      url: "https://eth-mainnet.alchemyapi.io/v2/<key>",
      blockNumber: 14390000
    }
  }
}
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Если вы используете задачу node, вы также можете указать номер блока с помощью флага --fork-block-number:

npx hardhat node --fork https://eth-mainnet.alchemyapi.io/v2/<key> --fork-block-number 14390000
Вход в полноэкранный режим Выход из полноэкранного режима

— Пользовательские HTTP-заголовки

Вы можете добавить дополнительные HTTP-заголовки, которые будут использоваться в любом запросе, сделанном к развиваемому узлу. Одна из причин сделать это — авторизация: вместо того, чтобы включать свои учетные данные в URL, вы можете использовать токен на предъявителя через пользовательский HTTP-заголовок:

networks: {
  hardhat: {
    forking: {
      url: "https://ethnode.example.com",
      httpHeaders: {
        "Authorization": "Bearer <key>"
      }
    }
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима

— Имперсонификация учетных записей

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

Проще всего это сделать с помощью метода ethers.getImpersonatedSigner, который добавляется к объекту ethers плагином hardhat-ethers:

const impersonatedSigner = await ethers.getImpersonatedSigner("0x1234567890123456789012345678901234567890");
await impersonatedSigner.sendTransaction(...);
Вход в полноэкранный режим Выход из полноэкранного режима

В качестве альтернативы можно использовать помощник impersonateAccount и затем получить подписанта для этого адреса:

const helpers = require("@nomicfoundation/hardhat-network-helpers");

const address = "0x1234567890123456789012345678901234567890";
await helpers.impersonateAccount(address);
const impersonatedSigner = await ethers.getSigner(address);
Войти в полноэкранный режим Выход из полноэкранного режима

— Сброс форка

Вы можете управлять форкингом во время выполнения, чтобы вернуться к свежему состоянию форкинга, форкнуть с другого номера блока или отключить форкинг, вызвав hardhat_reset:

await network.provider.request({
  method: "hardhat_reset",
  params: [
    {
      forking: {
        jsonRpcUrl: "https://eth-mainnet.alchemyapi.io/v2/<key>",
        blockNumber: 14390000,
      },
    },
  ],
});
Вход в полноэкранный режим Выход из полноэкранного режима

Вы можете отключить форкинг, передав пустые параметры:

await network.provider.request({
  method: "hardhat_reset",
  params: [],
});
Войти в полноэкранный режим Выйти из полноэкранного режима

Это приведет к перезагрузке Hardhat Network и запуску нового экземпляра в состоянии, описанном здесь.

— Использование пользовательской истории хардфорка

Если вы форкаете необычную сеть и хотите выполнять код EVM в контексте исторического блока, полученного из этой сети, то вам нужно настроить Hardhat Network так, чтобы она знала, какие хардфорки применять к тем или иным блокам. (Если вы создаете форк известной сети, Hardhat Network автоматически выберет подходящий хардфорк для выполнения вашего EVM-кода, основываясь на известной истории публичных сетей, поэтому вы можете смело игнорировать этот раздел).

Чтобы предоставить Hardhat Network историю активации хардфорка для вашей пользовательской сети, используйте поле конфигурации networks.hardhat.chains:

networks: {
  hardhat: {
    chains: {
      99: {
        hardforkHistory: {
          berlin: 10000000,
          london: 20000000,
        },
      }
    }
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

В данном контексте «исторический блок» — это блок, номер которого предшествует блоку, от которого вы сделали форк. Если вы попытаетесь выполнить код в контексте исторического блока, не имея истории хардфорка, то будет выдана ошибка. Известные истории хардфорков большинства публичных сетей принимаются по умолчанию.

Если вы запустите код в контексте неисторического блока, то сеть Hardhat просто будет использовать хардфорк, указанный в поле hardfork в ее конфигурации, например networks: { hardhat: { hardfork: "london" } }, вместо того, чтобы обращаться к конфигурации истории хардфорков.

См. также запись chains в справочнике по конфигурации сети Hardhat.

— hardhat Tutorials , hardhat 教程

CN 中文 Github hardhat 教程 : github.com/565ee/hardhat_CN

CN 中文 CSDN hardhat 教程 : blog.csdn.net/wx468116118

EN 英文 Github hardhat Tutorials : github.com/565ee/hardhat_EN

— Контакт 联系方式

Домашняя страница : 565.ee

GitHub : github.com/565ee

Электронная почта : 565.eee@gmail.com

Facebook : facebook.com/565.ee

Twitter : twitter.com/565_eee

Telegram : t.me/ee_565

Оцените статью
devanswers.ru
Добавить комментарий