Návod na ukázkový Hello World s Waffle, hardhat a ethers
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 initnebo
npm inita instalací požadovaných balíčků:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chainebo
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chaiDalším krokem je vytvoření ukázkového projektu hardhat spuštěním 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👷 Welcome to Hardhat v2.0.3 👷? What do you want to do? …❯ Create a sample projectCreate an empty hardhat.config.jsQuitZobrazit všeVyberte Create a sample project
Struktura našeho projektu by měla vypadat takto:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributes10├── .gitignore11├── hardhat.config.js12└── package.jsonZobrazit všePojďme se nyní podívat na některé z těchto souborů:
- Greeter.sol – náš chytrý kontrakt napsaný v Solidity;
1contract Greeter {2string greeting;34constructor(string memory _greeting) public {5console.log("Deploying a Greeter with greeting:", _greeting);6greeting = _greeting;7}89function greet() public view returns (string memory) {10return greeting;11}1213function setGreeting(string memory _greeting) public {14console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);15greeting = _greeting;16}17}Zobrazit všeNáš chytrý kontrakt lze rozdělit na tři části:
- konstruktor – kde deklarujeme proměnnou typu string s názvem
greeting, - funkce greet – funkce, která po zavolání vrátí
greeting, - 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!")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})Zobrazit všeDalší 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 changedZatí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!")45 await greeter.deployed()6 await expect(greeter.setGreeting("")).to.be.revertedWith(7 "Greeting should not be empty"8 )9})Zobrazit všeVypadá 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 failingZobrazit všePojď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