Ana içeriğe geç

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

waffle
akıllı kontratlar
solidity
test etmek
hardhat
ethers.js
Acemi
MiZiet
16 Ekim 2020
3 dakikalık okuma

Bu Waffleopens in a new tab öğreticisinde, hardhatopens in a new tab ve ethers.jsopens 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 bir proje oluşturarak başlayalım:

yarn init

veya

npm init

ve gerekli paketleri kurarak:

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 komutunu ç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 sürümüne hoş geldiniz 👷‍
? Ne yapmak istersiniz? …
❯ Örnek bir proje oluştur
Boş bir hardhat.config.js oluştur
Çık
Tümünü göster

Create a sample project seçeneğini 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├── .gitattributes
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("Bir Greeter şu selamlama ile dağıtılıyor:", _greeting);
6greeting = _greeting;
7}
8
9function greet() public view returns (string memory) {
10return greeting;
11}
12
13function setGreeting(string memory _greeting) public {
14console.log("'%s' olan selamlama '%s' olarak değiştiriliyor", greeting, _greeting);
15greeting = _greeting;
16}
17}
Tümünü göster

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

  1. constructor - greeting adında bir dize türü değişkeni bildirdiğimiz yer,
  2. function greet - çağrıldığında greeting değerini 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("Değiştirildiğinde yeni selamlamayı döndürmelidir", 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

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 komutunu çalıştırmak ve aşağıdaki mesajın görünmesini beklemektir.

✓ Değiştirildiğinde yeni selamlamayı döndürmelidir

Şu ana kadar her şey harika görünüyor, projemize biraz daha karmaşıklık ekleyelim

Birinin selamlama olarak boş bir dize eklediği bir durum hayal edin. Bu sıcak bir karşılama olmazdı, değil mi?
Bunun olmamasını sağlayalım:

Birisi boş bir dize geçtiğinde solidity'nin revert özelliğini kullanmak istiyoruz. İyi yanı ise bu işlevselliği Waffle'ın chai eşleştiricisi to.be.revertedWith() ile kolayca test edebilmemizdir.

1it("Boş bir dize geçirildiğinde geri alınmalıdır", 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 "Selamlama boş olmamalıdır"
8 )
9})
Tümünü göster

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

Bir Greeter şu selamlama ile dağıtılıyor: Hello, world!
'Hello, world!' olan selamlama 'Hola, mundo!' olarak değiştiriliyor
✓ Değiştirildiğinde yeni selamlamayı döndürmelidir (1514ms)
Bir Greeter şu selamlama ile dağıtılıyor: Hello, world!
'Hello, world!' olan selamlama '' olarak değiştiriliyor
1) Boş bir dize geçirildiğinde geri alınmalıdır
1 geçen (2s)
1 başarısız
Tümünü göster

Bu işlevselliği akıllı sözleşmemize uygulayalım:

1require(bytes(_greeting).length > 0, "Selamlama boş olmamalıdır");

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

1function setGreeting(string memory _greeting) public {
2require(bytes(_greeting).length > 0, "Selamlama boş olmamalıdır");
3console.log("'%s' olan selamlama '%s' olarak değiştiriliyor", greeting, _greeting);
4greeting = _greeting;
5}

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

✓ Değiştirildiğinde yeni selamlamayı döndürmelidir (1467ms)
✓ Boş bir dize geçirildiğinde geri alınmalıdır (276ms)
2 geçen (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 işlevselliklerin nasıl uygulanacağını öğrendik.

Akıllı sözleşmelerinizi test etmek için daha fazla harika chai eşleştiricisi için Waffle'ın resmi belgelerineopens in a new tab göz atın.

Sayfanın son güncellenmesi: 8 Aralık 2023

Bu rehber yararlı oldu mu?