Přeskočit na hlavní obsah

Návod na ukázkový Hello World s Waffle, hardhat a ethers

waffle
smart kontrakt účty
solidity
testování
hardhat
ethers.js
Začátečník
MiZiet
16. října 2020
4 minuta čtení

V tomto Waffleopens in a new tab tutoriálu se naučíme, jak nastavit jednoduchý projekt s chytrým kontraktem "Hello world" s použitím hardhatopens in a new tab a ethers.jsopens in a new tab. Poté se naučíme, jak do našeho chytrého kontraktu přidat novou funkcionalitu a jak ji otestovat pomocí Waffle.

Začněme vytvořením nového projektu:

yarn init

nebo

npm init

a instalací požadovaných balíčků:

yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

nebo

npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

Dalším krokem je vytvoření ukázkového projektu hardhat spuštěním npx hardhat.

888 888 888 888 888
888 888 888 888 888
888 888 888 888 888
8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
888 888 "88b 888P" d88" 888 888 "88b "88b 888
888 888 .d888888 888 888 888 888 888 .d888888 888
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
👷 Welcome to Hardhat v2.0.3 👷‍
? What do you want to do? …
❯ Create a sample project
Create an empty hardhat.config.js
Quit
Zobrazit vše

Vyberte Create a sample project

Struktura našeho projektu by měla vypadat takto:

1MyWaffleProject
2├── contracts
3│ └── Greeter.sol
4├── node_modules
5├── scripts
6│ └── sample-script.js
7├── test
8│ └── sample-test.js
9├── .gitattributes
10├── .gitignore
11├── hardhat.config.js
12└── package.json
Zobrazit vše

Pojďme se nyní podívat na některé z těchto souborů:

  • Greeter.sol – náš chytrý kontrakt napsaný v Solidity;
1contract Greeter {
2string greeting;
3
4constructor(string memory _greeting) public {
5console.log("Deploying a Greeter with greeting:", _greeting);
6greeting = _greeting;
7}
8
9function greet() public view returns (string memory) {
10return greeting;
11}
12
13function setGreeting(string memory _greeting) public {
14console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
15greeting = _greeting;
16}
17}
Zobrazit vše

Náš chytrý kontrakt lze rozdělit na tři části:

  1. konstruktor – kde deklarujeme proměnnou typu string s názvem greeting,
  2. funkce greet – funkce, která po zavolání vrátí greeting,
  3. funkce setGreeting – funkce, která nám umožňuje změnit hodnotu greeting.
  • sample-test.js – náš soubor s testy
1describe("Greeter", function () {
2 it("Should return the new greeting once it's changed", async function () {
3 const Greeter = await ethers.getContractFactory("Greeter")
4 const greeter = await Greeter.deploy("Hello, world!")
5
6 await greeter.deployed()
7 expect(await greeter.greet()).to.equal("Hello, world!")
8
9 await greeter.setGreeting("Hola, mundo!")
10 expect(await greeter.greet()).to.equal("Hola, mundo!")
11 })
12})
Zobrazit vše

Další krok spočívá v kompilaci našeho kontraktu a spuštění testů:

Waffle testy používají Mocha (testovací framework) s Chai (knihovna asercí). Vše, co musíte udělat, je spustit npx hardhat test a počkat, až se objeví následující zpráva.

✓ Should return the new greeting once it's changed

Zatím to vypadá skvěle, pojďme do projektu přidat trochu na složitosti

Představte si situaci, kde někdo vloží prázdný řetězec jako pozdrav. To by nebyl moc vřelý pozdrav, že?
Postarejme se, aby se to nestalo:

Chceme použít funkci revert ze Solidity, když někdo předá prázdný řetězec. Dobrou zprávou je, že tuto funkcionalitu můžeme snadno otestovat pomocí Waffle chai matcheru to.be.revertedWith().

1it("Should revert when passing an empty string", async () => {
2 const Greeter = await ethers.getContractFactory("Greeter")
3 const greeter = await Greeter.deploy("Hello, world!")
4
5 await greeter.deployed()
6 await expect(greeter.setGreeting("")).to.be.revertedWith(
7 "Greeting should not be empty"
8 )
9})
Zobrazit vše

Vypadá to, že náš nový test neprošel:

Deploying a Greeter with greeting: Hello, world!
Changing greeting from 'Hello, world!' to 'Hola, mundo!'
✓ Should return the new greeting once it's changed (1514ms)
Deploying a Greeter with greeting: Hello, world!
Changing greeting from 'Hello, world!' to ''
1) Should revert when passing an empty string
1 passing (2s)
1 failing
Zobrazit vše

Pojďme tuto funkcionalitu implementovat do našeho chytrého kontraktu:

1require(bytes(_greeting).length > 0, "Greeting should not be empty");

Nyní naše funkce setGreeting vypadá takto:

1function setGreeting(string memory _greeting) public {
2require(bytes(_greeting).length > 0, "Greeting should not be empty");
3console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
4greeting = _greeting;
5}

Pojďme znovu spustit testy:

✓ Should return the new greeting once it's changed (1467ms)
✓ Should revert when passing an empty string (276ms)
2 passing (2s)

Výborně! Dali jste to! :)

Závěr

Vytvořili jsme jednoduchý projekt s Waffle, Hardhat a ethers.js. Naučili jsme se, jak nastavit projekt, přidat test a implementovat novou funkcionalitu.

Pro více skvělých chai matcherů k testování vašich chytrých kontraktů se podívejte do oficiální dokumentace Waffleopens in a new tab.

Stránka naposledy aktualizována: 8. prosince 2023

Byl tento tutoriál užitečný?