Ana içeriğe geç

Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi

waffleakıllı sözleşmelerkatılıktesthardhatethers.js
Acemi
MiZiet
16 Ekim 2020
3 dakikalık okuma minute read

Bu Waffle(opens in a new tab) öğreticisinde, hardhat(opens in a new tab) ve ethers.js(opens in a new tab) kullanarak basit bir "Merhaba dünya" akıllı sözleşme projesinin nasıl kurulacağını öğreneceğiz. Ardından akıllı sözleşmemize nasıl yeni bir işlevsellik ekleyeceğimizi ve Waffle ile nasıl test edeceğimizi öğreneceğiz.

Yeni proje oluşturarak başlayalım:

yarn init

veya

npm init

ve gerekli paketleri kurarak başlayalım:

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

veya

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

Sonraki adım, npx hardhat çalıştırarak örnek bir hardhat projesi oluşturmaktır.

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
👷 Hardhat v2.0.3 Hoşgeldin 👷‍
? Ne yapmak istersin? …
❯ Create a sample project
Create an empty hardhat.config.js
Quit
Tümünü göster

Create a sample project'i seçin

Projemizin yapısı bu şekilde gözükmeli:

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
Tümünü göster

Biraz da bu dosyalardan bahsedelim:

  • Greeter.sol - solidity ile yazılmış akıllı sözleşmemiz;
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}
Tümünü göster
Kopyala

Akıllı sözleşmemiz üç bölüme ayrılabilir:

  1. constructor - burada greeting adında bir dize türü değişkeni bildiririz,
  2. function greet - çağrıldığında greeting döndüren bir fonksiyon,
  3. function setGreeting - greeting değerini değiştirmemizi sağlayan bir fonksiyon.
  • sample-test.js - test dosyamız
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})
Tümünü göster
Kopyala

Sonraki adım, sözleşmemizi derlemek ve testleri çalıştırmaktan oluşur:

Waffle testleri, Mocha'yı (bir test çerçevesi) ve Chai'yi (bir teyit kütüphanesi) kullanır. Tek yapmanız gereken npx hardhat test çalıştırmak ve aşağıdaki mesajın görünmesini beklemek.

✓ Should return the new greeting once it's changed

Buraya kadar her şey harika görünüyor, hadi projemize biraz daha karmaşık hâle getirelim

Birinin selamlama olarak boş bir dize eklediği bir durum hayal edin. Pek sıcakkanlı bir selamlama olmaz, değil mi?
Bunun önüne geçelim:

Birisi boş bir dizeyi geçirdiğinde, solidity'nin revert özelliğini kullanmak istiyoruz. Bu işlevselliği Waffle'ın chai eşleyicisi to.be.revertedWith() ile kolayca test edebilmemiz oldukça faydalıdır.

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})
Tümünü göster
Kopyala

Görünüşe göre yeni testimiz geçemedi:

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
Tümünü göster

Bu fonksiyonu akıllı sözleşmemize uygulayalım:

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

Şimdi, setGreeting fonksiyonumuz bu şekilde gözüküyor:

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}
Kopyala

Tekrar testleri çalıştıralım:

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

Tebrikler! Başardınız :)

Sonuç

Waffle, Hardhat ve ethers.js ile basit bir proje yaptık. Bir projenin nasıl kurulacağını, bir testin nasıl ekleneceğini ve yeni fonksiyonların nasıl uygulanacağını öğrendik.

Akıllı sözleşmelerinizi test edecek daha fazla harika chai eşleyiciler için resmi Waffle belgelerine(opens in a new tab) bakın.

Bu rehber yararlı oldu mu?