Lanjut ke konten utama

Tutorial Waffle hello world menggunakan hardhat dan ether

wafflekontrak pintarsoliditypengujianhardhatethers.js
Pemula
MiZiet
16 Oktober 2020
4 bacaan singkat minute read

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 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
👷 Selamat datang di HardHat v2.0.3 👷‍
? What do you want to do? …
❯ Create a sample project
Create an empty hardhat.config.js
Quit
Tampilkan semua

Pilih Buat proyek sampel

Struktur proyek kita seharusnya terlihat seperti ini:

1MyWaffleProject
2├── contracts
3│ └── Greeter.sol
4├── node_modules
5├── scripts
6│ └── sample-script.js
7├── test
8│ └── sample-test.js
9├── .gitattributs
10├── .gitignore
11├── hardhat.config.js
12└── package.json
Tampilkan semua

Sekarang mari kita bicara tentang beberapa file ini:

  • Greeter.sol - kontrak pintar kita yang ditulis dalam solidity;
1contract Greeter {
2string greeting;
3
4constructor(string memory _greeting) public {
5console.log("Deploying a Greeter with greeting:", _greeting);
6greeting = _greeting;
7}
8
9function greet() public view returns (string memory) {
10return greeting;
11}
12
13function setGreeting(string memory _greeting) public {
14console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
15greeting = _greeting;
16}
17}
Tampilkan semua
Salin

Kontrak pintar kita dapat dibagi menjadi tiga bagian:

  1. constructor - tempat kami mendeklarasikan variabel tipe string yang disebut greeting,
  2. function greet - sebuah fungsi yang akan mengembalikan greeting saat dipanggil,
  3. 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!")
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})
Tampilkan semua
Salin

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!")
4
5 await greeter.deployed()
6 await expect(greeter.setGreeting("")).to.be.revertedWith(
7 "Greeting should not be empty"
8 )
9})
Tampilkan semua
Salin

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 string
1 passing (2s)
1 failing
Tampilkan 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: @Datenshi(opens in a new tab), 15 Agustus 2023

Apakah tutorial ini membantu?