Nhảy đến nội dung chính

Hướng dẫn Waffle hello world với hardhat và ethers

Waffle
hợp đồng thông minh
Solidity
kiểm thử
Hardhat
ethers.js
Người mới bắt đầu
MiZiet
16 tháng 10, 2020
5 số phút đọc

Trong hướng dẫn Waffleopens in a new tab này, chúng ta sẽ học cách thiết lập một dự án hợp đồng thông minh "Hello world" đơn giản, sử dụng hardhatopens in a new tabethers.jsopens in a new tab. Sau đó, chúng ta sẽ học cách thêm một chức năng mới vào hợp đồng thông minh của mình và cách kiểm tra nó với Waffle.

Hãy bắt đầu bằng cách tạo một dự án mới:

yarn init

hoặc

npm init

và cài đặt các gói cần thiết:

yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

hoặc

npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

Bước tiếp theo là tạo một dự án hardhat mẫu bằng cách chạy 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
👷 Chào mừng đến với Hardhat v2.0.3 👷‍
? Bạn muốn làm gì? …
❯ Tạo một dự án mẫu
Tạo một tệp hardhat.config.js trống
Thoát
Hiện tất cả

Chọn Tạo một dự án mẫu

Cấu trúc dự án của chúng ta sẽ trông như thế này:

1MyWaffleProject
2├── contracts
3│ └── Greeter.sol
4├── node_modules
5├── scripts
6│ └── sample-script.js
7├── test
8│ └── sample-test.js
9├── .gitattributes
10├── .gitignore
11├── hardhat.config.js
12└── package.json
Hiện tất cả

Bây giờ hãy nói về một số tệp này:

  • Greeter.sol - hợp đồng thông minh của chúng ta được viết bằng solidity;
1contract Greeter {
2string greeting;
3
4constructor(string memory _greeting) public {
5console.log("Triển khai Greeter với lời chào:", _greeting);
6greeting = _greeting;
7}
8
9function greet() public view returns (string memory) {
10return greeting;
11}
12
13function setGreeting(string memory _greeting) public {
14console.log("Thay đổi lời chào từ '%s' thành '%s'", greeting, _greeting);
15greeting = _greeting;
16}
17}
Hiện tất cả

Hợp đồng thông minh của chúng ta có thể được chia thành ba phần:

  1. constructor - nơi chúng ta khai báo một biến kiểu chuỗi có tên là greeting,
  2. function greet - một hàm sẽ trả về greeting khi được gọi,
  3. function setGreeting - một hàm cho phép chúng ta thay đổi giá trị greeting.
  • sample-test.js - tệp kiểm tra của chúng ta
1describe("Greeter", function () {
2 it("Nên trả về lời chào mới sau khi nó được thay đổi", 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})
Hiện tất cả

Bước tiếp theo bao gồm việc biên dịch hợp đồng của chúng ta và chạy các bài kiểm tra:

Các bài kiểm tra Waffle sử dụng Mocha (một khung kiểm thử) với Chai (một thư viện xác nhận). Tất cả những gì bạn phải làm là chạy npx hardhat test và đợi thông điệp sau xuất hiện.

✓ Nên trả về lời chào mới sau khi nó được thay đổi

Mọi thứ cho đến nay đều tuyệt vời, hãy thêm một chút phức tạp vào dự án của chúng ta

Hãy tưởng tượng một tình huống mà ai đó thêm một chuỗi rỗng làm lời chào. Đó sẽ không phải là một lời chào nồng nhiệt, phải không?
Hãy đảm bảo rằng điều đó không xảy ra:

Chúng ta muốn sử dụng revert của solidity khi ai đó chuyển một chuỗi rỗng. Một điều tốt là chúng ta có thể dễ dàng kiểm tra chức năng này với trình so khớp chai của Waffle to.be.revertedWith().

1it("Nên hoàn lại khi chuyển một chuỗi rỗng", 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 "Lời chào không được để trống"
8 )
9})
Hiện tất cả

Có vẻ như bài kiểm tra mới của chúng ta đã không thành công:

Triển khai Greeter với lời chào: Hello, world!
Thay đổi lời chào từ 'Hello, world!' thành 'Hola, mundo!'
✓ Nên trả về lời chào mới sau khi nó được thay đổi (1514ms)
Triển khai Greeter với lời chào: Hello, world!
Thay đổi lời chào từ 'Hello, world!' thành ''
1) Nên hoàn lại khi chuyển một chuỗi rỗng
1 thành công (2 giây)
1 thất bại
Hiện tất cả

Hãy triển khai chức năng này vào hợp đồng thông minh của chúng ta:

1require(bytes(_greeting).length > 0, "Lời chào không được để trống");

Bây giờ, hàm setGreeting của chúng ta trông như thế này:

1function setGreeting(string memory _greeting) public {
2require(bytes(_greeting).length > 0, "Lời chào không được để trống");
3console.log("Thay đổi lời chào từ '%s' thành '%s'", greeting, _greeting);
4greeting = _greeting;
5}

Hãy chạy lại các bài kiểm tra:

✓ Nên trả về lời chào mới sau khi nó được thay đổi (1467ms)
✓ Nên hoàn lại khi chuyển một chuỗi rỗng (276ms)
2 thành công (2 giây)

Xin chúc mừng! Bạn đã làm được :)

Kết luận

Chúng ta đã tạo một dự án đơn giản với Waffle, Hardhat và ethers.js. Chúng ta đã học cách thiết lập một dự án, thêm một bài kiểm tra và triển khai chức năng mới.

Để biết thêm các trình so khớp chai tuyệt vời để kiểm tra các hợp đồng thông minh của bạn, hãy xem tài liệu chính thức của Waffleopens in a new tab.

Lần cập nhật trang lần cuối: 8 tháng 12, 2023

Hướng dẫn này có hữu ích không?