Przejdź do głównej zawartości

Pomóż nam zaktualizować tę stronę

🌏

Dostępna jest nowsza wersja tej strony, ale tylko w języku angielskim. Pomóż nam przetłumaczyć najnowszą wersję.

Przetłumacz stronę
Zobacz wersję po angielsku

Brak błędów!🐛

Ta strona nie jest tłumaczona. Na razie celowo zostawiliśmy tę stronę w języku angielskim.

Samouczek Waffle „powiedz Hello World” za pomocą hardhat i ethers

waffleinteligentne kontraktysoliditytestowaniehardhatethers.js
Początkujący
✍️MiZiet
📆16 października 2020
⏱️4 minuta czytania

Z tego samouczka Waffle dowiemy się, jak skonfigurować prosty projekt inteligentnego kontraktu „Hello world”, używając hardhat i ethers.js. Następnie dowiemy się, jak dodać nową funkcjonalność do naszego inteligentnego kontraktu i jak przetestować go z Waffle.

Zacznijmy od tworzenia nowego projektu:

yarn init

lub

npm init

i instalowania wymaganych pakietów:

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

lub

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

Następnym krokiem jest stworzenie przykładowego projektu hardhat, uruchamiając 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
Pokaż wszystko

Wybierz Create a sample project

Nasza struktura projektów powinna wyglądać tak:

1MyWaffleProject
2├── contracts
3│ └── Greeter.sol
4├── node_modules
5├── scripts
6│ └── sample-script.js
7├── test
8│ └── sample-test.js
9├── .gitattributs
10├── .gitignore
11├── hardhat.config.js
12└── package.json
13
Pokaż wszystko

Teraz porozmawiajmy o niektórych z tych plików:

  • Greeter.sol - nasz inteligentny kontrakt napisany w 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}
18
Pokaż wszystko
📋 Kopiuj

Nasz inteligentny kontrakt można podzielić na trzy części:

  1. konstruktor — gdzie deklarujemy zmienną typu string o nazwie greeting,
  2. funkcja greet — funkcja, która zwróci powitanie greeting po wywołaniu,
  3. funkcja setGreeting — funkcja, która pozwala nam zmienić wartość zmiennej greeting.
  • sample-test.js — nasz plik testowy
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})
13
Pokaż wszystko
📋 Kopiuj

Kolejny krok to skompilowanie kontraktu i uruchomienie testów:

Testy Waffle wykorzystują Mocha (framework do tworzenia tesów) razem z Chai (biblioteka asercji). Wszystko, co musisz zrobić, to uruchomić npx test hardhat i poczekać na pojawienie się następującej wiadomości.

✓ Should return the new greeting once it's changed

Wszystko wygląda dobrze i prosto do tej pory, dodajmy trochę więcej złożoności do naszego projektu :)

Wyobraź sobie, że dostajesz od kogoś pustą wiadomość jako powitanie. To nie byłoby ciepłe powitanie, prawda?
Upewnijmy się, że tak się nie stanie:

Chcemy użyć Solidity revert, gdy ktoś przekaże pusty ciąg. Dobrze, że możemy łatwo przetestować tę funkcjonalność z wyrażeniem matcher chai z Waffle to.bo.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})
10
Pokaż wszystko
📋 Kopiuj

Wygląda na to, że nasz nowy test nie przeszedł:

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
Pokaż wszystko

Zastosujmy tę funkcję do naszego inteligentnego kontraktu:

1require(bytes(_greeting).length > 0, "Greeting message is empty");
2
📋 Kopiuj

Teraz nasza funkcja setGreeting wygląda tak:

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}
6
📋 Kopiuj

Wykonajmy testy ponownie:

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

Gratulacje! Udało się :)

Podsumowanie

Stworzyliśmy prosty projekt z Waffle, Hardhat i ethers.js. Nauczyliśmy się, jak skonfigurować projekt, dodać test i wdrożyć nową funkcjonalność.

Aby dowiedzieć się więcej o znakomitych wyrażeniach matcher chai do testowania inteligentnych kontraktów, sprawdź oficjalne dokumenty Waffle'a.

Ostatnia edycja: , Invalid DateTime
Edytuj stronę

Czy ta strona była pomocna?