Руководство Waffle «Hello world» с использованием Hardhat и ethers
В этом руководстве по Waffleopens in a new tab мы научимся настраивать простой проект умного контракта «Hello world» с использованием Hardhatopens in a new tab и ethers.jsopens in a new tab. Затем мы узнаем, как добавить новую функциональность в наш умный контракт и как протестировать ее с помощью Waffle.
Начнем с создания нового проекта:
yarn initили
npm initи установки необходимых пакетов:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chaiили
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chaiСледующий шаг — создание образца проекта Hardhat путем запуска npx hardhat.
888 888 888 888 888888 888 888 888 888888 888 888 888 8888888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888888 888 "88b 888P" d88" 888 888 "88b "88b 888888 888 .d888888 888 888 888 888 888 .d888888 888888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888👷 Добро пожаловать в Hardhat v2.0.3 👷? Что вы хотите сделать? ...❯ Создать образец проектаСоздать пустой hardhat.config.jsВыйтиПоказать всеВыберите Создать образец проекта
Структура нашего проекта должна выглядеть так:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributes10├── .gitignore11├── hardhat.config.js12└── package.jsonПоказать всеТеперь давайте поговорим о некоторых из этих файлов:
- Greeter.sol — наш умный контракт, написанный на Solidity;
1contract Greeter {2string greeting;34constructor(string memory _greeting) public {5console.log("Развертывание Greeter с приветствием:", _greeting);6greeting = _greeting;7}89function greet() public view returns (string memory) {10return greeting;11}1213function setGreeting(string memory _greeting) public {14console.log("Изменение приветствия с '%s' на '%s'", greeting, _greeting);15greeting = _greeting;16}17}Показать всеНаш умный контракт можно разделить на три части:
- конструктор — где мы объявляем строковую переменную с именем
greeting, - функция
greet— функция, которая возвращаетgreetingпри вызове, - функция
setGreeting— функция, которая позволяет нам изменить значениеgreeting.
- sample-test.js — наш файл с тестами
1describe("Greeter", function () {2 it("Должен возвращать новое приветствие после его изменения", async function () {3 const Greeter = await ethers.getContractFactory("Greeter")4 const greeter = await Greeter.deploy("Hello, world!")56 await greeter.deployed()7 expect(await greeter.greet()).to.equal("Hello, world!")89 await greeter.setGreeting("Hola, mundo!")10 expect(await greeter.greet()).to.equal("Hola, mundo!")11 })12})Показать всеСледующий шаг — компиляция нашего контракта и запуск тестов:
Тесты Waffle используют Mocha (тестовый фреймворк) с Chai (библиотекой утверждений). Все, что вам нужно сделать, — это запустить npx hardhat test и дождаться появления следующего сообщения.
✓ Должен возвращать новое приветствие после его измененияПока все выглядит отлично, давайте немного усложним наш проект
Представьте ситуацию, когда кто-то добавляет пустую строку в качестве приветствия. Это было бы не очень теплое приветствие, правда?
Давайте убедимся, что этого не произойдет:
Мы хотим использовать revert из Solidity, когда кто-то передает пустую строку. Хорошо то, что мы можем легко протестировать эту функциональность с помощью матчера to.be.revertedWith() из Waffle Chai.
1it("Должен отменяться при передаче пустой строки", async () => {2 const Greeter = await ethers.getContractFactory("Greeter")3 const greeter = await Greeter.deploy("Hello, world!")45 await greeter.deployed()6 await expect(greeter.setGreeting("")).to.be.revertedWith(7 "Приветствие не должно быть пустым"8 )9})Показать всеПохоже, наш новый тест не прошел:
Развертывание Greeter с приветствием: Hello, world!Изменение приветствия с 'Hello, world!' на 'Hola, mundo!' ✓ Должен возвращать новое приветствие после его изменения (1514ms)Развертывание Greeter с приветствием: Hello, world!Изменение приветствия с 'Hello, world!' на '' 1) Должен отменяться при передаче пустой строки 1 пройден (2s) 1 не пройденПоказать всеДавайте реализуем данную функциональность в нашем умном контракте:
1require(bytes(_greeting).length > 0, "Приветствие не должно быть пустым");Теперь наша функция setGreeting выглядит так:
1function setGreeting(string memory _greeting) public {2require(bytes(_greeting).length > 0, "Приветствие не должно быть пустым");3console.log("Изменение приветствия с '%s' на '%s'", greeting, _greeting);4greeting = _greeting;5}Давайте снова запустим тесты:
✓ Должен возвращать новое приветствие после его изменения (1467ms)✓ Должен отменяться при передаче пустой строки (276ms)2 пройдено (2s)Поздравляем! Вы сделали это :)
Заключение
Мы сделали простой проект с помощью Waffle, Hardhat и ethers.js. Мы научились настраивать проект, добавлять тест и реализовывать новую функциональность.
Чтобы узнать о других замечательных матчерах Chai для тестирования ваших умных контрактов, обратитесь к официальной документации Waffleopens in a new tab.
Последнее обновление страницы: 8 декабря 2023 г.