Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi
Bu Waffle öğreticisinde, hardhat ve ethers.js 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 initveya
npm initve gerekli paketleri kurarak başlayalım:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chaiveya
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chaiSonraki 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österCreate 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österBiraz 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österAkıllı sözleşmemiz üç bölüme ayrılabilir:
- constructor - burada
greetingadında bir dize türü değişkeni bildiririz, - function greet - çağrıldığında
greetingdöndüren bir fonksiyon, - function setGreeting -
greetingdeğ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österSonraki 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 changedBuraya 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österGö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 failingTümünü gösterBu fonksiyonu akıllı sözleşmemize uygulayalım:
1require(bytes(_greeting).length > 0, "Greeting should not be empty");Ş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}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 bakın.