Waffle spune „Salut, lume”; tutorial cu Hardhat și eteri
În acest tutorial Waffle, vei învăța cum să configurezi un proiect simplu de contract inteligent „Salut, lume”, utilizând hardhat și ethers.js. Apoi vei învăța cum să adaugi o nouă funcționalitate la contractul tău inteligent și cum să-l testezi cu Waffle.
Să începem cu crearea unui nou proiect:
yarn init
sau
npm init
și instalează 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👷 Bun venit la Hardhat v2.0.3 👷? What do you want to do ? (Ce vrei să faci?) …Create a sample project (Să creez un exemplu de proiect)Create an empty hardhat.config.jsQuitAfișează tot
Selectează Creează un exemplu de proiect
Structura proiectelor noastre ar trebui să arate astfel:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributs10├── .gitignore11├── hardhat.config.js12└── package.json13Afiș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("Implementare program Greeter cu salutări:", _greeting);6greeting = _greeting;7}89function greet() public view returns (string memory) {10return greeting;11}1213function setGreeting(string memory _greeting) public {14console.log("Schimbare salut din '%s' în '%s'", greeting, _greeting);15greeting = _greeting;16}17}18Afișează totCopiere
Contractul nostru inteligent poate fi împărțit în trei părți:
- „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("Trebuie să returneze noul mesaj de salut odată ce a fost schimbat", 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("Salut, lume!")10 expect(await greeter.greet()).to.equal("Salut, lume!")11 })12})13Afișează totCopiere
Pasul următor constă în compilarea contractelor și a testelor de execuție:
Testele Waffle folosesc Mocha (un cadru de testare) cu Chai (o bibliotecă de afirmații). Tot ce trebuie să faci este să rulezi npx hardhat test
și să aștepți să apară următorul mesaj.
✓ Trebuie să returneze noul mesaj de salut odată ce a fost schimbat
Totul arată bine până acum, hai să adăugăm ceva mai multă complexitate proiectului nostru
Imaginează-ți o situație când cineva adaugă un string gol ca salut. Nu ar fi un salut călduros, nu?
Să ne asigurăm că acest lucru nu se întâmplă:
Vrem să folosim funcția solidity revert
atunci când cineva transmite un string gol. Un lucru bun este că putem testa cu ușurință această funcționalitate cu validatorul matcher chai to.bo.revertedWith()
a lui Waffle..
1it("Trebuie să se schimbe când se transmite un string gol", 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 "Salutul nu trebuie să rămână gol"8 )9})10Afișează totCopiere
Se pare că noul nostru test nu a trecut:
Implementarea unui Greeter cu salut: Hello, world!Schimbarea salutului din „Hello, world!” în „Salut, lume!”✓ Trebuie să returneze noul mesaj de salut odată ce a fost schimbat (1514 ms)Implementarea unui Greeter cu salut: Salut, lume!Schimbarea salutului din „Salut, lume!” în „1) Trebuie să se schimbe când se transmite un string gol1 transmitere (2 s)1 nereușităAfișează tot
Să implementăm această funcționalitate în contractul nostru inteligent:
1require(bytes(_greeting).length > 0, "Mesajul de salut este gol");2Copiere
Acum, funcția noastră „setGreeting” arată astfel:
1function setGreeting(string memory _greeting) public {2require(bytes(_greeting).length > 0, "Salutul nu trebuie să fie gol");3console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);4greeting = _greeting;5}6Copiere
Să rulăm din nou testele:
✓ Trebuie să returneze noul mesaj de salut odată ce a fost schimbat (1467 ms)✓ Trebuie să se schimbe când se transmite un string gol (276 ms)2 transmiteri (2 secunde)
Felicitări! Ai 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.
Pentru mai mulți validatori matcher chai de mare valoare pentru testarea contractelor inteligente consultă documentele oficiale Waffle.