Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi
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 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👷 Hardhat v2.0.3 Hoşgeldin 👷? Ne yapmak istersin? …❯ Create a sample projectCreate an empty hardhat.config.jsQuitTümünü göster
Create a sample project
'i seçin
Projemizin yapısı bu şekilde gözükmeli:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributs10├── .gitignore11├── hardhat.config.js12└── package.jsonTümünü göster
Biraz da bu dosyalardan bahsedelim:
- Greeter.sol - solidity ile yazılmış akıllı sözleşmemiz;
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}Tümünü gösterKopyala
Akıllı sözleşmemiz üç bölüme ayrılabilir:
- constructor - burada
greeting
adında bir dize türü değişkeni bildiririz, - function greet - çağrıldığında
greeting
döndüren bir fonksiyon, - 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!")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})Tümünü gösterKopyala
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!")45 await greeter.deployed()6 await expect(greeter.setGreeting("")).to.be.revertedWith(7 "Greeting should not be empty"8 )9})Tümünü gösterKopyala
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 string1 passing (2s)1 failingTü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.
Son düzenleme: @pettinarip(opens in a new tab), 8 Aralık 2023