WaffleでHardhatとethersを使って「Hello world!」と出力するチュートリアル
このWaffle(opens in a new tab)チュートリアルでは、Hardhat(opens in a new tab)とethers.js(opens in a new tab)を使用して、「Hello world」と表示するシンプルなスマートコントラクトのプロジェクトを作成する方法を学びます。 さらに、Waffle上で作成したスマートコントラクトに新たな機能を追加し、テストする方法を学びます。
まずはじめに新しいプロジェクトを作成しましょう。
yarn init
あるいは、
npm init
必要なパッケージをインストールします:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
以下を実行してもよいです:
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
次に、npx hardhat
を実行して、サンプルの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👷 Welcome to Hardhat v2.0.3 👷? What do you want to do? …❯ Create a sample projectCreate an empty hardhat.config.jsQuitすべて表示
Create a sample project
を選択します。
プロジェクトの構造は、以下のようになっているはずです:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributes10├── .gitignore11├── hardhat.config.js12└── package.jsonすべて表示
次に、これらのファイルのいくつかを説明します。
- Greeter.solは、このチュートリアルで使用する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}すべて表示コピー
このスマートコントラクトは、以下の3つの要素に分解できます:
- コンストラクタ:
greeting
という名前の文字列型の変数を宣言する場所です。 - greet関数:
greeting
を返す関数です。 - setGreeting関数:
greeting
の値を変更する関数です。
- sample-test.js:テストを実行するファイルです。
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})すべて表示コピー
次に、コントラクトをコンパイルし、テストを実行します。
Waffleでは、Mocha(テスト用フレームワーク)およびChai(アサーションライブラリ)を使ってテストを実行します。 npx hardhat test
を実行して、以下のメッセージが表示されるまで待つだけです。
✓ Should return the new greeting once it's changed
今のところ順調ですので、プロジェクトにもう少し機能を付け加えてみましょう
他のユーザーが、挨拶の代わりに空の文字列を追加したと想定してみましょう。 無言の挨拶は嬉しくありませんね!
ですから、このようなことが起こらないようにします:
空の文字列が渡された場合に、Solidityのrevert
機能を利用できるようにします。 この機能は、Waffleのchaiマッチャーであるto.be.revertedWith()
で簡単にテストできます。
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})すべて表示コピー
このテストには、合格しなかったようです。
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 failingすべて表示
さっそくこの機能を、先ほど作成したスマートコントラクトに追加しましょう:
1require(bytes(_greeting).length > 0, "Greeting should not be empty");コピー
これにより、setGreeting関数は以下のようになっているはずです:
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}コピー
もう一度、テストを実行してみましょう:
✓ Should return the new greeting once it's changed (1467ms)✓ Should revert when passing an empty string (276ms)2 passing (2s)
おめでとうございます! テストが完成しました :)
まとめ
Waffle、Hardhat、およびethers.jsを使った簡単なプロジェクトを作成しました。 このチュートリアルでは、プロジェクトを開始し、テストを追加し、さらに新たな機能を実装する方法について学びました。
スマートコントラクトのテストに大活躍するChaiマッチャーについてさらに知りたい場合は、Waffleの公式文書(opens in a new tab)を参照してください。
最終編集者: @pettinarip(opens in a new tab), 2023年12月8日