Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi
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 initveya
npm initve gerekli paketleri kurarak:
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 komutunu ç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 sürümüne hoş geldiniz 👷? Ne yapmak istersiniz? …❯ Örnek bir proje oluşturBoş bir hardhat.config.js oluşturÇıkTümünü gösterCreate a sample project seçeneğini seçin
Projemizin yapısı bu şekilde gözükmeli:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributes10├── .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("Bir Greeter şu selamlama ile dağıtılıyor:", _greeting);6greeting = _greeting;7}89function greet() public view returns (string memory) {10return greeting;11}1213function 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österAkıllı sözleşmemiz üç bölüme ayrılabilir:
- constructor -
greetingadında bir dize türü değişkeni bildirdiğimiz yer, - function greet - çağrıldığında
greetingdeğerini dö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("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!")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 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!")45 await greeter.deployed()6 await expect(greeter.setGreeting("")).to.be.revertedWith(7 "Selamlama boş olmamalıdır"8 )9})Tümünü gösterGö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ızTümünü gösterBu 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