【Solidity】第4章第5回:構造体(struct)の定義と利用

本記事では、Solidityにおける構造体(struct)の基本的な定義方法や利用法について解説します。構造体を使用することで、複数のデータを一つのエンティティとして効率的に管理できます。
0. 記事の概要
この記事を読むメリット
- 構造体の基礎理解:構造体の定義と使用方法を学べます。
- データ管理力の向上:複雑なデータ構造を効率的に管理する技術を習得できます。
- 実践力の向上:構造体を使った実践的なコントラクト設計を学びます。
この記事で学べること
- 構造体の基本的な定義方法
- 構造体を利用したデータ管理の実例
- 構造体の活用時の注意点
1. 構造体(struct)の基本
1.1 構造体の概要
構造体(struct)は、異なる型のデータを一つのエンティティとしてまとめるために使用されるデータ構造です。構造体を使用することで、複雑なデータを効率よく管理できます。
1.2 構造体の基本構文
// 構造体の基本例
contract StructExample {
struct User {
string name;
uint256 age;
bool isActive;
}
User public user;
function createUser(string memory _name, uint256 _age) public {
user = User(_name, _age, true);
}
}
動作解説
このコードでは、User
構造体を定義し、createUser
関数でインスタンスを作成しています。
2. 構造体を利用したデータ管理

2.1 構造体を配列で管理する
// 構造体配列の例
contract StructArrayExample {
struct Product {
string name;
uint256 price;
}
Product[] public products;
function addProduct(string memory _name, uint256 _price) public {
products.push(Product(_name, _price));
}
}
動作解説
Product
構造体を配列で管理し、addProduct
関数で新しい商品を追加します。
2.2 マッピングで管理する
// 構造体マッピングの例
contract StructMappingExample {
struct Student {
string name;
uint256 grade;
}
mapping(address => Student) public students;
function addStudent(address _address, string memory _name, uint256 _grade) public {
students[_address] = Student(_name, _grade);
}
}
動作解説
この例では、Student
構造体をマッピングで管理し、アドレスごとに学生情報を保存しています。
3. 構造体の応用例

3.1 イベントのログ記録
// イベントログの例
contract EventLogExample {
struct Event {
string title;
uint256 date;
}
Event[] public events;
function logEvent(string memory _title, uint256 _date) public {
events.push(Event(_title, _date));
}
}
動作解説
この例では、Event
構造体を使用してイベント情報を保存します。
4. よくあるエラーとその解決策
4.1 未初期化データの使用
構造体のフィールドを初期化せずに使用すると、デフォルト値が返される可能性があります。すべてのフィールドを明示的に初期化するようにしましょう。
4.2 大規模データによるガスコスト増加
構造体内のフィールド数が多い場合、ガスコストが増加する可能性があります。フィールドを最適化し、必要最低限に留めることを検討してください。
5. 練習問題

以下の課題に挑戦してみましょう:
- 構造体を使用してタスク管理システムを作成し、タスクの追加と完了を管理する機能を実装してください。
- 構造体を利用して、商品の在庫を管理するスマートコントラクトを作成してください。
6. まとめ
本記事では、Solidityの構造体(struct)の基本的な定義と利用方法について学びました。構造体を使用することで、複雑なデータを効率的に管理するスマートコントラクトを構築できます。