1. HOME
  2. ブログ
  3. IT技術
  4. 【中編】Ethereum Pet Shop DAppの作成とテスト~コントラクト作成編~

【中編】Ethereum Pet Shop DAppの作成とテスト~コントラクト作成編~

~中編~Ethereum Pet ShopでDApp作成とテスト

今回は、前回に引き続き、「Ethereum Pet Shopを使って DAppの作成からテスト」までを行ってみたいと思います!

前編では、環境構築を行っていきましたが、今回からは実際にコントラクトを作成していきたいと思います!

作成工程

  1. 環境設定
  2. Truffle Box を使って Truffle プロジェクトを作成
  3. コントラクト作成
  4. コントラクトをコンパイルしてデプロイ
  5. コントラクトのテスト
  6. UI 作成
  7. ブラウザ上の DApp でログインする

関連記事

コントラクトの作成

それでは、実際にコントラクトを作成していきましょう!

contract フォルダー内にファイルを作成

Solidity のソースファイルである contract フォルダー内に、「Adoption.sol」ファイルを作成します。

そして、以下のコードを記入していきます。

コード解説

PetShop のコントラクト作成は、web3 と連携するため、以下のような仕様になります。

  1. function で public の adopters 変数と petID (引数)を設定
  2. 引き渡しは address 型(戻り値を修正しない view で宣言)
  3. MetaMask と Ganache に設定したアドレスで開く

コントラクトのコンパイルとデプロイ

EVM の実行のため、コントラクトをコンパイルしてバイトコードに変換します。

DApp が含まれているディレクトリーで、ターミナルに以下のコマンドを入力します。

マイグレーションファイルの作成

マイグレーションファイルが、コントラクトを EVM へデプロイしてくれます。

migration フォルダーの中に、「1_initial_migration.js」ファイルがあります。

これが「migration.sol」の操作ファイルで、コントラクトが二重にコンパイルされるのを防ぎます。

「2_deploy_contract.js」ファイルを作成

migration フォルダーに、「2_deploy_contract.js」というファイルを作成します。

そして、以下のコードを書き込みます。

コントラクトのデプロイ

ターミナルで以下のコマンドを入力し、デプロイします。

コントラクトのテスト

それでは、コントラクトをテストしてみましょう!

Ganache アカウントの作成

Ganache の workspace に「truffle-config.js」をアップロードします。

Gas の設定

アカウント作成後は、全ての Blockchain に、テスト用として100Ether ずつ入っています。

この Ether は、デプロイする度に Gas(送金料)が消費されます。

Gas と RPC Server の設定は、以下のようになります。

コントラクトのテスト

PetShop 解凍時に、空のテスト用フォルダーが生成されています。

このフォルダーの中に「TestAdoption.sol」を作成し、以下のコードを記入します。

最初にインポートしている3つのファイルの内、「Assert.sol」と「DeployedAddresses.sol」はグローバルのTruffleファイルなので、プロジェクトフォルダーの中には有りません

この2つのファイルの役割は、以下のようになります。

Assert.sol

テスト時の確認作業を行います。

テストから成功/失敗を返すために、「同等(EQ)」「不等(NE)」などをチェックします。

DeployedAddresses.sol

テストを実行すると、デプロイされたコントラクトのアドレスを取得します。

関数設定

このコードには、以下の3つの wide variables (変数)が含まれています。

  1. DeployedAddresses
  2. expectedPetID
  3. expectedAdopter

uint型「expectedPetID」の引数8の戻り値が、address型「expectedAdopter」に返されます。

adopt()関数のコード修正

テストのため、adopt()関数のコードを修正します。

仕様は以下のようになります。

  1. expectedPetID を事前に宣言
  2. テストが成功したら、Assert.equal()に ID を返す
  3. 失敗したら、コンソールに「Adoption of the expected pet should match what is returned.」を表示

「TestAdoption.sol」コントラクトの「Adoption」変数の後に、以下のコードを追加してください。

単一ペットオーナー受け入れ確認テスト

まず、単一ペットオーナー受け入れ確認テストをします。

public 変数は、自動ゲッターメソッドなので、上記の Adoption Test で格納したアドレスをそのまま取得できます。

また、保存されたデータはテスト中は存続するため、expectedPetID の値は他のテストでも取得可能です。

TestAdoption.sol をコード修正

「TestAdoption.sol」コントラクトを、以下のコードに修正します。

全てのペットオーナーの受け入れ確認テスト

続いて、すべてのペットオーナーの受け入れ確認テストをします。

配列は、単一キーを指定すると単一の値しか返せません。

そのため、配列全体に対して独自のゲッターを作成しましょう。

TestAdoption.sol をコード修正

以下のコードを「TestAdoption.sol」に追加し、修正します。

メモリー属性に注意!

ここで、「adopter 変数のメモリー属性」に注意してください。

メモリー属性は、値をコントラクトのストレージに保存するのではなく、メモリーに一時保存するよう Solidity に指示します。

adopter 変数は配列であり、最初の adoption test から、「expectedPetID」が存続しています。

そのため、「testGetAdopterAddressByPetIdInArray()」関数で、配列内の「expectedPetID」と「expectedAdopter」の戻り値を比較して検索します。

テストを実行

以下のコードを、ターミナルで入力します。

テスト終了後の画面

以上で、ローカルのブロックチェーンにコントラクトを作成・展開し、コンソールで操作できるようになりました!

おすすめの本

マスタリング・イーサリアム ―スマートコントラクトとDAppの構築
マスタリング・イーサリアム ―スマートコントラクトとDAppの構築

 

後編へ続く

後編では、UI を作成していきたいと思います!

お楽しみに!

前編

中編

後編

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

関連記事