Tutorial Waffle hello world menggunakan hardhat dan ether
Dalam tutorial Waffle(opens in a new tab) ini, kita akan belajar cara menyiapkan proyek kontrak pintar "Hello world" yang sederhana, menggunakan hardhat(opens in a new tab) dan ethers.js(opens in a new tab). Kemudian kita akan belajar cara menambahkan fungsionalitas baru ke kontrak pintar kita dan cara mengujinya dengan Waffle.
Mari kita mulai dengan membuat proyek baru:
yarn init
atau
npm init
dan menginstal paket yang diperlukan:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
atau
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
Langkah selanjutnya adalah membuat proyek hardhat percontohan dengan menjalankan npx hardhat
.
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👷 Selamat datang di HardHat v2.0.3 👷? What do you want to do? …❯ Create a sample projectCreate an empty hardhat.config.jsQuitTampilkan semua
Pilih Buat proyek sampel
Struktur proyek kita seharusnya terlihat seperti ini:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributs10├── .gitignore11├── hardhat.config.js12└── package.jsonTampilkan semua
Sekarang mari kita bicara tentang beberapa file ini:
- Greeter.sol - kontrak pintar kita yang ditulis dalam solidity;
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}Tampilkan semuaSalin
Kontrak pintar kita dapat dibagi menjadi tiga bagian:
- constructor - tempat kami mendeklarasikan variabel tipe string yang disebut
greeting
, - function greet - sebuah fungsi yang akan mengembalikan
greeting
saat dipanggil, - function setGreeting - fungsi yang memungkinkan kita mengubah nilai
greeting
.
- sample-test.js - file tes kita
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})Tampilkan semuaSalin
Langkah selanjutnya terdiri dari mengompilasi kontrak kita dan menjalankan pengujian:
Pengujian wafel menggunakan Mocha (kerangka pengujian) dengan Chai (pustaka assertion). Yang harus Anda lakukan adalah menjalankan npx hardhat test
dan menunggu pesan berikut muncul.
✓ Should return the new greeting once it's changed
Semuanya terlihat bagus sejauh ini, mari tambahkan lebih banyak kerumitan pada proyek kita
Bayangkan suatu situasi ketika seseorang menambahkan string kosong sebagai salam. Ini bukan sapaan yang hangat, bukan?
Mari kita pastikan itu tidak terjadi:
Kita ingin menggunakan revert
solidity ketika seseorang melewati string kosong. Hal baiknya adalah kita bisa dengan mudah menguji fungsionalitas ini dengan to.be.revertedWith ()
matcher chai Waffle.
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})Tampilkan semuaSalin
Sepertinya tes baru kita tidak lulus:
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 failingTampilkan semua
Mari kita terapkan fungsi ini ke dalam kontrak pintar kita:
1require(bytes(_greeting).length > 0, "Salam tidak boleh kosong");Salin
Sekarang, fungsi setGreeting kita terlihat seperti ini:
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}Salin
Mari kita jalankan tes lagi:
✓ Should return the new greeting once it's changed (1467ms)✓ Should revert when passing an empty string (276ms)2 passing (2s)
Selamat! Anda berhasil :)
Kesimpulan
Kita membuat proyek sederhana dengan Waffle, Hardhat, dan eters.js. Kita mempelajari cara menyiapkan proyek, menambahkan pengujian, dan mengimplementasikan fungsionalitas baru.
Untuk chai matcher yang lebih hebat untuk menguji kontrak pintar Anda, lihat dokumen resmi Waffle(opens in a new tab).
Terakhir diedit: @pettinarip(opens in a new tab), 8 Desember 2023