Waffle spune „Salut, lume”; tutorial cu Hardhat și eteri
În acest tutorial Waffle(opens in a new tab) veți învăța cum să configurați un proiect de contract inteligent simplu „Hello world”, utilizând hardhat(opens in a new tab) și ethers.js(opens in a new tab). Apoi veți învăța cum să adăugați o nouă funcționalitate la contractul dvs. inteligent și cum să îl testați cu Waffle.
Să începem creând un nou proiect:
yarn init
sau
npm init
și instalând pachetele necesare:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
sau
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
Următorul pas este crearea unui exemplu de proiect hardhat executând 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.jsQuitAfișează tot
Selectați Crearea unui exemplu de proiect
Structura proiectului nostru ar trebui să fie:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributs10├── .gitignore11├── hardhat.config.js12└── package.jsonAfișează tot
Acum să vorbim despre unele dintre aceste fișiere:
- Greeter.sol - contractul nostru inteligent scris în 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}Afișează totCopiați
Contractul nostru inteligent poate fi împărțit în trei:
- „constructor” - unde declarăm o variabilă de tip string numită
greeting
, - funcția „greet” -o funcție care va returna
greeting
atunci când este apelată, - funcția „setGreeting” - o funcție care ne permite să schimbăm valoarea
greeting
.
- sample-test.js - fișierul nostru de teste
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})Afișează totCopiați
La pasul următor ne vom compila contractul și vom rula testele:
Testele Waffle folosesc Mocha (un framework de testare) cu Chai (o bibliotecă de afirmații). Trebuie doar să rulați testul npx hardhat
și să așteptați să apară următorul mesaj.
✓ Should return the new greeting once it's changed
Lucrurile merg grozav până acum, haideți să facem proiectul puțin mai complex
Imaginați-vă cum ar fi ca cineva să adauge un string gol ca salut. Nu ar fi un salut călduros, nu?
Să avem grijă ca acest lucru să nu se întâmple:
Atunci când cineva transmite un string gol, trebuie să folosim funcția solidity revert
. Este bine că putem testa cu ușurință această funcționalitate cu validatorul-matcher chai to.be.revertedWith()
al lui Waffle.
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})Afișează totCopiați
Se pare că nu a mers noul nostru test:
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 string1 passing (2s)1 failingAfișează tot
Să implementăm această funcționalitate în contractul nostru inteligent:
1require(bytes(_greeting).length > 0, "Greeting should not be empty");Copiați
Acum funcția noastră „setGreeting” arată astfel:
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}Copiați
Să rulăm din nou testele:
✓ Should return the new greeting once it's changed (1467ms)✓ Should revert when passing an empty string (276ms)2 passing (2s)
Felicitări! Ați reușit :)
Concluzie
Am făcut un proiect simplu cu Waffle, Hardhat și ethers.js. Am învățat cum să configurăm un proiect, să adăugăm un test și să implementăm noi funcționalități.
Dacă doriți să vă testați contractele inteligente și cu alți validatori-matchers chai excelenți, consultați documentele oficiale Waffle(opens in a new tab).
Ultima modificare: @pettinarip(opens in a new tab), 8 decembrie 2023